Releases: polyai/adk
v0.26.0
v0.26.0 (2026-06-19)
This release is published under the Apache-2.0 License.
Documentation
Summary
Motivation
Closes #
Changes
Test strategy
- Added/updated unit tests - [ ] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [x] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [ ]pytestpasses - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [ ] Commit messages follow conventional commits
Screenshots / Logs
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Features
Summary
Adds the X-Poly-Source: adk header to all outbound API requests so the platform can identify traffic originating from the ADK CLI.
Motivation
Enables the platform team to distinguish ADK-originated requests from other API consumers for analytics, debugging, and rate-limiting purposes.
Changes
- Added
X-Poly-Source: adkheader toPlatformAPIHandler.make_request(API-key auth path) - AddedX-Poly-Source: adkheader to JWT-authenticated endpoints (push_resource,push_function,publish_agent) - AddedX-Poly-Source: adkheader toget_conversation_logs- AddedX-Poly-Source: adkheader toSourcererSDKrequest headers
Test strategy
- Added/updated unit tests - [ ] Manual CLI testing (
poly <command>) - [x] Tested against a live Agent Studio project - [ ] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [x]pytestpasses - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [x] Commit messages follow conventional commits
Detailed Changes: v0.25.11...v0.26.0
v0.25.11
v0.25.11 (2026-06-19)
This release is published under the Apache-2.0 License.
Bug Fixes
Summary
Eliminates phantom |- → | diffs that persist after ad push by stripping whitespace from all string values at the YamlResource base class level, matching the platform's Zod .trim() behavior.
Motivation
After pushing, ad diff shows spurious changes like content: |- → content: | because the platform trims all string fields but local YAML files can retain trailing newlines. This causes false is_modified() hash mismatches and confusing diff output.
Changes
- Add
_strip_strings()recursive helper inresource.pyand wire it intoYamlResource.raw,compute_hash, andto_pretty- Remove redundant per-resource.strip()calls fromto_yaml_dictinflows.pyandvariant_attributes.py
Test strategy
- Added/updated unit tests - [x] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [x]pytestpasses - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [x] Commit messages follow conventional commits
🤖 Generated with Claude Code
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Detailed Changes: v0.25.10...v0.25.11
v0.25.10
v0.25.10 (2026-06-17)
This release is published under the Apache-2.0 License.
Bug Fixes
Summary
- Replace backward-pointing "Related" / "Next steps" card links with forward-pointing ones across 6 pages so every bottom panel guides readers deeper into the docs - Fix
examples/index.mdwhich listed no actual examples — now links to all 3 example pages - Fixreference/branch_merge.mdwhich was a complete navigation dead-end (all 4 links backward)
Pages changed
| Page | Problem | Fix | |------|---------|-----| | get-started/what-is-the-adk | 2 of 3 links loop back to get-started | Points forward to walkthrough, prerequisites, first-commands | | get-started/prerequisites | Only link goes back to get-started | Points forward to first-commands | | tutorials/build-an-agent | Links back to walkthrough video | Points forward to restaurant-booking tutorial + core concepts | | examples/index | No example links; 2 of 3 links backward | Lists all 3 example pages | | reference/tooling | Both links backward | Points forward to agent_settings, flows, functions | | reference/branch_merge | All 4 links backward (dead end) | Points forward to tests, tooling + keeps multi-user cross-ref |
Test plan
- Run
mkdocs servelocally and verify bottom-panel "Previous/Next" navigation follows sidebar order - [ ] Click through all changed card links and confirm they resolve correctly - [ ] Verify no broken links introduced
🤖 Generated with Claude Code
Co-authored-by: Claude Opus 4.6 noreply@anthropic.com
Summary Bump experimental schema to latest version
Motivation
Keeps up to date
Changes
- Add latests changes
Test strategy
- Added/updated unit tests
- Manual CLI testing (
poly <command>) - Tested against a live Agent Studio project
- N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass -
pytestpasses - No breaking changes to the
polyCLI interface (or migration path documented) - Commit messages follow conventional commits
Detailed Changes: v0.25.9...v0.25.10
v0.25.9
v0.25.9 (2026-06-17)
This release is published under the Apache-2.0 License.
Bug Fixes
Summary
Adds automatic type validation for YAML resource fields at parse time, catching the colon-space footgun where unquoted strings silently parse as dicts.
Motivation
YAML values with unquoted mid-sentence colons (e.g., the outcome: either a time slot or...) silently parse as dicts instead of strings. This causes opaque TypeError: bad argument type for built-in operation from protobuf C code at push time — with no hint about which field or file caused it. A confirmed case in prompt_assertions burned ~7 push attempts before the user found the cause.
Supersedes #191 — moves the detection from project.py's generic error handler down to the YAML resource layer with field-level precision.
Changes
- Add
check_yaml_field_types()inresource.pyusingdataclasses.fields()+typing.get_type_hints()to introspect declared types and validatestr/list[str]fields aren't dicts - Recurses into nested dataclass fields (catches e.g.TestCaseAssertion.promptsinsideTestCase) - Hook intoYamlResource.read_local_resource— all YAML resources get the check automatically - Hook intoFlowStepandPronunciationoverridingread_local_resourcemethods - 6 unit tests covering str→dict, list[str]→dict, nested recursion, valid passthrough, Optional[str] None, and error message content
Test strategy
- Added/updated unit tests - [x] Manual CLI testing (
poly <command>) - [x] Tested against a live Agent Studio project - [ ] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [x]pytestpasses - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [x] Commit messages follow conventional commits
Screenshots / Logs
Example error output for the confirmed bug (test case with unquoted colon in prompt assertion):
ValueError: Error reading resource test_booking at test_suite/test_booking.yaml: 'assertions.prompts[1]' should be a string but got a dict.
🤖 Generated with Claude Code
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Detailed Changes: v0.25.8...v0.25.9
v0.25.8
v0.25.8 (2026-06-15)
This release is published under the Apache-2.0 License.
Bug Fixes
Summary
Fixes a bug where changing a project's default_language via push always returned 422 — Protocol message Command has no "update_languages_update_default_language" field. DefaultLanguage now emits the correct languages_update_default_language Command field.
Motivation
Tracking: https://linear.app/poly-ai/issue/ORCH-309
Surfaced from Glot eval runs (lead-qualification, restaurant-booking, multilingual-payment-reminder): authoring an agent in a primary language other than the template default (en-GB) sent every build into a languages.yaml rewrite loop, because the default-language update could never push. Adding a locale to additional_languages worked; changing the default did not.
Root cause: DefaultLanguage.command_type already returns the full Command field name languages_update_default_language, but the base update_command_type derives the field as f"update_{command_type}", producing the nonexistent update_languages_update_default_language. sync_client then builds Command(**{update_type: build_update_proto()}) with that bad name and the proto rejects it. The payload (Languages_UpdateDefaultLanguage) was always correct — only the field name was wrong. AdditionalLanguage already overrides create_/delete_command_type for the same reason; DefaultLanguage was missing the matching update_command_type override.
Changes
DefaultLanguage: overrideupdate_command_typeto returnlanguages_update_default_language(noupdate_prefix), mirroringAdditionalLanguage. - Addtest_update_command_type_is_a_real_command_field: asserts the field name and constructs theCommandthe waysync_clientdoes, so a future regression fails loudly.
Test strategy
- Added/updated unit tests - [ ] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [ ] N/A (docs, config, or trivial change)
New test verified to fail without the fix (update_languages_update_default_language != languages_update_default_language) and pass with it.
Checklist
-
ruff check .andruff format --check .pass - [x]pytestpasses (683 passed) - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [x] Commit messages follow conventional commits (fix:→ patch)
Screenshots / Logs
Without the fix: FAILED ...::DefaultLanguageTests::test_update_command_type_is_a_real_command_field AssertionError: 'update_languages_update_default_language' != 'languages_update_default_language'
With the fix: 683 passed, 22 warnings, 30 subtests passed in 9.28s ruff check . -> All checks passed!
Co-authored-by: Claude Opus 4.8 (1M context) noreply@anthropic.com
Detailed Changes: v0.25.7...v0.25.8
v0.25.7
v0.25.7 (2026-06-12)
This release is published under the Apache-2.0 License.
Bug Fixes
Summary
Fix save_imports to recursively copy subdirectories from poly.types into _gen/, so the integrations/ stubs are included.
Motivation
save_imports only iterated top-level .py files via pkg.iterdir(), skipping the integrations/ subdirectory added in #187. This meant conv.integrations had no type hints in Agent Studio.
Changes
- Add
_copy_types_treehelper that recursively walks the types package and copies.pyfiles (including__init__.py) into_gen/- Replace the flat iteration insave_importswith_copy_types_tree
Test strategy
- Added/updated unit tests - [x] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [x] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [x]pytestpasses (682/682) - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [x] Commit messages follow conventional commits
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Detailed Changes: v0.25.6...v0.25.7
v0.25.6
v0.25.6 (2026-06-12)
This release is published under the Apache-2.0 License.
Bug Fixes
Summary
Fix type stubs to use relative imports and add integrations stubs.
Motivation
The stubs updated in #184 used absolute runtime. imports. When copied into _gen/, the rewriter regex didn't catch all forms, causing import errors. Also missing stubs for the integrations subpackage.
Changes
- Replace
from runtime.X import→from .X importin all stubs - Expandimport runtime.X as Yinto direct name imports (from .X import A, B) - Add integrations stubs:Integrationbase class,Integrationsfacade,OpenTable,Tripleseat
Test strategy
- Added/updated unit tests - [ ] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [x] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [x]pytestpasses - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [x] Commit messages follow conventional commits
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Detailed Changes: v0.25.5...v0.25.6
v0.25.5
v0.25.5 (2026-06-12)
This release is published under the Apache-2.0 License.
Bug Fixes
Summary
Prevents json.dumps from escaping Unicode characters (e.g. ' → ’) in experimental config and formatted JSON output.
Motivation
When pulling agent configs containing Unicode characters like smart quotes ('), the JSON serializer escapes them to \uXXXX sequences. This makes config files harder to read and creates noisy diffs.
Changes
- Set
ensure_ascii=FalseinExperimentalConfig.rawproperty - Setensure_ascii=Falseinformat_json()utility
Test strategy
- Added/updated unit tests - [x] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [x] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [x]pytestpasses - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [x] Commit messages follow conventional commits
Screenshots / Logs
diff - "step_footer": "If the user asks a follow-up question while you are waiting for an answer, answer the user’s question first..." + "step_footer": "If the user asks a follow-up question while you are waiting for an answer, answer the user's question first..."
🤖 Generated with Claude Code
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Chores
Summary
Add a script to auto-generate type stubs from genai_lambda_runtime/python/runtime and update all stubs to match current source.
Motivation
The type stubs in src/poly/types/ were manually maintained and had drifted from the runtime source. These stubs are copied into _gen/ during poly pull to provide IDE autocomplete in Agent Studio. This adds an automated sync script so stubs can be regenerated with a single command.
Changes
- Add
scripts/sync_runtime_stubs.py— extracts public API signatures from runtime source, synthesizes__init__for dataclasses, prunes unused imports, derives__all__lists, and handlesTYPE_CHECKINGimports - Update all 10 existing stubs to match current runtime source - Add 5 new stubs:agentic_dial.py,emails.py,entity_validator.py,value_extraction_types.py,webchat.py- New types:WebchatInterface,ChatCallAction,AgenticDial,Destinations,OutgoingEmail,EntityValidationResult, entity config types - NewConversationproperties:webchat,translations,provider_voice_id,integrations- NewConversationmethods:goto_csat_flow,set_csat_*,send_content_template- UpdatedUtils.prompt_llmmodel list with GPT-4.1/5 and Claude models
Usage: python scripts/sync_runtime_stubs.py --runtime-path /path/to/genai_lambda_runtime/python/runtime
Test strategy
- Added/updated unit tests - [ ] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [x] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [x]pytestpasses - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [x] Commit messages follow conventional commits
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Detailed Changes: v0.25.4...v0.25.5
v0.25.4
v0.25.4 (2026-06-12)
This release is published under the Apache-2.0 License.
Bug Fixes
Summary
- Adds
dtmf.globalsection toexperimental_config_schema.yaml, syncing with poly_core#42747 - Global DTMF enables digit collection on every turn; step-level DTMF takes precedence when enabled
- New properties:
is_enabled,max_digits,end_key,collect_while_agent_speaking
Jira: FDX-3768
Test plan
- Existing
ExperimentalConfigTestspass (schema validation + invalid config)
🤖 Generated with Claude Code
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Summary
- The GitHub Issues link in README.md pointed to
PolyAI-LDN/adkwhich is inaccessible to public users - Updated to
PolyAI/adkto match the actual public repository
Test plan
- Verify the new link resolves to the correct repo
🤖 Generated with Claude Code
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Removed Early Access section and prerequisites from README. as they both they we're in early access and API key needs to be requested from PolyAI
Summary
Motivation
Closes #
Changes
Test strategy
- Added/updated unit tests - [ ] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [ ] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [ ]pytestpasses - [ ] No breaking changes to thepolyCLI interface (or migration path documented) - [ ] Commit messages follow conventional commits
Screenshots / Logs
Co-authored-by: Aaron Forinton 89849359+AaronForinton@users.noreply.github.com
Documentation
Summary
This is related to PR #171
Motivation
Closes #
Changes
Test strategy
- Added/updated unit tests - [ ] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [x] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [ ]pytestpasses - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [ ] Commit messages follow conventional commits
Screenshots / Logs
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Summary
Motivation
Closes #
Changes
Test strategy
- Added/updated unit tests - [ ] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [ ] N/A (docs, config, or trivial change)
Checklist
-
ruff check .andruff format --check .pass - [ ]pytestpasses - [ ] No breaking changes to thepolyCLI interface (or migration path documented) - [ ] Commit messages follow conventional commits
Screenshots / Logs
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Detailed Changes: v0.25.3...v0.25.4
v0.25.3
v0.25.3 (2026-06-09)
This release is published under the Apache-2.0 License.
Bug Fixes
Summary
A newly-created TestCase was pushed with its base fields only — its prompt_assertions and tags were silently dropped, so a push → pull round-trip lost them (the case came back with a scenario but no prompt_assertions).
Motivation
Surfaced in Glot, which authors test_suite/*.yaml cases, pushes, then runs them: after the projection round-trip the cases came back assertion-less, so the runner skipped them. The cases only "stuck" on a second push, once the case already existed.
Root cause: TestCase.get_new_updated_deleted_subresources returns its assertions and tags in the updated bucket even for a brand-new case — they have no create proto and are only settable via set_test_case_assertions / set_test_case_tags. But AgentStudioProject._get_updated_subresources only forwarded the new bucket for newly-created resources, so the set_test_case_assertions / set_test_case_tags commands were never emitted. The case landed in the projection with no assertions; pull (_read_test_cases_from_projection) faithfully reconstructed an assertion-less case.
Changes
_get_updated_subresources: for newly-created resources, forward theupdatedanddeletedsub-resources too, not justnew. Creates are already ordered before updates, soCreate_TestCaseis followed byset_test_case_assertions/set_test_case_tags. - This also fixes the same latent drop for a newFunction's non-defaultlatency_control, which is bucketed identically. - AddsGetUpdatedSubresourcesTest.test_new_test_case_emits_assertions_and_tagsasserting a brand-newTestCaseemits its assertions/tags in theupdatedchange-set.
Test strategy
- Added/updated unit tests - [ ] Manual CLI testing (
poly <command>) - [ ] Tested against a live Agent Studio project - [ ] N/A (docs, config, or trivial change)
Couldn't run
pytestlocally (aruamelnamespace-package quirk in my env); the new test targets the exact buckets and CI exercises it.
Checklist
-
ruff check .andruff format --check .pass - [x]pytestpasses (verified via CI — see note above) - [x] No breaking changes to thepolyCLI interface (or migration path documented) - [x] Commit messages follow conventional commits
Screenshots / Logs
Before: a freshly-authored test_suite/<name>.yaml round-trips (push→pull) with its scenario but no prompt_assertions. After: assertions and tags survive the round-trip.
Detailed Changes: v0.25.2...v0.25.3