Repository navigation
Releases
v2.7.1
2.7.1 (2026-11-04)
Bug Fixes
plugin/agentanalytics v0.1.0
The first release of the BigQuery Agent Analytics plugin for ADK Go. It logs every agent run to a BigQuery table, so you can query and dashboard agent behavior with SQL: invocations, model requests and responses, tool calls, state changes, agent transfers and human-in-the-loop requests.
The table schema, event type names and analytics views match adk-python's BigQuery Agent Analytics plugin, so Go and Python agents can write to the same table and be queried together.
Install
go get google.golang.org/adk/plugin/agentanalytics@v0.1.0Requires google.golang.org/adk/v2 v2.0.0 or later.
Quick start
analytics, err := agentanalytics.NewBigQueryAgentAnalyticsPlugin(ctx, "my-project", "agent_analytics", "agent_events")
if err != nil {
log.Fatal(err)
}
defer analytics.Close() // flushes queued rows to BigQuery
r, err := runner.New(runner.Config{
AppName: "my-app",
Agent: myAgent,
SessionService: session.InMemoryService(),
PluginConfig: runner.PluginConfig{Plugins: []*plugin.Plugin{analytics}},
})Call Close before the process exits, so that rows still in the queue are written.
What's included
- Ready to query out of the box. The plugin creates the events table if it is missing, adds new columns to an existing table, and creates 25 per-event views such as
v_llm_requestandv_tool_completed. - Batched, non-blocking writes through the BigQuery Storage Write API, 100 rows or 1 second per batch by default. Batches over 8 MiB are split so that a single large batch is not rejected as a whole.
- Redaction on by default. Values under keys like
api_key,passwordandtoken, credentials in URLs, andAuthorization,BearerandBasiccredentials are replaced with[REDACTED]. Text values longer than 512,000 characters are truncated unlessCaptureFullMessageContentis set. - Control over what is logged: event allow and deny lists, a payload column deny list, a
ContentFormatterhook to transform or redact payloads before they are written, custom tags, and an allow list forCustomMetadatakeys. - Cloud Storage offload (optional). Set
GCSBucketNameto store large text and binary parts in a bucket and keep a reference in the row. - Exactly-once delivery (optional).
ExactlyOnceDeliverywrites through a committed stream with explicit offsets, so retries do not write rows twice. - Drop counters.
DropStatsreports rows lost to a full queue, failed writes or shutdown. - OpenTelemetry correlation (optional).
EnableOTelCorrelationadds the current trace and span IDs to each row.
See the package documentation for every option.
Before you use it
- This is a pre-1.0 release. The exported API may still change before v1.0.0, including helpers such as
BatchProcessor,FormatContentParts,SmartTruncateandArrowSchema. The path to v1.0.0 is tracked in #2014. - Register it before plugins that replace results. ADK stops at the first plugin callback that returns a replacement event, model response or tool result, so the analytics plugin does not see what an earlier plugin replaced.
- Known differences from adk-python are listed in #2046 and #2047. For example, when a callback recovers a failed tool call, Go logs
TOOL_ERRORfollowed byTOOL_COMPLETED, while Python logs onlyTOOL_ERROR.
v2.7.0
Highlights
v2.7.0 adds Anthropic Claude as a first-party model, search-gated tool discovery for large tool catalogs, an experimental classifier API for workflow routing, and a per-invocation budget on model calls. It also switches telemetry to the OpenTelemetry GenAI semantic conventions by default, which is a breaking change for anyone consuming ADK traces.
- Anthropic Claude models (experimental):
model/anthropicmodelimplementsmodel.LLMover the Anthropic Messages API and Vertex AI, with streaming, tool calling, image and PDF input, extended and adaptive thinking, structured output and prompt caching. Seeexamples/anthropic. (#1866) - Search-gated tool discovery:
tool/toolsearchwraps anytool.Toolsetso the model starts with asearch_toolstool plus a configured core set, and the tools it finds are declared from the next model step on. This keeps a large MCP catalog out of every request. Seeexamples/toolsearch. (#1734, #1735) - Classifiers (experimental):
exp/classifierdefines aClassifierthat answers typed Choice, Binary and Score questions with probabilities. It ships with a client for TypeSafe's Jev decision models (exp/classifier/typesafe), anLLMClassifierbacked by anymodel.LLM, and a workflowNodethat routes on the answer, matching adk-python'sClassifierNode. (#2003, #2005, #2035) - Model-call budget:
RunConfig.MaxLLMCallsbounds the model calls one invocation may make, 500 by default, and ends the run withagent.ErrLLMCallsLimitExceededwhen the budget is spent. Matches adk-python'smax_llm_calls. This changes behavior for existing users, see below. (#1412) - Telemetry: traces follow OpenTelemetry GenAI semantic conventions v2 by default, as adk-python does. This is breaking for telemetry consumers, see below. (#1635)
- OpenAI-compatible models: images and files in
InlineDataandFileDataparts are sent on both the Responses and Chat Completions endpoints (#1543). A response schema title that is not a valid format name falls back toadk_responseinstead of a 400 from the API (#1912). AGenerateContentConfigfield that a newer genai adds is refused withErrUnsupportedConfigFieldinstead of being dropped silently (#1922). - Gemini built-in tools:
geminitool.GoogleMaps,geminitool.UrlContextandgeminitool.EnterpriseWebSearch. (#2026) - MCP: with
Config.Authset, each user gets their own MCP session, so servers that bind a session to the user who opened it stop answering other users with 403 (#1755). MCP HTTP requests identify ADK inUser-AgentandX-Goog-Api-Client, as model calls already do (#1862). - Auth fix: credentials from
auth.ADC()andauth.ServiceAccount()failed every token mint withcontext canceledon local gcloud ADC and impersonated service accounts. Services on GCE or with a key file were not affected. (#1904) - Tool auth groundwork:
tool/toolauthadds adk-python's auth data model and wire format foradk_request_credential, so requests, replies and credential keys agree with adk-python and ADK Web. Nothing uses it yet. (#2032) - Reliability:
- Workflow joins resume with completed predecessors restored instead of rerunning them. (#1572)
LoopAgentstops on context cancellation.WithAgentTimeoutandWithAgentCancelwork on tool and callback contexts instead of returning nil. (#1810, #1604)- Artifacts saved in agent and model callbacks are recorded in
ArtifactDelta.OutputKeyis saved when a before-agent callback short-circuits. (#1878, #1800, #1963) - Optional instruction placeholders such as
{key?}and{artifact.name?}surface infrastructure errors instead of rendering an empty string. This changes behavior, see below. (#1748) - Vertex AI sessions persist live transcriptions. In-memory memory search skips thought parts. (#1964, #1975)
- Streaming function tools preserve consumer panics.
agenttoolkeeps code-execution output in sub-agent results. Running an agent withoutRunreturns an error instead of doing nothing. (#1961, #1860, #1850) launcher.Config.TelemetryOptionshonorsWithOtelToCloud. Live reconnect matches close code 1008 by type, not by error text. (#1968, #1993)
- CLI:
adkgo deploy agentengine --mem_deployno longer defaults Memory Bank to gemini-2.5-flash, which Vertex AI stopped serving to new projects. Memory Bank applies its own default model unless--mem_modelis set. (#1902) - Agent Analytics plugin (
plugin/agentanalytics, its own module and tag): aligned with adk-python's schema and event vocabulary, with rich session, HITL, A2A and workflow events, GCS offloading of multimodal content, opt-in exactly-once delivery, drop statistics, hierarchical span ids with latency and time-to-first-token, and 25 pre-built per-event BigQuery views. (#1786, #1787, #1788, #1789, #1790, #1791 and follow-up fixes)
Breaking changes
- Telemetry schema: ADK now emits the OpenTelemetry GenAI semantic conventions v2. The legacy log events are replaced by one
gen_ai.client.inference.operation.detailsevent per model call, message content on spans is a structured value rather than a JSON string,execute_toolrecords arguments and results only when span content capture is on (undergen_ai.tool.call.*), and an LLM-agent root gets a newinvoke_workflowparent span. SetADK_TELEMETRY_SCHEMA_VERSION_OPT_IN=otel_semconv_1_36to restore the previous format, supported until at least March 31, 2027. (#1635) - Model calls are capped at 500 per invocation: a run that makes more than 500 model calls now ends with an error wrapping
agent.ErrLLMCallsLimitExceeded. Raise the cap withRunConfig.MaxLLMCallsorADK_MAX_LLM_CALLS, or setMaxLLMCallsto-1for no limit. Unlike adk-python,0means the default, not unlimited. (#1412) - Optional instruction placeholders propagate errors:
{key?}and{artifact.name?}render empty only when the key or artifact is missing (session.ErrStateKeyNotExist,fs.ErrNotExist). Any other error from the session or artifact service now fails the run. A customartifact.Servicemust wrapfs.ErrNotExistfor missing files, and anagenttoolsub-agent with an optional artifact placeholder now errors when the root runner has no artifact service. (#1748) - Go 1.26.10 is required:
go.modmoves from 1.26.6 to 1.26.10. (#1916) - Agent Analytics plugin defaults: the default table name is
agent_eventsinstead ofevents, existing tables are upgraded additively on startup unlessDisableSchemaUpgradeis set, the per-event views are created on startup unlessDisableCreateViewsis set, and granular event types (STATE_DELTA,AGENT_TRANSFER,HITL_*,NODE_OUTPUT, …) replace the genericEVENTrow. These apply when the plugin module is next tagged, not to the corev2.7.0tag. (#1786, #1788, #1791)
Smaller behavior changes:
geminitool.GoogleSearchreturns an error on a non-Gemini model, and on a Gemini 1.x model combined with other tools. (#2026)launcher: passingtelemetry.WithOtelToCloud(true)inTelemetryOptionsnow exports to Google Cloud and needs credentials at startup, where it used to start with export silently off. (#1968)openaimodel: a config field added by a genai release newer than v1.74.0 is refused withErrUnsupportedConfigField. Configs valid today are unaffected. (#1922)mcptoolsetwithConfig.Authopens one session per distinct credential, closes sessions idle for 10 minutes, and caps the pool at 64. WithoutAuthnothing changes. (#1755)LoopAgentyields the context error once and stops when its context is cancelled, where it used to keep looping if no pass yielded an event. (#1810)- An agent callback that saves an artifact and returns nil now yields one event carrying the
ArtifactDelta, where it yielded none. (#1878) - The in-memory memory service no longer stores or matches thought parts, and an event with only thought text is not stored. (#1975)
- Deprecated:
artifact.SaveRequest.Version.Savehas never read it. (#1985)
All changes
What's Changed
- feat(tool): add search-gated tool discovery by @wolo-lab in #1734
- docs(examples/toolsearch): add a tool search sample by @wolo-lab in #1735
- fix(agent): report an error when an agent without Run is run by @wolo-lab in #1850
- docs(artifact): fix service references in doc comments by @ktsoator in #1775
- feat(agentanalytics): align schema, event vocabulary, redaction, and core contract with adk-python by @haiyuan-eng-google in #1786
- fix(loopagent): stop on context cancellation by @anzal1 in #1810
- feat(runner): bound model calls per invocation with RunConfig.MaxLLMCalls by @venkat-uk in #1412
- fix(llminternal): prevent silent context degradation by propagating systemic state failures by @karthik-0306 in #1748
- test(model/gemini): pin the last citation and accepting AutomaticContinuation by @baptmont in #1825
- test(llminternal): match isResumable's doc and test table to the errors it sees by @harshitwandhare in #1750
- docs(loopagent): say the context is checked before each pass by @anzal1 in #1861
- refactor(workflow): remove redundant goroutine in scheduleRetry by @moodbased in #1849
- docs(compaction): list the GenerateContentConfig fields the summarizer uses by @karolpiotrowicz in #1828
- fix(agenttool): preserve code output in sub-agent results by @ktsoator in https:...
v1.9.0
What's Changed
- fix(session/database): backport state write fixes (#1551, #1743) by @wolo-lab in #1830
- fix(artifact): backport keeping session filenames out of shared listings (#1673, #1708, #1767) by @wolo-lab in #1831
- fix: backport session, artifact and memory fixes (#1575, #1729, #1565, #1756) by @wolo-lab in #1832
- fix: backport live runner fixes (#1547, #1603, #1795) by @wolo-lab in #1833
- docs: backport doc comment fixes (#1721, #1745, #1761) by @wolo-lab in #1835
- fix: backport agent and tool fixes (#1709, #1509, #1493, #1803) by @wolo-lab in #1836
- fix(llminternal): backport request assembly and streaming fixes (#1566, #785, #1719, #1804, #1802) by @wolo-lab in #1837
- fix(workflowagents): backport loop and sequential agent fixes (#1722, #1684, #1780) by @wolo-lab in #1838
- fix(model/gemini): backport preserving empty text on thought-signature parts (#1639) by @wolo-lab in #1839
- fix(mcptoolset): backport connection and session lifecycle fixes (#1687, #1713, #1717, #1779) by @wolo-lab in #1840
- fix(launcher): backport Host and Origin checks on every web launcher route (#1641, #1505) by @wolo-lab in #1841
- fix(adkrest): backport REST server fixes (#1686, #1724, #1648) by @wolo-lab in #1842
- chore(deps): bump google.golang.org/grpc to v1.83.2 by @wolo-lab in #1843
- chore(version): bump the tagged version constant to 1.9.0 by @wolo-lab in #1845
- test(llminternal): count fake live connections before the upgrade by @wolo-lab in #1847
- fix(runner): backport preserving BeforeRun plugin responses (#1598) by @wolo-lab in #1834
Full Changelog: v1.8.0...v1.9.0
v2.6.0
Highlights (released Oct 13)
- Gemini 4 Argon support: Gemini 4 models such as gemini-4-argon stop long answers at a per-request output limit. ADK now resumes these answers automatically, so they come back whole instead of cut off. The resuming is now done by the genai SDK (v1.74.0). (#1715, #1759, #1822)
- Auth: credentials are refreshed and the call retried once after a downstream 401/403. Remote A2A agents accept per-request auth through Config.Auth. (#1136, #1150)
- MCP: request-scoped metadata is passed on to MCP tool calls. Callers can close MCP sessions, waiting for a session respects context cancellation, and connection config is checked when the toolset is built. (#1429, #1713, #1717, #1687)
- Server hardening: every web launcher route checks Host and Origin. /run_live limits message size, dead peers and concurrent sessions. The Pub/Sub and Eventarc trigger endpoints can require a Google OIDC token, and MaxConcurrentRuns is now enforced. (#1641, #1648, #1737, #1720)
- New experimental endpoint: /apps/{app_name}/app-info. (#1404)
- Privacy fix: session-scoped artifact filenames no longer show up in shared listings, both in-memory and on GCS. (#1673, #1708)
- Reliability:
- Loop and sequential agents stop when a sub-agent fails. This changes behavior for existing users.
- Toolsets are re-evaluated on every step.
- Concurrency fixes in the session database, the in-memory session store and artifact saves.
- Vertex AI sessions now keep code-execution parts.
- (#1684, #785, #1743, #1575, #1756, #1729)
What's Changed
- fix(artifact): keep session filenames out of shared listings by @ktsoator in #1673
- test(workflow): enable TestRunNode_ErrInvalidRunNodeContext_OnStaticContext by @sushant-me in #1679
- fix(mcptoolset): validate connection configuration during construction by @ktsoator in #1687
- test(telemetry): replace hand-written telemetry expectations with record/replay goldens by @RKest in #1640
- fix(workflow): build route edges in a deterministic order by @wolo-lab in #1268
- fix(workflow): single-flight RunNode idempotency cache by @wolo-lab in #1043
- fix(skilltoolset): count skill metadata limits in runes by @Harbor404 in #1709
- fix(artifact): keep session filenames out of GCS shared listings by @ktsoator in #1708
- fix(launcher): check Host and Origin on every web launcher route by @jjsasha63 in #1641
- chore(deps): bump google.golang.org/genai from 1.71.0 to 1.72.0 by @baptmont in #1714
- feat(remoteagent): apply per-request auth to A2A via Config.Auth by @wolo-lab in #1150
- fix(utils): respect Nullable field on nil values during schema validation by @moritzwilhelm in #1566
- fix(examples): return an error for missing image data by @ktsoator in #1509
- test(compaction): actually run two writers at once by @baptmont in #1485
- fix(server): default a zero SSE write timeout to 120s by @Vivek1106-04 in #1686
- fix(llminternal): re-evaluate toolsets on every step in toolProcessor by @nuthalapativarun in #785
- docs(workflow): correct doc comments that describe fields and behaviour that do not exist by @sushant-me in #1711
- chore(deps): bump the go-minor-patch group with 5 updates by @dependabot[bot] in #1725
- fix(session/inmemory): holding sess.mu accross the eventCopy creation in AppendEvent by @dhakad22klx in #1575
- fix(runner): preserve buffered live events at stream end by @Ultronen in #1547
- fix(llmagent): clone Tools and Toolsets slices in constructor to prevent backing array aliasing by @somuai in #1493
- fix(session/database): surface JSON marshal errors on state writes by @Huang-404-Q in #1551
- fix(llminternal): classify a dropped live connection by type, not error text by @harshitwandhare in #1603
- fix(mcptoolset): allow callers to close MCP sessions by @ktsoator in #1713
- fix(llminternal): omit foreign thoughts from agent context by @jabrailkhalil in #1719
- fix(mcptoolset): honor context cancellation while waiting for sessions by @via2004 in #1717
- docs: fix stale method names in doc comments by @PratikDhanave in #1721
- fix(server/triggers): honor MaxConcurrentRuns in PubSubController by @PratikDhanave in #1720
- chore(lint): forbid process-wide logging in library code by @jjsasha63 in #1649
- fix(sequentialagent): serialize live completion tool injection by @jabrailkhalil in #1722
- fix(llminternal): leave ${var} and {var} placeholders literal by @Vivek1106-04 in #1682
- docs(memory): fix stale "string" wording on MemoryEntry.Timestamp by @PratikDhanave in #1745
- test(agentanalytics): cover the retry that opens a fresh stream by @Trainingcqy in #1527
- fix(vertexai): preserve ExecutableCode and CodeExecutionResult in session storage by @karthik-0306 in #1729
- test(examples): cover image precedence and empty results by @ktsoator in #1567
- fix(model/gemini): preserve empty text on thought-signature parts by @adilalperenciftci in #1639
- feat(mcptoolset): forward request-scoped metadata to MCP tool calls by @jjsasha63 in #1429
- fix(workflowagents): stop loop and sequential agents on sub-agent error by @Vivek1106-04 in #1684
- fix(adkrest): render nested workflow clusters in graph images by @leilei3167 in #1724
- fix(adkrest): bound /run_live messages, dead peers and concurrent sessions by @jjsasha63 in #1648
- test(vertexai): keep RPC replay independent of external network by @Ultronen in #1548
- fix(memory): normalize punctuation in in-memory search by @tejas5038 in #1565
- chore(lint): add misspell linter and perform US spelling sweep by @somuai in #1465
- test(llminternal): cover the nil RunConfig branch in callLLM by @baptmont in #1368
- fix(session/database): lock app and user state rows in AppendEvent by @Vivek1106-04 in #1743
- test(llmagent): drive tail retention end to end against a recorded model by @baptmont in #1438
- fix(runner): preserve BeforeRun plugin responses by @ktsoator in #1598
- fix(agent): synchronize concurrent artifact saves by @ktsoator in #1756
- docs(workflow): fix Run signature in NewRequestInputEvent example by @PratikDhanave in #1746
- refactor(agent): remove redundant Context method declarations by @moodbased in #1758
- docs(agent): clarify agent callback error behavior by @ktsoator in #1761
- chore(deps): bump the go-minor-patch group with 12 updates by @dependabot[bot] in #1798
- fix(llminternal): correct misleading "global" in appendInstructions error by @PratikDhanave in #1804
- fix(agenttool): wrap the runner.New error instead of discarding it by @PratikDhanave in #1803
- docs(telemetry): fix StartNodeSpan doc for invoke_workflow by @PratikDhanave in #1805
- fix(llminternal): guard nil first candidate in streaming aggregator by @PratikDhanave in #1802
- docs(mcptoolset): fix constructor example and schema comment by @ktsoator in #1779
- feat(exp): add the experimental /apps/{app_name}/app-info endpoint by @wojtas000 in #1404
- fix(loopagent): return when there are no sub-agents by @anzal1 in #1780
- chore(deps): bump google.golang.org/grpc from 1.83.1 to 1.83.2 in /plugin/agentanalytics in the go_modules group across 1 directory by @dependabot[bot] in #1814
- Align vertexai session service via ADK REST API with other impl by @kdroste-google in #1571
- fix: reject Cloud Run service name beginning with '-' by @herdiyana256 in #1505
- chore(version): bump the tagged version constant to 2.6.0 by @wolo-lab in #1817
- feat(auth): refresh and retry once on a downstream 401/403 by @wolo-lab in #1136
- docs(artifact): clarify missing-version deletion behavior by @ktsoator in #1767
- fix(r...
v1.8.0
What's Changed
- fix: backport request contents assembly fixes (#1564, #1669) by @wolo-lab in #1696
- fix(launcher): backport web launcher fixes (#1533, #1470, #1536) by @wolo-lab in #1702
- fix: backport tool fixes (#1596, #1586, #1573, #1574) by @wolo-lab in #1693
- fix: backport database session transcription persistence (#1662, #1670) by @wolo-lab in #1690
- chore(version): bump the tagged version constant to 1.8.0 by @wolo-lab in #1705
- fix(agenttool): backport sharing artifacts with parent agents (#1654) by @wolo-lab in #1698
- fix(remoteagent): backport rendering unmatched function responses as text (#1494) by @wolo-lab in #1697
- fix: backport model response and streaming robustness fixes (#1556, #1630, #630) by @wolo-lab in #1692
- fix(sequentialagent): backport recursive task_completed injection (#1510) by @wolo-lab in #1691
- fix(llminternal): backport bounding of RunLive's reconnect loop (#1621) by @wolo-lab in #1694
- fix: backport Agent Engine deploy and encoding fixes (#1590, #1387) by @wolo-lab in #1700
- fix: backport session temp: key stripping fixes (#1356, #1514, #1674) by @wolo-lab in #1695
- fix(telemetry): backport token count and finish reason fixes (#1525, #1474, #1657) by @wolo-lab in #1701
- fix: backport adk web exposure hardening (#1456, #1615, #1623, #1638) by @wolo-lab in #1704
- fix(adkrest): backport REST server hardening fixes (#1629, #1664, #1457, #1534) by @wolo-lab in #1703
Full Changelog: v1.7.0...v1.8.0
v2.5.0
What's Changed
- fix(internal/utils): skip nil Parts in the Parts accessors by @dhakad22klx in #1556
- fix(sequentialagent): recurse task_completed injection and rebind Agent in Run and RunLive by @somuai in #1510
- fix(remoteagent): respect isolation scope by @Soundcreates in #1259
- fix(remoteagent): render unmatched function responses as text by @leilei3167 in #1494
- test(session): add concurrent regression test for State.All() by @nuthalapativarun in #725
- fix(telemetry): include tool-use prompt tokens in input_tokens by @peterkarabinovic in #1525
- chore(deps): bump the go-minor-patch group with 6 updates by @dependabot[bot] in #1592
- fix(session/inmemory): strip temp: keys from the canonical event record by @jordigilh in #1356
- fix(launcher/api): serve run_live through the API mount again by @jjsasha63 in #1533
- fix(session/vertexai): strip temp: keys before AppendEvent persist by @leilei3167 in #1514
- fix(model/openaimodel): pin function tools to non-strict validation by @hanorik in #1389
- fix(cmd/launcher/web): defer telemetry shutdown and adjust startup logging (#1469) by @chill-czar in #1470
- fix(model/openaimodel): source the streamed function name from output_item.added by @dependabot[bot] in #1616
- fix(adkrest): refuse DNS-rebinding hosts and cross-origin browsers by @jjsasha63 in #1615
- fix(web): bind web server to loopback by default by @AARUSHGAUR in #1456
- fix: map response finish reasons to semantic conventions by @mikemikimike in #1474
- fix(model/openaimodel): give property-less objects the strict-schema keys by @wojtas000 in #1614
- fix(launcher): declare the web bind address to the REST server by @jjsasha63 in #1623
- fix(llminternal): bound RunLive's reconnect loop by @jjsasha63 in #1621
- fix(tool): apply WithConfirmation to streaming tools by @jjsasha63 in #1596
- fix(adkgo/deploy): use a long timeout for Agent Engine op.Wait by @nuthalapativarun in #1590
- fix(functiontool): wrap non-map results only when they can be marshaled by @Trainingcqy in #1586
- fix(agent): keep the invocation when WithICDelta returns nil by @wolo-lab in #1521
- ci: require a linked issue, and document stale pull request takeover by @jjsasha63 in #1593
- fix(model/openaimodel): stop replaying prior-turn reasoning to the API by @hanorik in #1395
- feat(agent): recover the invocation identity from a plain context by @wolo-lab in #1522
- fix(exampletool): skip example injection when the invocation has no user content by @rishabhsai in #1573
- fix(workflow): stop yielding after consumer exits by @cruvie in #1550
- fix(adkrest): declare UTF-8 charset on the SSE content type by @baptmont in #1629
- test(launcher/web): bind the exact server address in bind-failure tests by @Vivek1106-04 in #1638
- feat(authn): add a Google OIDC authenticator by @herdiyana256 in #1636
- test(authn): pin the audience a Google OIDC authenticator enforces by @wolo-lab in #1646
- fix(loadartifactstool): stop double-wrapping the artifact load error by @rishabhsai in #1574
- fix(llminternal): build arrays when assembling streamed function call arguments by @ashrodan in #1630
- feat(auth/gcp): add GCP credential provider by @wolo-lab in #1173
- chore(deps): bump the go-minor-patch group with 4 updates by @dependabot[bot] in #1653
- fix(launcher): pin the webui-before-api order, and clarify the adk-web pin by @jjsasha63 in #1536
- fix(adkrest): gate the agent graph routes behind IncludeDebugAPI by @jjsasha63 in #1534
- fix: skip nil responses in generateContent by @koriyoshi2041 in #630
- fix(adkrest,web): limit request body size to mitigate memory-exhaustion DoS by @AARUSHGAUR in #1457
- feat(auth): add CredentialStore and cache GCP credentials by @wolo-lab in #1174
- fix: preserve orphan response content during rearrangement by @ktsoator in #1564
- test(auth): make arm() force a sweep on a coarse clock by @harshitwandhare in #1668
- fix(llminternal): drop unanswered function calls from request contents by @QuentinBisson in #1669
- docs(session/database): document that AutoMigrate must run on every startup by @wolo-lab in #1670
- fix(agenttool): share artifacts with parent agents by @ktsoator in #1654
- refactor(llmagent): give State.IncludeContents an internal type by @jjsasha63 in #1462
- fix(auth/gcp): pin the default builder's context, and correct its comments by @wolo-lab in #1647
- fix(adkrest): limit /run_live WebSocket message size by @prasanna8585 in #1664
- feat(artifact): guarantee artifact version metadata by @yiaany in #1440
- docs(session): clarify that state prefixes do not compose by @indurireddy-TF in #1674
- fix(session/database): persist input and output transcriptions by @Vivek1106-04 in #1662
- feat(openaimodel): support the Chat Completions API by @wojtas000 in #1642
- refactor(openaimodel): split Chat Completions and Responses endpoints into sub-packages by @wojtas000 in #1643
- test: keep model registry and llminternal logging tests repeatable by @Vivek1106-04 in #1657
- chore(version): bump the tagged version constant to 2.5.0 by @wolo-lab in #1677
- fix(agentengine): base64-encode []byte fields instead of failing thei… by @rizukijr in #1387
- feat: Add daily time partitioning to BigQuery event logging table by @vasilyl in #1377
Breaking changes
- Session tables gain two columns (#1662):
session/databasenow stores live-audio input and output transcriptions, in two new nullable columns on theeventstable.DatabaseSessionServicenever creates or alters tables on its own, so calldatabase.AutoMigrateon every startup. A database that is not migrated fails to write events once this release is deployed. If you manage the schema by hand, addinput_transcriptionandoutput_transcriptionbefore you deploy. See Sessions: DatabaseSessionService. adk weblistens on loopback by default (#1456): the web launcher binds127.0.0.1instead of every interface. Pass-host 0.0.0.0to restore the old behavior. You need that flag inside a container and whenever another machine must reach the server. Dockerfiles generated byadkgo deployalready pass it. A Dockerfile you wrote yourself needs it added.- Cross-origin browser requests are refused (#1615, #1623): the REST server and the
/run_liveWebSocket now answer 403 to a browser whoseOriginis neither the server's own nor the one given in-webui_address. On a loopback bind they also answer 403 to a request whoseHostis not a loopback name, which blocks DNS-rebinding attacks. Non-browser clients and same-origin pages are unaffected. If you serve the UI from another origin, set-webui_addressto it. If you embedadkrest.NewServerbehind a reverse proxy on the same machine, add the proxy's origin to the newServerConfig.AllowedOrigins.'*'turns the checks off. - Request size limits (#1457, #1664): the REST server and every route behind the web launcher, including the Pub/Sub and Eventarc triggers, reject request bodies over 10 MiB with HTTP 400. Raise the limit with
-max_request_body_size,launcher.Config.MaxPayloadSizeoradkrest.ServerConfig.MaxPayloadSize./run_livecloses the connection on any single WebSocket message over 16 MiB. That limit is not configurable. - Agent graph routes require the debug API (#1534):
build_graphandbuild_graph_imagereturn the agent tree and every tool it can call, so they are now registered only whenIncludeDebugAPI...
v1.7.0
What's Changed
- fix(sequentialagent): correct New godoc placement and copy-pasted error string (#1151) by @baptmont in #1531
- fix: backport security hardening fixes (#1418, #1240) by @wolo-lab in #1576
- fix: backport session fixes (#1559, #1458) by @wolo-lab in #1577
- fix: backport base flow and content assembly fixes (#638, #908, #766, #1428) by @wolo-lab in #1578
- fix: backport MCP toolset result handling fixes (#1353, #1473, #1401) by @wolo-lab in #1579
- fix: backport runner and agent lifecycle fixes (#1061, #1206, #1479) by @wolo-lab in #1580
- fix: backport web launcher fixes (#1351, #1460) by @wolo-lab in #1581
- fix: backport artifact and memory fixes (#1528, #1563) by @wolo-lab in #1582
- fix(examples): validate generated image responses (#1478) by @wolo-lab in #1583
- fix: backport ADK web UI endpoint fixes (#1274, #1335, #1459) by @wolo-lab in #1584
- chore(version): bump the tagged version constant to 1.7.0 by @wolo-lab in #1587
Full Changelog: v1.6.1...v1.7.0
v2.4.0
What's Changed
- fix: pin a fetched agent card's interface URL(s) to the origin it was fetched from by @prasanna8585 in #1418
- feat(session/database): add NewSessionServiceFromDB constructor by @nuthalapativarun in #724
- fix(openaimodel): support optional function call output IDs by @ktsoator in #1449
- fix(workflow): normalize unordered set keywords in schema comparison by @winklemad in #1138
- fix: prevent saving non-text events to state by @tanghaowillow in #1061
- fix: resolve 'TODO: last event is not final' error in streaming mode … by @mahendrarathore1742 in #638
- chore(deps): bump google.golang.org/grpc from 1.82.1 to 1.83.1 in /plugin/agentanalytics in the go_modules group across 1 directory by @dependabot[bot] in #1468
- ci: Release automation with release-please by @wojtas000 in #1398
- fix(remoteagent/v2): run after-callbacks on aggregated artifact events by @PratikDhanave in #1206
- docs(agent): explain why runAfterAgentCallbacks does not end the invocation by @jjsasha63 in #1461
- fix(mcptoolset): allow valid empty text tool responses (#1352) by @chill-czar in #1353
- fix(cmd/launcher/web): initialize telemetry before starting HTTP server (#1350) by @chill-czar in #1351
- fix(workflow): make ParallelWorker fail-fast actually stop new dispatch under maxConcurrency by @AmirF194 in #1239
- fix(openaimodel): preserve caller-owned JSON schemas by @ktsoator in #1451
- fix(mcptoolset): report non-text-only tool results instead of dropping them by @jjsasha63 in #1473
- fix: agenttool SkipSummarization terminates parent agent loop by @rsd-darshan in #908
- ci: run the Go workflow on every pull request by @wolo-lab in #1445
- fix(session): report a missing session as session.ErrNotFound by @jjsasha63 in #1458
- fix(adkrest): serve the endpoints the ADK web UI actually calls by @jjsasha63 in #1459
- fix(launcher/web): default the artifact and memory services, and serve the UI correctly by @jjsasha63 in #1460
- ci: ask for a linked issue or a description on new PRs by @jjsasha63 in #1480
- ci: automate v1 backports from the v1-needed label by @baptmont in #1327
- docs: ask the two PR-template questions that catch the most defects by @karolpiotrowicz in #1506
- docs(examples): update launcher documentation by @ktsoator in #1496
- fix(runner): stop nil event loops after cancellation by @wmh123wmh1 in #1479
- fix(llmagent): resolve agent mode per placement instead of mutating the shared agent by @wolo-lab in #1267
- fix(workflow): suppress retries while draining by @cruvie in #1512
- chore(deps): bump the go-minor-patch group with 12 updates by @dependabot[bot] in #1517
- fix(auth): keep the consent URI out of ConsentRequiredError's message by @wolo-lab in #1519
- fix(openaimodel): preserve refusals and completed stream content by @ktsoator in #1467
- docs: state the pre-PR checks that reviews keep catching by @karolpiotrowicz in #1492
- fix(memory): rank and limit search results with non-ASCII substring matching by @ktsoator in #1528
- fix(model/openaimodel): correct finish reason, logprobs and tool calls when a stream ends by @hanorik in #1373
- fix(backport): stop re-posting the conflict comment on every run by @baptmont in #1530
- fix(mcptoolset): render non-text unstructured tool results by @ktsoator in #1401
- fix: ignore stale function responses by @gustafvh in #766
- fix(model/openaimodel): surface server-side response failures by @hanorik in #1359
- fix(model/openaimodel): account for every generation config field by @hanorik in #1392
- docs: fix contributing links in PR template by @keeltrace in #1545
- fix: validate deploy CLI values embedded in generated Dockerfile content by @herdiyana256 in #1240
- docs: add a self-review gate and the conventions reviews keep repeating by @wolo-lab in #1558
- fix(session): snapshot events under read lock in database and vertexa… by @lucky798213 in #1559
- fix(examples): validate generated image responses by @ktsoator in #1478
- fix(auth/gcp): keep caller identifiers out of service error text by @wolo-lab in #1520
- feat(adkrest): add authentication and authorization to the REST API by @kdroste-google in #1561
- fix(llminternal): keep a late tool completion as the final content by @jjsasha63 in #1428
- test(adkrest/models): add EventActions field mapping coverage by @nuthalapativarun in #726
- test(adkrest): add RunLiveHandler WebSocket integration coverage by @wmh123wmh1 in #1453
- fix(agentanalytics): drain the aborted write stream to recover the append status by @Trainingcqy in #1318
- fix(artifact/gcsartifact): return the gs:// form as CanonicalURI by @baptmont in #1563
- cleanup: update Loader documentation and add interface checks by @hyangah in #651
- chore(version): bump the tagged version constant to 2.4.0 by @wolo-lab in #1570
New Contributors
- @tanghaowillow made their first contribution in #1061
- @mahendrarathore1742 made their first contribution in #638
- @AmirF194 made their first contribution in #1239
- @rsd-darshan made their first contribution in #908
- @wmh123wmh1 made their first contribution in #1479
- @cruvie made their first contribution in #1512
- @keeltrace made their first contribution in #1545
- @herdiyana256 made their first contribution in #1240
- @lucky798213 made their first contribution in #1559
Full Changelog: v2.3.0...v2.4.0
v1.6.1
What's Changed
- fix(configurable): config loader panics on non-string args (v1 backport) by @wojtas000 in #1341
- fix(internal): match the copyright skip list against slash-separated paths (#1394) by @harshitwandhare in #1488
- chore(version): bump the tagged version constant to 1.6.1 by @wolo-lab in #1489
- fix: backport base flow nil-deref and artifact delta fixes (#1336, #474) by @wolo-lab in #1500
- fix: backport tool result and content fixes (#696, #1349, #1367) by @wolo-lab in #1503
- fix: backport A2A peer metadata trust fix (#1226) by @wolo-lab in #1498
- fix: backport tool-confirmation trust fixes (#1357, #1369) by @wolo-lab in #1499
- fix: backport artifact handling fixes (#1390, #1320, #1375) by @wolo-lab in #1501
- fix: backport session service fixes (#1322, #1204, #1237, #1171) by @wolo-lab in #1502
- fix: backport runner and REST server fixes (#1417, #1307) by @wolo-lab in #1504
- fix(remoteagent): reject card sources that are neither http(s) URLs nor paths (#1328) by @github-actions[bot] in #1486
New Contributors
- @github-actions[bot] made their first contribution in #1486
Full Changelog: v1.6.0...v1.6.1