All notable changes to the ChatBotKit Python SDK are documented in this file. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
token=is the new name for the API credential, onChatBotKit(...),ClientOptionsandextend(...).secret=is deprecated and still works;tokenwins when both are set.cbk.decision.createasks a decision model typed questions (boolean, choice, score) about a state and returns an answer with probabilities for each. Pass a mapping for choice questions, as the generatedQuestiontype cannot hold their named options.
- BREAKING: skillset ability link fields renamed. On create/update/fetch/
list/export,
secretId/fileId/botId/spaceIdare nowlinkedSecretId/linkedFileId/linkedBotId/linkedSpaceId. Inline conversationextensions.skillsets[].abilities[]entries uselinkedSecretId(and the newlinkedSpaceId). GraphQLAbilityrelationssecret/file/bot/spaceare nowlinkedSecret/linkedFile/linkedBot/linkedSpace. There are no compatibility aliases; upgrade together with the platform deploy. - Regenerated types also pick up unrelated API changes since the previous
regeneration (2026-08-19), grouped by resource:
- BREAKING: Dataset:
storeremoved fromDatasetCreateRequest,DatasetFetchResponse,DatasetListResponseItemandDatasetListStreamItemData(the platform now has a single vector store; the REST API accepts and ignoresstore). - Conversation:
expiresAt(epoch ms, auto-delete) added toConversationUpdateRequest,ConversationFetchResponse,ConversationListResponseItemandConversationListStreamItemData. - Memory:
expiresAtadded toMemoryCreateRequest,MemoryUpdateRequest,MemoryFetchResponse,MemoryListResponseItemandMemoryListStreamItemData. - Task:
expiresAtadded toTaskCreateRequest,TaskUpdateRequest,TaskFetchResponse,TaskListResponseItemandTaskListStreamItemData;resumeAt(when a paused run resumes, null while running) added toTaskExecutionListResponseItemandTaskExecutionListStreamItemData. - Policy:
state(enabled|disabled) added toPolicyCreateRequest,PolicyUpdateRequest,PolicyFetchResponse,PolicyListResponseItemandPolicyListStreamItemData. - WhatsApp integration:
appSecret(Meta app secret for webhook signature validation, masked as********on read) added toIntegrationWhatsAppCreateRequest,IntegrationWhatsAppUpdateRequest,IntegrationWhatsAppFetchResponse,IntegrationWhatsAppListResponseItemandIntegrationWhatsAppListStreamItemData;idempotencyKeyadded toWhatsappInitiateRequest. - GitHub integration:
allowFrom(allowed senders) added toGithubIntegrationCreateRequest.
- BREAKING: Dataset:
- Packaging only: releases are now published to PyPI through GitHub Actions Trusted Publishing (OIDC), replacing the previous API-token flow. There are no changes to the SDK's public API or behaviour since 0.5.0.
- Agent cancellation.
agent.execute(...)andagent.complete(...)now accept anabort_signal(asyncio.Event); setting it stops the loop from the outside (timeout, shutdown, user stop) and exits with code1at the next event boundary. The built-inaborttool'shard=Trueoption now cancels the in-flight iteration immediately instead of being a no-op, bringing the Python agent to parity with the Node and Go SDKs.
- The agent system instruction now includes the "Be Responsive" guideline (prioritise new user input mid-run), matching the Node and Go SDKs.
- Secret token minting and request proxying.
client.secret.mint(...)/client.contact.secret.mint(...)mint a usable token from a secret (oauth/jwtsecrets only; owner-only) and return{ token, expiresAt }.client.secret.proxy(...)/client.contact.secret.proxy(...)proxy a request through a secret — the credential is injected server-side (it never leaves the platform) and the upstreamhttpx.Responseis returned as-is, success or error. AuthorizationRequiredError(exported fromchatbotkit; a subclass ofAPIError) carrying theurlthe user must visit to authorize. It is raised when a secret or connection has not been authenticated yet (409 authorization_required) — bymint, by any normal route, and byproxy(which otherwise passes every genuine upstream response through untouched).APIErrornow also carriesstatus_codeand the parseddatabody.
statelifecycle field on the skillset and ability resources, backed by the newResourceStateenum (enabled/disabled). A skillset or ability can now be toggled off without deleting it. Available on the create, update, fetch, and list types.
skill_serverintegration client (client.integration.skill_server) withlist,fetch,create,update, anddelete. The Skill Server integration exposes a skillset's abilities as a text-first HTTP API.siteclient underspace(client.space.site) withlist,fetch,create,update, anddelete, keyed by the parent space ID. A space site binds a<label>.chatbotkit.spacesubdomain to static content served from a space's storage.
- Re-generated types from the latest API spec, including the
aliasfield now present across integration create/update requests.
- Initial release of the async Python SDK for ChatBotKit.