Repository files navigation

ChatBotKitCBK.AIEmailDiscordPyPIFollow on Twitter

 .d8888b. 888888b. 888 d8P
d88P Y88b 888 "88b 888 d8P
888 888 888 .88P 888 d8P
888 8888888K. 888d88K
888 888 "Y88b 8888888b
888 888 888 888 888 Y88b
Y88b d88P 888 d88P 888 Y88b
"Y8888P" 8888888P" 888 Y88b .ai

ChatBotKit Python SDK

The official async Python SDK for ChatBotKit - a platform for building and deploying conversational AI applications. With ChatBotKit you can create bots and agents with custom data, skillsets, and integrations while keeping AI orchestration on the ChatBotKit platform.

Why ChatBotKit?

Build lighter, future-proof AI agents. When you build with ChatBotKit, the heavy lifting happens on our servers, not in your application. This architectural advantage delivers:

  • 🪶 Lightweight Agents: Your agents stay lean because complex AI processing, model orchestration, and tool execution happen server-side. Less code in your app means faster load times and simpler maintenance.

  • 🛡️ Robust & Streamlined: Server-side processing provides a more reliable experience with built-in error handling, automatic retries, and consistent behavior across all platforms.

  • 🔄 Backward & Forward Compatible: As AI technology evolves with new models, new capabilities, and new paradigms, your agents automatically benefit. No code changes required on your end.

  • 🔮 Future-Proof: Agents you build today will remain capable tomorrow. When we add support for new AI models or capabilities, your existing agents gain those powers without any updates to your codebase.

This means you can focus on building great user experiences while ChatBotKit handles the complexity of the ever-changing AI landscape.

Installation

pip install chatbotkit

You can also install directly from GitHub:

pip install "chatbotkit @ git+https://github.com/chatbotkit/python-sdk.git"

Requires Python 3.10 or later. The SDK is fully async and built on httpx.

To use the optional agent helpers, install the agent extra:

pip install "chatbotkit[agent]"

Or install the agent extra directly from GitHub:

pip install "chatbotkit[agent] @ git+https://github.com/chatbotkit/python-sdk.git"

Then import from chatbotkit.agent:

fromchatbotkit.agentimportTool, execute

Development Checks

From sdks/python, run the same checks used by CI:

pip install -e ".[dev]"
python -m pytest tests
python -m compileall -q chatbotkit examples
python -m build
python -m twine check dist/*

The GitHub Actions workflow builds and checks publishable sdist and wheel artifacts. Publishing is manual and disabled by default until PyPI trusted publishing is configured.

Quick Start

importasynciofromchatbotkitimportChatBotKitfromchatbotkit.typesimportConversationCompleteStreamItemTypeasyncdefmain():
asyncwithChatBotKit(secret="your-api-key") ascbk:
completion=cbk.conversation.complete(
None,
{
"messages": [
{"type": "user", "text": "Hello! Tell me a joke."},
],
},
)
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
asyncio.run(main())

SDK Client

Create a client with your API key and access resources as attributes:

fromchatbotkitimportChatBotKitcbk=ChatBotKit(
secret="your-api-key",
base_url="https://api.chatbotkit.com", # optionalrun_as_user_id="user-id", # optionaltimezone="America/New_York", # optional
)
cbk.bot# Bot managementcbk.conversation# Conversation managementcbk.dataset# Dataset management (cbk.dataset.record)cbk.skillset# Skillset management (cbk.skillset.ability)cbk.file# File managementcbk.contact# Contact management (cbk.contact.conversation/secret/space/task)cbk.secret# Secret managementcbk.memory# Memory managementcbk.blueprint# Blueprint management (cbk.blueprint.resource/bulletin)cbk.task# Task management (cbk.task.execution)cbk.team# Team managementcbk.space# Space management (cbk.space.storage)cbk.partner# Partner management (cbk.partner.user.token)cbk.policy# Policy managementcbk.portal# Portal managementcbk.usage# Usage reporting (cbk.usage.series)cbk.magic# Magic AI generation (cbk.magic.prompt)cbk.event# Event log access (cbk.event.log)cbk.graphql# GraphQL operationscbk.channel# Channel publish/subscribecbk.platform# Platform content (doc, example, manual, model, tutorial, ...)cbk.integration# Integrations (widget, slack, discord, whatsapp, telegram,# messenger, instagram, notion, sitemap, support, extract,# twilio, email, mcp_server, microsoft_teams, google_chat,# trigger)

The client manages an underlying httpx.AsyncClient. Use it as an async context manager (async with ChatBotKit(...) as cbk:) or call await cbk.aclose() when you are done to release the connection pool.

Every resource method returns an awaitable Response. await it to parse a normal JSON response, or call .stream() to iterate over a JSONL stream:

# Awaiting a response parses the JSON body into a typed objectbots=awaitcbk.bot.list({"take": 10})
# Streaming iterates over typed stream items as they arriveasyncforitemincbk.bot.list({"take": 10}).stream():
print(item.type, item.data.id)

Methods accept either a generated request/params object from chatbotkit.types or a plain dict. Generated objects are serialized automatically.

Resource Operations

Bots

# List botsbots=awaitcbk.bot.list({"take": 10})
# Fetch a botbot=awaitcbk.bot.fetch("bot-id")
# Create a botbot=awaitcbk.bot.create({
"name": "My Bot",
"description": "A helpful assistant",
"backstory": "You are a friendly AI assistant.",
})
# Update a botbot=awaitcbk.bot.update("bot-id", {"name": "Updated Bot Name"})
# Delete a botresult=awaitcbk.bot.delete("bot-id")

Conversations

# Create a conversationconversation=awaitcbk.conversation.create({})
# List conversationsconversations=awaitcbk.conversation.list({"take": 10})
# Continue an existing conversationresult=awaitcbk.conversation.complete("conversation-id", {
"messages": [{"type": "user", "text": "Hello!"}],
})
# Or use the stateless endpoint by passing None as the conversation idresult=awaitcbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Hello!"}],
})

Datasets

# Create a datasetdataset=awaitcbk.dataset.create({"name": "Knowledge Base"})
# Add a recordrecord=awaitcbk.dataset.record.create("dataset-id", {
"text": "Important information...",
})
# Search the datasetresults=awaitcbk.dataset.search("dataset-id", {"text": "search query"})

Integrations

Each integration is reachable under cbk.integration and follows the same CRUD shape, with a few integration-specific extras (setup, initiate, sync):

# List Slack integrationsslack=awaitcbk.integration.slack.list({"take": 10})
# Create a widget integrationwidget=awaitcbk.integration.widget.create({"name": "Website Widget"})
# Trigger a sync for a sitemap integrationawaitcbk.integration.sitemap.sync("integration-id")

The full list of resources is shown under SDK Client above.

Streaming

Completions and list endpoints support streaming. Call .stream() on the returned Response to get an async iterator of typed stream items. Each item has a type (an enum) and a data payload:

fromchatbotkit.typesimportConversationCompleteStreamItemTypecompletion=cbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Write a short poem."}],
})
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
elifevent.type==ConversationCompleteStreamItemType.RESULT:
print("\nDone!")

Configuration Options

Options can be passed as keyword arguments or via a ClientOptions instance.

OptionDescription
secretAPI authentication token (required)
base_urlCustom API base URL
run_as_user_idExecute requests as a specific user
run_as_child_user_emailExecute requests as a specific child user
timezoneTimezone for timestamp handling
headersExtra headers to send with every request
timeoutRequest timeout in seconds
transportCustom httpx transport (useful for testing)
fromchatbotkitimportChatBotKit, ClientOptionscbk=ChatBotKit(ClientOptions(secret="your-api-key", timezone="UTC"))

Error Handling

Failed requests raise APIError, which carries the message, code, status, and URL returned by the API:

fromchatbotkitimportAPIErrortry:
bot=awaitcbk.bot.fetch("invalid-id")
exceptAPIErroraserror:
print(error.status_code, error.code, error.message)

Types

The chatbotkit.types module contains all request, response, and stream item types, generated from the ChatBotKit OpenAPI specification. Each type provides from_dict and to_dict helpers, and passing typed objects to resource methods is fully supported:

fromchatbotkit.typesimportBotCreateRequestbot=awaitcbk.bot.create(BotCreateRequest.from_dict({
"name": "My Bot",
"description": "Description",
}))

Documentation

  • Platform Documentation: Comprehensive guide to ChatBotKit here.
  • Platform Tutorials: Step-by-step tutorials for ChatBotKit here.

Contributing

Encounter a bug or want to contribute? Open an issue or submit a pull request on our official GitHub repository.

chatbotkit/types.py is generated and should not be edited by hand. To regenerate it from the latest API specification, run the type sync script from the platform repo:

pnpm --dir sites/main script:sync-types:python

Install the development dependencies and run the test suite with:

pip install -e ".[dev]"
pytest

License

See LICENSE for details.

About

Create conversational AI solutions with custom data and abilities using ChatBotKit for Python applications.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ChatBotKitCBK.AIEmailDiscordPyPIFollow on Twitter

 .d8888b. 888888b. 888 d8P
d88P Y88b 888 "88b 888 d8P
888 888 888 .88P 888 d8P
888 8888888K. 888d88K
888 888 "Y88b 8888888b
888 888 888 888 888 Y88b
Y88b d88P 888 d88P 888 Y88b
"Y8888P" 8888888P" 888 Y88b .ai

ChatBotKit Python SDK

The official async Python SDK for ChatBotKit - a platform for building and deploying conversational AI applications. With ChatBotKit you can create bots and agents with custom data, skillsets, and integrations while keeping AI orchestration on the ChatBotKit platform.

Why ChatBotKit?

Build lighter, future-proof AI agents. When you build with ChatBotKit, the heavy lifting happens on our servers, not in your application. This architectural advantage delivers:

  • 🪶 Lightweight Agents: Your agents stay lean because complex AI processing, model orchestration, and tool execution happen server-side. Less code in your app means faster load times and simpler maintenance.

  • 🛡️ Robust & Streamlined: Server-side processing provides a more reliable experience with built-in error handling, automatic retries, and consistent behavior across all platforms.

  • 🔄 Backward & Forward Compatible: As AI technology evolves with new models, new capabilities, and new paradigms, your agents automatically benefit. No code changes required on your end.

  • 🔮 Future-Proof: Agents you build today will remain capable tomorrow. When we add support for new AI models or capabilities, your existing agents gain those powers without any updates to your codebase.

This means you can focus on building great user experiences while ChatBotKit handles the complexity of the ever-changing AI landscape.

Installation

pip install chatbotkit

You can also install directly from GitHub:

pip install "chatbotkit @ git+https://github.com/chatbotkit/python-sdk.git"

Requires Python 3.10 or later. The SDK is fully async and built on httpx.

To use the optional agent helpers, install the agent extra:

pip install "chatbotkit[agent]"

Or install the agent extra directly from GitHub:

pip install "chatbotkit[agent] @ git+https://github.com/chatbotkit/python-sdk.git"

Then import from chatbotkit.agent:

fromchatbotkit.agentimportTool, execute

Development Checks

From sdks/python, run the same checks used by CI:

pip install -e ".[dev]"
python -m pytest tests
python -m compileall -q chatbotkit examples
python -m build
python -m twine check dist/*

The GitHub Actions workflow builds and checks publishable sdist and wheel artifacts. Publishing is manual and disabled by default until PyPI trusted publishing is configured.

Quick Start

importasynciofromchatbotkitimportChatBotKitfromchatbotkit.typesimportConversationCompleteStreamItemTypeasyncdefmain():
asyncwithChatBotKit(secret="your-api-key") ascbk:
completion=cbk.conversation.complete(
None,
{
"messages": [
{"type": "user", "text": "Hello! Tell me a joke."},
],
},
)
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
asyncio.run(main())

SDK Client

Create a client with your API key and access resources as attributes:

fromchatbotkitimportChatBotKitcbk=ChatBotKit(
secret="your-api-key",
base_url="https://api.chatbotkit.com", # optionalrun_as_user_id="user-id", # optionaltimezone="America/New_York", # optional
)
cbk.bot# Bot managementcbk.conversation# Conversation managementcbk.dataset# Dataset management (cbk.dataset.record)cbk.skillset# Skillset management (cbk.skillset.ability)cbk.file# File managementcbk.contact# Contact management (cbk.contact.conversation/secret/space/task)cbk.secret# Secret managementcbk.memory# Memory managementcbk.blueprint# Blueprint management (cbk.blueprint.resource/bulletin)cbk.task# Task management (cbk.task.execution)cbk.team# Team managementcbk.space# Space management (cbk.space.storage)cbk.partner# Partner management (cbk.partner.user.token)cbk.policy# Policy managementcbk.portal# Portal managementcbk.usage# Usage reporting (cbk.usage.series)cbk.magic# Magic AI generation (cbk.magic.prompt)cbk.event# Event log access (cbk.event.log)cbk.graphql# GraphQL operationscbk.channel# Channel publish/subscribecbk.platform# Platform content (doc, example, manual, model, tutorial, ...)cbk.integration# Integrations (widget, slack, discord, whatsapp, telegram,# messenger, instagram, notion, sitemap, support, extract,# twilio, email, mcp_server, microsoft_teams, google_chat,# trigger)

The client manages an underlying httpx.AsyncClient. Use it as an async context manager (async with ChatBotKit(...) as cbk:) or call await cbk.aclose() when you are done to release the connection pool.

Every resource method returns an awaitable Response. await it to parse a normal JSON response, or call .stream() to iterate over a JSONL stream:

# Awaiting a response parses the JSON body into a typed objectbots=awaitcbk.bot.list({"take": 10})
# Streaming iterates over typed stream items as they arriveasyncforitemincbk.bot.list({"take": 10}).stream():
print(item.type, item.data.id)

Methods accept either a generated request/params object from chatbotkit.types or a plain dict. Generated objects are serialized automatically.

Resource Operations

Bots

# List botsbots=awaitcbk.bot.list({"take": 10})
# Fetch a botbot=awaitcbk.bot.fetch("bot-id")
# Create a botbot=awaitcbk.bot.create({
"name": "My Bot",
"description": "A helpful assistant",
"backstory": "You are a friendly AI assistant.",
})
# Update a botbot=awaitcbk.bot.update("bot-id", {"name": "Updated Bot Name"})
# Delete a botresult=awaitcbk.bot.delete("bot-id")

Conversations

# Create a conversationconversation=awaitcbk.conversation.create({})
# List conversationsconversations=awaitcbk.conversation.list({"take": 10})
# Continue an existing conversationresult=awaitcbk.conversation.complete("conversation-id", {
"messages": [{"type": "user", "text": "Hello!"}],
})
# Or use the stateless endpoint by passing None as the conversation idresult=awaitcbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Hello!"}],
})

Datasets

# Create a datasetdataset=awaitcbk.dataset.create({"name": "Knowledge Base"})
# Add a recordrecord=awaitcbk.dataset.record.create("dataset-id", {
"text": "Important information...",
})
# Search the datasetresults=awaitcbk.dataset.search("dataset-id", {"text": "search query"})

Integrations

Each integration is reachable under cbk.integration and follows the same CRUD shape, with a few integration-specific extras (setup, initiate, sync):

# List Slack integrationsslack=awaitcbk.integration.slack.list({"take": 10})
# Create a widget integrationwidget=awaitcbk.integration.widget.create({"name": "Website Widget"})
# Trigger a sync for a sitemap integrationawaitcbk.integration.sitemap.sync("integration-id")

The full list of resources is shown under SDK Client above.

Streaming

Completions and list endpoints support streaming. Call .stream() on the returned Response to get an async iterator of typed stream items. Each item has a type (an enum) and a data payload:

fromchatbotkit.typesimportConversationCompleteStreamItemTypecompletion=cbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Write a short poem."}],
})
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
elifevent.type==ConversationCompleteStreamItemType.RESULT:
print("\nDone!")

Configuration Options

Options can be passed as keyword arguments or via a ClientOptions instance.

OptionDescription
secretAPI authentication token (required)
base_urlCustom API base URL
run_as_user_idExecute requests as a specific user
run_as_child_user_emailExecute requests as a specific child user
timezoneTimezone for timestamp handling
headersExtra headers to send with every request
timeoutRequest timeout in seconds
transportCustom httpx transport (useful for testing)
fromchatbotkitimportChatBotKit, ClientOptionscbk=ChatBotKit(ClientOptions(secret="your-api-key", timezone="UTC"))

Error Handling

Failed requests raise APIError, which carries the message, code, status, and URL returned by the API:

fromchatbotkitimportAPIErrortry:
bot=awaitcbk.bot.fetch("invalid-id")
exceptAPIErroraserror:
print(error.status_code, error.code, error.message)

Types

The chatbotkit.types module contains all request, response, and stream item types, generated from the ChatBotKit OpenAPI specification. Each type provides from_dict and to_dict helpers, and passing typed objects to resource methods is fully supported:

fromchatbotkit.typesimportBotCreateRequestbot=awaitcbk.bot.create(BotCreateRequest.from_dict({
"name": "My Bot",
"description": "Description",
}))

Documentation

  • Platform Documentation: Comprehensive guide to ChatBotKit here.
  • Platform Tutorials: Step-by-step tutorials for ChatBotKit here.

Contributing

Encounter a bug or want to contribute? Open an issue or submit a pull request on our official GitHub repository.

chatbotkit/types.py is generated and should not be edited by hand. To regenerate it from the latest API specification, run the type sync script from the platform repo:

pnpm --dir sites/main script:sync-types:python

Install the development dependencies and run the test suite with:

pip install -e ".[dev]"
pytest

License

See LICENSE for details.

About

Create conversational AI solutions with custom data and abilities using ChatBotKit for Python applications.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ChatBotKitCBK.AIEmailDiscordPyPIFollow on Twitter

 .d8888b. 888888b. 888 d8P
d88P Y88b 888 "88b 888 d8P
888 888 888 .88P 888 d8P
888 8888888K. 888d88K
888 888 "Y88b 8888888b
888 888 888 888 888 Y88b
Y88b d88P 888 d88P 888 Y88b
"Y8888P" 8888888P" 888 Y88b .ai

ChatBotKit Python SDK

The official async Python SDK for ChatBotKit - a platform for building and deploying conversational AI applications. With ChatBotKit you can create bots and agents with custom data, skillsets, and integrations while keeping AI orchestration on the ChatBotKit platform.

Why ChatBotKit?

Build lighter, future-proof AI agents. When you build with ChatBotKit, the heavy lifting happens on our servers, not in your application. This architectural advantage delivers:

  • 🪶 Lightweight Agents: Your agents stay lean because complex AI processing, model orchestration, and tool execution happen server-side. Less code in your app means faster load times and simpler maintenance.

  • 🛡️ Robust & Streamlined: Server-side processing provides a more reliable experience with built-in error handling, automatic retries, and consistent behavior across all platforms.

  • 🔄 Backward & Forward Compatible: As AI technology evolves with new models, new capabilities, and new paradigms, your agents automatically benefit. No code changes required on your end.

  • 🔮 Future-Proof: Agents you build today will remain capable tomorrow. When we add support for new AI models or capabilities, your existing agents gain those powers without any updates to your codebase.

This means you can focus on building great user experiences while ChatBotKit handles the complexity of the ever-changing AI landscape.

Installation

pip install chatbotkit

You can also install directly from GitHub:

pip install "chatbotkit @ git+https://github.com/chatbotkit/python-sdk.git"

Requires Python 3.10 or later. The SDK is fully async and built on httpx.

To use the optional agent helpers, install the agent extra:

pip install "chatbotkit[agent]"

Or install the agent extra directly from GitHub:

pip install "chatbotkit[agent] @ git+https://github.com/chatbotkit/python-sdk.git"

Then import from chatbotkit.agent:

fromchatbotkit.agentimportTool, execute

Development Checks

From sdks/python, run the same checks used by CI:

pip install -e ".[dev]"
python -m pytest tests
python -m compileall -q chatbotkit examples
python -m build
python -m twine check dist/*

The GitHub Actions workflow builds and checks publishable sdist and wheel artifacts. Publishing is manual and disabled by default until PyPI trusted publishing is configured.

Quick Start

importasynciofromchatbotkitimportChatBotKitfromchatbotkit.typesimportConversationCompleteStreamItemTypeasyncdefmain():
asyncwithChatBotKit(secret="your-api-key") ascbk:
completion=cbk.conversation.complete(
None,
{
"messages": [
{"type": "user", "text": "Hello! Tell me a joke."},
],
},
)
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
asyncio.run(main())

SDK Client

Create a client with your API key and access resources as attributes:

fromchatbotkitimportChatBotKitcbk=ChatBotKit(
secret="your-api-key",
base_url="https://api.chatbotkit.com", # optionalrun_as_user_id="user-id", # optionaltimezone="America/New_York", # optional
)
cbk.bot# Bot managementcbk.conversation# Conversation managementcbk.dataset# Dataset management (cbk.dataset.record)cbk.skillset# Skillset management (cbk.skillset.ability)cbk.file# File managementcbk.contact# Contact management (cbk.contact.conversation/secret/space/task)cbk.secret# Secret managementcbk.memory# Memory managementcbk.blueprint# Blueprint management (cbk.blueprint.resource/bulletin)cbk.task# Task management (cbk.task.execution)cbk.team# Team managementcbk.space# Space management (cbk.space.storage)cbk.partner# Partner management (cbk.partner.user.token)cbk.policy# Policy managementcbk.portal# Portal managementcbk.usage# Usage reporting (cbk.usage.series)cbk.magic# Magic AI generation (cbk.magic.prompt)cbk.event# Event log access (cbk.event.log)cbk.graphql# GraphQL operationscbk.channel# Channel publish/subscribecbk.platform# Platform content (doc, example, manual, model, tutorial, ...)cbk.integration# Integrations (widget, slack, discord, whatsapp, telegram,# messenger, instagram, notion, sitemap, support, extract,# twilio, email, mcp_server, microsoft_teams, google_chat,# trigger)

The client manages an underlying httpx.AsyncClient. Use it as an async context manager (async with ChatBotKit(...) as cbk:) or call await cbk.aclose() when you are done to release the connection pool.

Every resource method returns an awaitable Response. await it to parse a normal JSON response, or call .stream() to iterate over a JSONL stream:

# Awaiting a response parses the JSON body into a typed objectbots=awaitcbk.bot.list({"take": 10})
# Streaming iterates over typed stream items as they arriveasyncforitemincbk.bot.list({"take": 10}).stream():
print(item.type, item.data.id)

Methods accept either a generated request/params object from chatbotkit.types or a plain dict. Generated objects are serialized automatically.

Resource Operations

Bots

# List botsbots=awaitcbk.bot.list({"take": 10})
# Fetch a botbot=awaitcbk.bot.fetch("bot-id")
# Create a botbot=awaitcbk.bot.create({
"name": "My Bot",
"description": "A helpful assistant",
"backstory": "You are a friendly AI assistant.",
})
# Update a botbot=awaitcbk.bot.update("bot-id", {"name": "Updated Bot Name"})
# Delete a botresult=awaitcbk.bot.delete("bot-id")

Conversations

# Create a conversationconversation=awaitcbk.conversation.create({})
# List conversationsconversations=awaitcbk.conversation.list({"take": 10})
# Continue an existing conversationresult=awaitcbk.conversation.complete("conversation-id", {
"messages": [{"type": "user", "text": "Hello!"}],
})
# Or use the stateless endpoint by passing None as the conversation idresult=awaitcbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Hello!"}],
})

Datasets

# Create a datasetdataset=awaitcbk.dataset.create({"name": "Knowledge Base"})
# Add a recordrecord=awaitcbk.dataset.record.create("dataset-id", {
"text": "Important information...",
})
# Search the datasetresults=awaitcbk.dataset.search("dataset-id", {"text": "search query"})

Integrations

Each integration is reachable under cbk.integration and follows the same CRUD shape, with a few integration-specific extras (setup, initiate, sync):

# List Slack integrationsslack=awaitcbk.integration.slack.list({"take": 10})
# Create a widget integrationwidget=awaitcbk.integration.widget.create({"name": "Website Widget"})
# Trigger a sync for a sitemap integrationawaitcbk.integration.sitemap.sync("integration-id")

The full list of resources is shown under SDK Client above.

Streaming

Completions and list endpoints support streaming. Call .stream() on the returned Response to get an async iterator of typed stream items. Each item has a type (an enum) and a data payload:

fromchatbotkit.typesimportConversationCompleteStreamItemTypecompletion=cbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Write a short poem."}],
})
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
elifevent.type==ConversationCompleteStreamItemType.RESULT:
print("\nDone!")

Configuration Options

Options can be passed as keyword arguments or via a ClientOptions instance.

OptionDescription
secretAPI authentication token (required)
base_urlCustom API base URL
run_as_user_idExecute requests as a specific user
run_as_child_user_emailExecute requests as a specific child user
timezoneTimezone for timestamp handling
headersExtra headers to send with every request
timeoutRequest timeout in seconds
transportCustom httpx transport (useful for testing)
fromchatbotkitimportChatBotKit, ClientOptionscbk=ChatBotKit(ClientOptions(secret="your-api-key", timezone="UTC"))

Error Handling

Failed requests raise APIError, which carries the message, code, status, and URL returned by the API:

fromchatbotkitimportAPIErrortry:
bot=awaitcbk.bot.fetch("invalid-id")
exceptAPIErroraserror:
print(error.status_code, error.code, error.message)

Types

The chatbotkit.types module contains all request, response, and stream item types, generated from the ChatBotKit OpenAPI specification. Each type provides from_dict and to_dict helpers, and passing typed objects to resource methods is fully supported:

fromchatbotkit.typesimportBotCreateRequestbot=awaitcbk.bot.create(BotCreateRequest.from_dict({
"name": "My Bot",
"description": "Description",
}))

Documentation

  • Platform Documentation: Comprehensive guide to ChatBotKit here.
  • Platform Tutorials: Step-by-step tutorials for ChatBotKit here.

Contributing

Encounter a bug or want to contribute? Open an issue or submit a pull request on our official GitHub repository.

chatbotkit/types.py is generated and should not be edited by hand. To regenerate it from the latest API specification, run the type sync script from the platform repo:

pnpm --dir sites/main script:sync-types:python

Install the development dependencies and run the test suite with:

pip install -e ".[dev]"
pytest

License

See LICENSE for details.

About

Create conversational AI solutions with custom data and abilities using ChatBotKit for Python applications.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ChatBotKitCBK.AIEmailDiscordPyPIFollow on Twitter

 .d8888b. 888888b. 888 d8P
d88P Y88b 888 "88b 888 d8P
888 888 888 .88P 888 d8P
888 8888888K. 888d88K
888 888 "Y88b 8888888b
888 888 888 888 888 Y88b
Y88b d88P 888 d88P 888 Y88b
"Y8888P" 8888888P" 888 Y88b .ai

ChatBotKit Python SDK

The official async Python SDK for ChatBotKit - a platform for building and deploying conversational AI applications. With ChatBotKit you can create bots and agents with custom data, skillsets, and integrations while keeping AI orchestration on the ChatBotKit platform.

Why ChatBotKit?

Build lighter, future-proof AI agents. When you build with ChatBotKit, the heavy lifting happens on our servers, not in your application. This architectural advantage delivers:

  • 🪶 Lightweight Agents: Your agents stay lean because complex AI processing, model orchestration, and tool execution happen server-side. Less code in your app means faster load times and simpler maintenance.

  • 🛡️ Robust & Streamlined: Server-side processing provides a more reliable experience with built-in error handling, automatic retries, and consistent behavior across all platforms.

  • 🔄 Backward & Forward Compatible: As AI technology evolves with new models, new capabilities, and new paradigms, your agents automatically benefit. No code changes required on your end.

  • 🔮 Future-Proof: Agents you build today will remain capable tomorrow. When we add support for new AI models or capabilities, your existing agents gain those powers without any updates to your codebase.

This means you can focus on building great user experiences while ChatBotKit handles the complexity of the ever-changing AI landscape.

Installation

pip install chatbotkit

You can also install directly from GitHub:

pip install "chatbotkit @ git+https://github.com/chatbotkit/python-sdk.git"

Requires Python 3.10 or later. The SDK is fully async and built on httpx.

To use the optional agent helpers, install the agent extra:

pip install "chatbotkit[agent]"

Or install the agent extra directly from GitHub:

pip install "chatbotkit[agent] @ git+https://github.com/chatbotkit/python-sdk.git"

Then import from chatbotkit.agent:

fromchatbotkit.agentimportTool, execute

Development Checks

From sdks/python, run the same checks used by CI:

pip install -e ".[dev]"
python -m pytest tests
python -m compileall -q chatbotkit examples
python -m build
python -m twine check dist/*

The GitHub Actions workflow builds and checks publishable sdist and wheel artifacts. Publishing is manual and disabled by default until PyPI trusted publishing is configured.

Quick Start

importasynciofromchatbotkitimportChatBotKitfromchatbotkit.typesimportConversationCompleteStreamItemTypeasyncdefmain():
asyncwithChatBotKit(secret="your-api-key") ascbk:
completion=cbk.conversation.complete(
None,
{
"messages": [
{"type": "user", "text": "Hello! Tell me a joke."},
],
},
)
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
asyncio.run(main())

SDK Client

Create a client with your API key and access resources as attributes:

fromchatbotkitimportChatBotKitcbk=ChatBotKit(
secret="your-api-key",
base_url="https://api.chatbotkit.com", # optionalrun_as_user_id="user-id", # optionaltimezone="America/New_York", # optional
)
cbk.bot# Bot managementcbk.conversation# Conversation managementcbk.dataset# Dataset management (cbk.dataset.record)cbk.skillset# Skillset management (cbk.skillset.ability)cbk.file# File managementcbk.contact# Contact management (cbk.contact.conversation/secret/space/task)cbk.secret# Secret managementcbk.memory# Memory managementcbk.blueprint# Blueprint management (cbk.blueprint.resource/bulletin)cbk.task# Task management (cbk.task.execution)cbk.team# Team managementcbk.space# Space management (cbk.space.storage)cbk.partner# Partner management (cbk.partner.user.token)cbk.policy# Policy managementcbk.portal# Portal managementcbk.usage# Usage reporting (cbk.usage.series)cbk.magic# Magic AI generation (cbk.magic.prompt)cbk.event# Event log access (cbk.event.log)cbk.graphql# GraphQL operationscbk.channel# Channel publish/subscribecbk.platform# Platform content (doc, example, manual, model, tutorial, ...)cbk.integration# Integrations (widget, slack, discord, whatsapp, telegram,# messenger, instagram, notion, sitemap, support, extract,# twilio, email, mcp_server, microsoft_teams, google_chat,# trigger)

The client manages an underlying httpx.AsyncClient. Use it as an async context manager (async with ChatBotKit(...) as cbk:) or call await cbk.aclose() when you are done to release the connection pool.

Every resource method returns an awaitable Response. await it to parse a normal JSON response, or call .stream() to iterate over a JSONL stream:

# Awaiting a response parses the JSON body into a typed objectbots=awaitcbk.bot.list({"take": 10})
# Streaming iterates over typed stream items as they arriveasyncforitemincbk.bot.list({"take": 10}).stream():
print(item.type, item.data.id)

Methods accept either a generated request/params object from chatbotkit.types or a plain dict. Generated objects are serialized automatically.

Resource Operations

Bots

# List botsbots=awaitcbk.bot.list({"take": 10})
# Fetch a botbot=awaitcbk.bot.fetch("bot-id")
# Create a botbot=awaitcbk.bot.create({
"name": "My Bot",
"description": "A helpful assistant",
"backstory": "You are a friendly AI assistant.",
})
# Update a botbot=awaitcbk.bot.update("bot-id", {"name": "Updated Bot Name"})
# Delete a botresult=awaitcbk.bot.delete("bot-id")

Conversations

# Create a conversationconversation=awaitcbk.conversation.create({})
# List conversationsconversations=awaitcbk.conversation.list({"take": 10})
# Continue an existing conversationresult=awaitcbk.conversation.complete("conversation-id", {
"messages": [{"type": "user", "text": "Hello!"}],
})
# Or use the stateless endpoint by passing None as the conversation idresult=awaitcbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Hello!"}],
})

Datasets

# Create a datasetdataset=awaitcbk.dataset.create({"name": "Knowledge Base"})
# Add a recordrecord=awaitcbk.dataset.record.create("dataset-id", {
"text": "Important information...",
})
# Search the datasetresults=awaitcbk.dataset.search("dataset-id", {"text": "search query"})

Integrations

Each integration is reachable under cbk.integration and follows the same CRUD shape, with a few integration-specific extras (setup, initiate, sync):

# List Slack integrationsslack=awaitcbk.integration.slack.list({"take": 10})
# Create a widget integrationwidget=awaitcbk.integration.widget.create({"name": "Website Widget"})
# Trigger a sync for a sitemap integrationawaitcbk.integration.sitemap.sync("integration-id")

The full list of resources is shown under SDK Client above.

Streaming

Completions and list endpoints support streaming. Call .stream() on the returned Response to get an async iterator of typed stream items. Each item has a type (an enum) and a data payload:

fromchatbotkit.typesimportConversationCompleteStreamItemTypecompletion=cbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Write a short poem."}],
})
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
elifevent.type==ConversationCompleteStreamItemType.RESULT:
print("\nDone!")

Configuration Options

Options can be passed as keyword arguments or via a ClientOptions instance.

OptionDescription
secretAPI authentication token (required)
base_urlCustom API base URL
run_as_user_idExecute requests as a specific user
run_as_child_user_emailExecute requests as a specific child user
timezoneTimezone for timestamp handling
headersExtra headers to send with every request
timeoutRequest timeout in seconds
transportCustom httpx transport (useful for testing)
fromchatbotkitimportChatBotKit, ClientOptionscbk=ChatBotKit(ClientOptions(secret="your-api-key", timezone="UTC"))

Error Handling

Failed requests raise APIError, which carries the message, code, status, and URL returned by the API:

fromchatbotkitimportAPIErrortry:
bot=awaitcbk.bot.fetch("invalid-id")
exceptAPIErroraserror:
print(error.status_code, error.code, error.message)

Types

The chatbotkit.types module contains all request, response, and stream item types, generated from the ChatBotKit OpenAPI specification. Each type provides from_dict and to_dict helpers, and passing typed objects to resource methods is fully supported:

fromchatbotkit.typesimportBotCreateRequestbot=awaitcbk.bot.create(BotCreateRequest.from_dict({
"name": "My Bot",
"description": "Description",
}))

Documentation

  • Platform Documentation: Comprehensive guide to ChatBotKit here.
  • Platform Tutorials: Step-by-step tutorials for ChatBotKit here.

Contributing

Encounter a bug or want to contribute? Open an issue or submit a pull request on our official GitHub repository.

chatbotkit/types.py is generated and should not be edited by hand. To regenerate it from the latest API specification, run the type sync script from the platform repo:

pnpm --dir sites/main script:sync-types:python

Install the development dependencies and run the test suite with:

pip install -e ".[dev]"
pytest

License

See LICENSE for details.

About

Create conversational AI solutions with custom data and abilities using ChatBotKit for Python applications.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ChatBotKitCBK.AIEmailDiscordPyPIFollow on Twitter

 .d8888b. 888888b. 888 d8P
d88P Y88b 888 "88b 888 d8P
888 888 888 .88P 888 d8P
888 8888888K. 888d88K
888 888 "Y88b 8888888b
888 888 888 888 888 Y88b
Y88b d88P 888 d88P 888 Y88b
"Y8888P" 8888888P" 888 Y88b .ai

ChatBotKit Python SDK

The official async Python SDK for ChatBotKit - a platform for building and deploying conversational AI applications. With ChatBotKit you can create bots and agents with custom data, skillsets, and integrations while keeping AI orchestration on the ChatBotKit platform.

Why ChatBotKit?

Build lighter, future-proof AI agents. When you build with ChatBotKit, the heavy lifting happens on our servers, not in your application. This architectural advantage delivers:

  • 🪶 Lightweight Agents: Your agents stay lean because complex AI processing, model orchestration, and tool execution happen server-side. Less code in your app means faster load times and simpler maintenance.

  • 🛡️ Robust & Streamlined: Server-side processing provides a more reliable experience with built-in error handling, automatic retries, and consistent behavior across all platforms.

  • 🔄 Backward & Forward Compatible: As AI technology evolves with new models, new capabilities, and new paradigms, your agents automatically benefit. No code changes required on your end.

  • 🔮 Future-Proof: Agents you build today will remain capable tomorrow. When we add support for new AI models or capabilities, your existing agents gain those powers without any updates to your codebase.

This means you can focus on building great user experiences while ChatBotKit handles the complexity of the ever-changing AI landscape.

Installation

pip install chatbotkit

You can also install directly from GitHub:

pip install "chatbotkit @ git+https://github.com/chatbotkit/python-sdk.git"

Requires Python 3.10 or later. The SDK is fully async and built on httpx.

To use the optional agent helpers, install the agent extra:

pip install "chatbotkit[agent]"

Or install the agent extra directly from GitHub:

pip install "chatbotkit[agent] @ git+https://github.com/chatbotkit/python-sdk.git"

Then import from chatbotkit.agent:

fromchatbotkit.agentimportTool, execute

Development Checks

From sdks/python, run the same checks used by CI:

pip install -e ".[dev]"
python -m pytest tests
python -m compileall -q chatbotkit examples
python -m build
python -m twine check dist/*

The GitHub Actions workflow builds and checks publishable sdist and wheel artifacts. Publishing is manual and disabled by default until PyPI trusted publishing is configured.

Quick Start

importasynciofromchatbotkitimportChatBotKitfromchatbotkit.typesimportConversationCompleteStreamItemTypeasyncdefmain():
asyncwithChatBotKit(secret="your-api-key") ascbk:
completion=cbk.conversation.complete(
None,
{
"messages": [
{"type": "user", "text": "Hello! Tell me a joke."},
],
},
)
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
asyncio.run(main())

SDK Client

Create a client with your API key and access resources as attributes:

fromchatbotkitimportChatBotKitcbk=ChatBotKit(
secret="your-api-key",
base_url="https://api.chatbotkit.com", # optionalrun_as_user_id="user-id", # optionaltimezone="America/New_York", # optional
)
cbk.bot# Bot managementcbk.conversation# Conversation managementcbk.dataset# Dataset management (cbk.dataset.record)cbk.skillset# Skillset management (cbk.skillset.ability)cbk.file# File managementcbk.contact# Contact management (cbk.contact.conversation/secret/space/task)cbk.secret# Secret managementcbk.memory# Memory managementcbk.blueprint# Blueprint management (cbk.blueprint.resource/bulletin)cbk.task# Task management (cbk.task.execution)cbk.team# Team managementcbk.space# Space management (cbk.space.storage)cbk.partner# Partner management (cbk.partner.user.token)cbk.policy# Policy managementcbk.portal# Portal managementcbk.usage# Usage reporting (cbk.usage.series)cbk.magic# Magic AI generation (cbk.magic.prompt)cbk.event# Event log access (cbk.event.log)cbk.graphql# GraphQL operationscbk.channel# Channel publish/subscribecbk.platform# Platform content (doc, example, manual, model, tutorial, ...)cbk.integration# Integrations (widget, slack, discord, whatsapp, telegram,# messenger, instagram, notion, sitemap, support, extract,# twilio, email, mcp_server, microsoft_teams, google_chat,# trigger)

The client manages an underlying httpx.AsyncClient. Use it as an async context manager (async with ChatBotKit(...) as cbk:) or call await cbk.aclose() when you are done to release the connection pool.

Every resource method returns an awaitable Response. await it to parse a normal JSON response, or call .stream() to iterate over a JSONL stream:

# Awaiting a response parses the JSON body into a typed objectbots=awaitcbk.bot.list({"take": 10})
# Streaming iterates over typed stream items as they arriveasyncforitemincbk.bot.list({"take": 10}).stream():
print(item.type, item.data.id)

Methods accept either a generated request/params object from chatbotkit.types or a plain dict. Generated objects are serialized automatically.

Resource Operations

Bots

# List botsbots=awaitcbk.bot.list({"take": 10})
# Fetch a botbot=awaitcbk.bot.fetch("bot-id")
# Create a botbot=awaitcbk.bot.create({
"name": "My Bot",
"description": "A helpful assistant",
"backstory": "You are a friendly AI assistant.",
})
# Update a botbot=awaitcbk.bot.update("bot-id", {"name": "Updated Bot Name"})
# Delete a botresult=awaitcbk.bot.delete("bot-id")

Conversations

# Create a conversationconversation=awaitcbk.conversation.create({})
# List conversationsconversations=awaitcbk.conversation.list({"take": 10})
# Continue an existing conversationresult=awaitcbk.conversation.complete("conversation-id", {
"messages": [{"type": "user", "text": "Hello!"}],
})
# Or use the stateless endpoint by passing None as the conversation idresult=awaitcbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Hello!"}],
})

Datasets

# Create a datasetdataset=awaitcbk.dataset.create({"name": "Knowledge Base"})
# Add a recordrecord=awaitcbk.dataset.record.create("dataset-id", {
"text": "Important information...",
})
# Search the datasetresults=awaitcbk.dataset.search("dataset-id", {"text": "search query"})

Integrations

Each integration is reachable under cbk.integration and follows the same CRUD shape, with a few integration-specific extras (setup, initiate, sync):

# List Slack integrationsslack=awaitcbk.integration.slack.list({"take": 10})
# Create a widget integrationwidget=awaitcbk.integration.widget.create({"name": "Website Widget"})
# Trigger a sync for a sitemap integrationawaitcbk.integration.sitemap.sync("integration-id")

The full list of resources is shown under SDK Client above.

Streaming

Completions and list endpoints support streaming. Call .stream() on the returned Response to get an async iterator of typed stream items. Each item has a type (an enum) and a data payload:

fromchatbotkit.typesimportConversationCompleteStreamItemTypecompletion=cbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Write a short poem."}],
})
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
elifevent.type==ConversationCompleteStreamItemType.RESULT:
print("\nDone!")

Configuration Options

Options can be passed as keyword arguments or via a ClientOptions instance.

OptionDescription
secretAPI authentication token (required)
base_urlCustom API base URL
run_as_user_idExecute requests as a specific user
run_as_child_user_emailExecute requests as a specific child user
timezoneTimezone for timestamp handling
headersExtra headers to send with every request
timeoutRequest timeout in seconds
transportCustom httpx transport (useful for testing)
fromchatbotkitimportChatBotKit, ClientOptionscbk=ChatBotKit(ClientOptions(secret="your-api-key", timezone="UTC"))

Error Handling

Failed requests raise APIError, which carries the message, code, status, and URL returned by the API:

fromchatbotkitimportAPIErrortry:
bot=awaitcbk.bot.fetch("invalid-id")
exceptAPIErroraserror:
print(error.status_code, error.code, error.message)

Types

The chatbotkit.types module contains all request, response, and stream item types, generated from the ChatBotKit OpenAPI specification. Each type provides from_dict and to_dict helpers, and passing typed objects to resource methods is fully supported:

fromchatbotkit.typesimportBotCreateRequestbot=awaitcbk.bot.create(BotCreateRequest.from_dict({
"name": "My Bot",
"description": "Description",
}))

Documentation

  • Platform Documentation: Comprehensive guide to ChatBotKit here.
  • Platform Tutorials: Step-by-step tutorials for ChatBotKit here.

Contributing

Encounter a bug or want to contribute? Open an issue or submit a pull request on our official GitHub repository.

chatbotkit/types.py is generated and should not be edited by hand. To regenerate it from the latest API specification, run the type sync script from the platform repo:

pnpm --dir sites/main script:sync-types:python

Install the development dependencies and run the test suite with:

pip install -e ".[dev]"
pytest

License

See LICENSE for details.

About

Create conversational AI solutions with custom data and abilities using ChatBotKit for Python applications.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ChatBotKitCBK.AIEmailDiscordPyPIFollow on Twitter

 .d8888b. 888888b. 888 d8P
d88P Y88b 888 "88b 888 d8P
888 888 888 .88P 888 d8P
888 8888888K. 888d88K
888 888 "Y88b 8888888b
888 888 888 888 888 Y88b
Y88b d88P 888 d88P 888 Y88b
"Y8888P" 8888888P" 888 Y88b .ai

ChatBotKit Python SDK

The official async Python SDK for ChatBotKit - a platform for building and deploying conversational AI applications. With ChatBotKit you can create bots and agents with custom data, skillsets, and integrations while keeping AI orchestration on the ChatBotKit platform.

Why ChatBotKit?

Build lighter, future-proof AI agents. When you build with ChatBotKit, the heavy lifting happens on our servers, not in your application. This architectural advantage delivers:

  • 🪶 Lightweight Agents: Your agents stay lean because complex AI processing, model orchestration, and tool execution happen server-side. Less code in your app means faster load times and simpler maintenance.

  • 🛡️ Robust & Streamlined: Server-side processing provides a more reliable experience with built-in error handling, automatic retries, and consistent behavior across all platforms.

  • 🔄 Backward & Forward Compatible: As AI technology evolves with new models, new capabilities, and new paradigms, your agents automatically benefit. No code changes required on your end.

  • 🔮 Future-Proof: Agents you build today will remain capable tomorrow. When we add support for new AI models or capabilities, your existing agents gain those powers without any updates to your codebase.

This means you can focus on building great user experiences while ChatBotKit handles the complexity of the ever-changing AI landscape.

Installation

pip install chatbotkit

You can also install directly from GitHub:

pip install "chatbotkit @ git+https://github.com/chatbotkit/python-sdk.git"

Requires Python 3.10 or later. The SDK is fully async and built on httpx.

To use the optional agent helpers, install the agent extra:

pip install "chatbotkit[agent]"

Or install the agent extra directly from GitHub:

pip install "chatbotkit[agent] @ git+https://github.com/chatbotkit/python-sdk.git"

Then import from chatbotkit.agent:

fromchatbotkit.agentimportTool, execute

Development Checks

From sdks/python, run the same checks used by CI:

pip install -e ".[dev]"
python -m pytest tests
python -m compileall -q chatbotkit examples
python -m build
python -m twine check dist/*

The GitHub Actions workflow builds and checks publishable sdist and wheel artifacts. Publishing is manual and disabled by default until PyPI trusted publishing is configured.

Quick Start

importasynciofromchatbotkitimportChatBotKitfromchatbotkit.typesimportConversationCompleteStreamItemTypeasyncdefmain():
asyncwithChatBotKit(secret="your-api-key") ascbk:
completion=cbk.conversation.complete(
None,
{
"messages": [
{"type": "user", "text": "Hello! Tell me a joke."},
],
},
)
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
asyncio.run(main())

SDK Client

Create a client with your API key and access resources as attributes:

fromchatbotkitimportChatBotKitcbk=ChatBotKit(
secret="your-api-key",
base_url="https://api.chatbotkit.com", # optionalrun_as_user_id="user-id", # optionaltimezone="America/New_York", # optional
)
cbk.bot# Bot managementcbk.conversation# Conversation managementcbk.dataset# Dataset management (cbk.dataset.record)cbk.skillset# Skillset management (cbk.skillset.ability)cbk.file# File managementcbk.contact# Contact management (cbk.contact.conversation/secret/space/task)cbk.secret# Secret managementcbk.memory# Memory managementcbk.blueprint# Blueprint management (cbk.blueprint.resource/bulletin)cbk.task# Task management (cbk.task.execution)cbk.team# Team managementcbk.space# Space management (cbk.space.storage)cbk.partner# Partner management (cbk.partner.user.token)cbk.policy# Policy managementcbk.portal# Portal managementcbk.usage# Usage reporting (cbk.usage.series)cbk.magic# Magic AI generation (cbk.magic.prompt)cbk.event# Event log access (cbk.event.log)cbk.graphql# GraphQL operationscbk.channel# Channel publish/subscribecbk.platform# Platform content (doc, example, manual, model, tutorial, ...)cbk.integration# Integrations (widget, slack, discord, whatsapp, telegram,# messenger, instagram, notion, sitemap, support, extract,# twilio, email, mcp_server, microsoft_teams, google_chat,# trigger)

The client manages an underlying httpx.AsyncClient. Use it as an async context manager (async with ChatBotKit(...) as cbk:) or call await cbk.aclose() when you are done to release the connection pool.

Every resource method returns an awaitable Response. await it to parse a normal JSON response, or call .stream() to iterate over a JSONL stream:

# Awaiting a response parses the JSON body into a typed objectbots=awaitcbk.bot.list({"take": 10})
# Streaming iterates over typed stream items as they arriveasyncforitemincbk.bot.list({"take": 10}).stream():
print(item.type, item.data.id)

Methods accept either a generated request/params object from chatbotkit.types or a plain dict. Generated objects are serialized automatically.

Resource Operations

Bots

# List botsbots=awaitcbk.bot.list({"take": 10})
# Fetch a botbot=awaitcbk.bot.fetch("bot-id")
# Create a botbot=awaitcbk.bot.create({
"name": "My Bot",
"description": "A helpful assistant",
"backstory": "You are a friendly AI assistant.",
})
# Update a botbot=awaitcbk.bot.update("bot-id", {"name": "Updated Bot Name"})
# Delete a botresult=awaitcbk.bot.delete("bot-id")

Conversations

# Create a conversationconversation=awaitcbk.conversation.create({})
# List conversationsconversations=awaitcbk.conversation.list({"take": 10})
# Continue an existing conversationresult=awaitcbk.conversation.complete("conversation-id", {
"messages": [{"type": "user", "text": "Hello!"}],
})
# Or use the stateless endpoint by passing None as the conversation idresult=awaitcbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Hello!"}],
})

Datasets

# Create a datasetdataset=awaitcbk.dataset.create({"name": "Knowledge Base"})
# Add a recordrecord=awaitcbk.dataset.record.create("dataset-id", {
"text": "Important information...",
})
# Search the datasetresults=awaitcbk.dataset.search("dataset-id", {"text": "search query"})

Integrations

Each integration is reachable under cbk.integration and follows the same CRUD shape, with a few integration-specific extras (setup, initiate, sync):

# List Slack integrationsslack=awaitcbk.integration.slack.list({"take": 10})
# Create a widget integrationwidget=awaitcbk.integration.widget.create({"name": "Website Widget"})
# Trigger a sync for a sitemap integrationawaitcbk.integration.sitemap.sync("integration-id")

The full list of resources is shown under SDK Client above.

Streaming

Completions and list endpoints support streaming. Call .stream() on the returned Response to get an async iterator of typed stream items. Each item has a type (an enum) and a data payload:

fromchatbotkit.typesimportConversationCompleteStreamItemTypecompletion=cbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Write a short poem."}],
})
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
elifevent.type==ConversationCompleteStreamItemType.RESULT:
print("\nDone!")

Configuration Options

Options can be passed as keyword arguments or via a ClientOptions instance.

OptionDescription
secretAPI authentication token (required)
base_urlCustom API base URL
run_as_user_idExecute requests as a specific user
run_as_child_user_emailExecute requests as a specific child user
timezoneTimezone for timestamp handling
headersExtra headers to send with every request
timeoutRequest timeout in seconds
transportCustom httpx transport (useful for testing)
fromchatbotkitimportChatBotKit, ClientOptionscbk=ChatBotKit(ClientOptions(secret="your-api-key", timezone="UTC"))

Error Handling

Failed requests raise APIError, which carries the message, code, status, and URL returned by the API:

fromchatbotkitimportAPIErrortry:
bot=awaitcbk.bot.fetch("invalid-id")
exceptAPIErroraserror:
print(error.status_code, error.code, error.message)

Types

The chatbotkit.types module contains all request, response, and stream item types, generated from the ChatBotKit OpenAPI specification. Each type provides from_dict and to_dict helpers, and passing typed objects to resource methods is fully supported:

fromchatbotkit.typesimportBotCreateRequestbot=awaitcbk.bot.create(BotCreateRequest.from_dict({
"name": "My Bot",
"description": "Description",
}))

Documentation

  • Platform Documentation: Comprehensive guide to ChatBotKit here.
  • Platform Tutorials: Step-by-step tutorials for ChatBotKit here.

Contributing

Encounter a bug or want to contribute? Open an issue or submit a pull request on our official GitHub repository.

chatbotkit/types.py is generated and should not be edited by hand. To regenerate it from the latest API specification, run the type sync script from the platform repo:

pnpm --dir sites/main script:sync-types:python

Install the development dependencies and run the test suite with:

pip install -e ".[dev]"
pytest

License

See LICENSE for details.

About

Create conversational AI solutions with custom data and abilities using ChatBotKit for Python applications.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ChatBotKitCBK.AIEmailDiscordPyPIFollow on Twitter

 .d8888b. 888888b. 888 d8P
d88P Y88b 888 "88b 888 d8P
888 888 888 .88P 888 d8P
888 8888888K. 888d88K
888 888 "Y88b 8888888b
888 888 888 888 888 Y88b
Y88b d88P 888 d88P 888 Y88b
"Y8888P" 8888888P" 888 Y88b .ai

ChatBotKit Python SDK

The official async Python SDK for ChatBotKit - a platform for building and deploying conversational AI applications. With ChatBotKit you can create bots and agents with custom data, skillsets, and integrations while keeping AI orchestration on the ChatBotKit platform.

Why ChatBotKit?

Build lighter, future-proof AI agents. When you build with ChatBotKit, the heavy lifting happens on our servers, not in your application. This architectural advantage delivers:

  • 🪶 Lightweight Agents: Your agents stay lean because complex AI processing, model orchestration, and tool execution happen server-side. Less code in your app means faster load times and simpler maintenance.

  • 🛡️ Robust & Streamlined: Server-side processing provides a more reliable experience with built-in error handling, automatic retries, and consistent behavior across all platforms.

  • 🔄 Backward & Forward Compatible: As AI technology evolves with new models, new capabilities, and new paradigms, your agents automatically benefit. No code changes required on your end.

  • 🔮 Future-Proof: Agents you build today will remain capable tomorrow. When we add support for new AI models or capabilities, your existing agents gain those powers without any updates to your codebase.

This means you can focus on building great user experiences while ChatBotKit handles the complexity of the ever-changing AI landscape.

Installation

pip install chatbotkit

You can also install directly from GitHub:

pip install "chatbotkit @ git+https://github.com/chatbotkit/python-sdk.git"

Requires Python 3.10 or later. The SDK is fully async and built on httpx.

To use the optional agent helpers, install the agent extra:

pip install "chatbotkit[agent]"

Or install the agent extra directly from GitHub:

pip install "chatbotkit[agent] @ git+https://github.com/chatbotkit/python-sdk.git"

Then import from chatbotkit.agent:

fromchatbotkit.agentimportTool, execute

Development Checks

From sdks/python, run the same checks used by CI:

pip install -e ".[dev]"
python -m pytest tests
python -m compileall -q chatbotkit examples
python -m build
python -m twine check dist/*

The GitHub Actions workflow builds and checks publishable sdist and wheel artifacts. Publishing is manual and disabled by default until PyPI trusted publishing is configured.

Quick Start

importasynciofromchatbotkitimportChatBotKitfromchatbotkit.typesimportConversationCompleteStreamItemTypeasyncdefmain():
asyncwithChatBotKit(secret="your-api-key") ascbk:
completion=cbk.conversation.complete(
None,
{
"messages": [
{"type": "user", "text": "Hello! Tell me a joke."},
],
},
)
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
asyncio.run(main())

SDK Client

Create a client with your API key and access resources as attributes:

fromchatbotkitimportChatBotKitcbk=ChatBotKit(
secret="your-api-key",
base_url="https://api.chatbotkit.com", # optionalrun_as_user_id="user-id", # optionaltimezone="America/New_York", # optional
)
cbk.bot# Bot managementcbk.conversation# Conversation managementcbk.dataset# Dataset management (cbk.dataset.record)cbk.skillset# Skillset management (cbk.skillset.ability)cbk.file# File managementcbk.contact# Contact management (cbk.contact.conversation/secret/space/task)cbk.secret# Secret managementcbk.memory# Memory managementcbk.blueprint# Blueprint management (cbk.blueprint.resource/bulletin)cbk.task# Task management (cbk.task.execution)cbk.team# Team managementcbk.space# Space management (cbk.space.storage)cbk.partner# Partner management (cbk.partner.user.token)cbk.policy# Policy managementcbk.portal# Portal managementcbk.usage# Usage reporting (cbk.usage.series)cbk.magic# Magic AI generation (cbk.magic.prompt)cbk.event# Event log access (cbk.event.log)cbk.graphql# GraphQL operationscbk.channel# Channel publish/subscribecbk.platform# Platform content (doc, example, manual, model, tutorial, ...)cbk.integration# Integrations (widget, slack, discord, whatsapp, telegram,# messenger, instagram, notion, sitemap, support, extract,# twilio, email, mcp_server, microsoft_teams, google_chat,# trigger)

The client manages an underlying httpx.AsyncClient. Use it as an async context manager (async with ChatBotKit(...) as cbk:) or call await cbk.aclose() when you are done to release the connection pool.

Every resource method returns an awaitable Response. await it to parse a normal JSON response, or call .stream() to iterate over a JSONL stream:

# Awaiting a response parses the JSON body into a typed objectbots=awaitcbk.bot.list({"take": 10})
# Streaming iterates over typed stream items as they arriveasyncforitemincbk.bot.list({"take": 10}).stream():
print(item.type, item.data.id)

Methods accept either a generated request/params object from chatbotkit.types or a plain dict. Generated objects are serialized automatically.

Resource Operations

Bots

# List botsbots=awaitcbk.bot.list({"take": 10})
# Fetch a botbot=awaitcbk.bot.fetch("bot-id")
# Create a botbot=awaitcbk.bot.create({
"name": "My Bot",
"description": "A helpful assistant",
"backstory": "You are a friendly AI assistant.",
})
# Update a botbot=awaitcbk.bot.update("bot-id", {"name": "Updated Bot Name"})
# Delete a botresult=awaitcbk.bot.delete("bot-id")

Conversations

# Create a conversationconversation=awaitcbk.conversation.create({})
# List conversationsconversations=awaitcbk.conversation.list({"take": 10})
# Continue an existing conversationresult=awaitcbk.conversation.complete("conversation-id", {
"messages": [{"type": "user", "text": "Hello!"}],
})
# Or use the stateless endpoint by passing None as the conversation idresult=awaitcbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Hello!"}],
})

Datasets

# Create a datasetdataset=awaitcbk.dataset.create({"name": "Knowledge Base"})
# Add a recordrecord=awaitcbk.dataset.record.create("dataset-id", {
"text": "Important information...",
})
# Search the datasetresults=awaitcbk.dataset.search("dataset-id", {"text": "search query"})

Integrations

Each integration is reachable under cbk.integration and follows the same CRUD shape, with a few integration-specific extras (setup, initiate, sync):

# List Slack integrationsslack=awaitcbk.integration.slack.list({"take": 10})
# Create a widget integrationwidget=awaitcbk.integration.widget.create({"name": "Website Widget"})
# Trigger a sync for a sitemap integrationawaitcbk.integration.sitemap.sync("integration-id")

The full list of resources is shown under SDK Client above.

Streaming

Completions and list endpoints support streaming. Call .stream() on the returned Response to get an async iterator of typed stream items. Each item has a type (an enum) and a data payload:

fromchatbotkit.typesimportConversationCompleteStreamItemTypecompletion=cbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Write a short poem."}],
})
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
elifevent.type==ConversationCompleteStreamItemType.RESULT:
print("\nDone!")

Configuration Options

Options can be passed as keyword arguments or via a ClientOptions instance.

OptionDescription
secretAPI authentication token (required)
base_urlCustom API base URL
run_as_user_idExecute requests as a specific user
run_as_child_user_emailExecute requests as a specific child user
timezoneTimezone for timestamp handling
headersExtra headers to send with every request
timeoutRequest timeout in seconds
transportCustom httpx transport (useful for testing)
fromchatbotkitimportChatBotKit, ClientOptionscbk=ChatBotKit(ClientOptions(secret="your-api-key", timezone="UTC"))

Error Handling

Failed requests raise APIError, which carries the message, code, status, and URL returned by the API:

fromchatbotkitimportAPIErrortry:
bot=awaitcbk.bot.fetch("invalid-id")
exceptAPIErroraserror:
print(error.status_code, error.code, error.message)

Types

The chatbotkit.types module contains all request, response, and stream item types, generated from the ChatBotKit OpenAPI specification. Each type provides from_dict and to_dict helpers, and passing typed objects to resource methods is fully supported:

fromchatbotkit.typesimportBotCreateRequestbot=awaitcbk.bot.create(BotCreateRequest.from_dict({
"name": "My Bot",
"description": "Description",
}))

Documentation

  • Platform Documentation: Comprehensive guide to ChatBotKit here.
  • Platform Tutorials: Step-by-step tutorials for ChatBotKit here.

Contributing

Encounter a bug or want to contribute? Open an issue or submit a pull request on our official GitHub repository.

chatbotkit/types.py is generated and should not be edited by hand. To regenerate it from the latest API specification, run the type sync script from the platform repo:

pnpm --dir sites/main script:sync-types:python

Install the development dependencies and run the test suite with:

pip install -e ".[dev]"
pytest

License

See LICENSE for details.

About

Create conversational AI solutions with custom data and abilities using ChatBotKit for Python applications.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ChatBotKitCBK.AIEmailDiscordPyPIFollow on Twitter

 .d8888b. 888888b. 888 d8P
d88P Y88b 888 "88b 888 d8P
888 888 888 .88P 888 d8P
888 8888888K. 888d88K
888 888 "Y88b 8888888b
888 888 888 888 888 Y88b
Y88b d88P 888 d88P 888 Y88b
"Y8888P" 8888888P" 888 Y88b .ai

ChatBotKit Python SDK

The official async Python SDK for ChatBotKit - a platform for building and deploying conversational AI applications. With ChatBotKit you can create bots and agents with custom data, skillsets, and integrations while keeping AI orchestration on the ChatBotKit platform.

Why ChatBotKit?

Build lighter, future-proof AI agents. When you build with ChatBotKit, the heavy lifting happens on our servers, not in your application. This architectural advantage delivers:

  • 🪶 Lightweight Agents: Your agents stay lean because complex AI processing, model orchestration, and tool execution happen server-side. Less code in your app means faster load times and simpler maintenance.

  • 🛡️ Robust & Streamlined: Server-side processing provides a more reliable experience with built-in error handling, automatic retries, and consistent behavior across all platforms.

  • 🔄 Backward & Forward Compatible: As AI technology evolves with new models, new capabilities, and new paradigms, your agents automatically benefit. No code changes required on your end.

  • 🔮 Future-Proof: Agents you build today will remain capable tomorrow. When we add support for new AI models or capabilities, your existing agents gain those powers without any updates to your codebase.

This means you can focus on building great user experiences while ChatBotKit handles the complexity of the ever-changing AI landscape.

Installation

pip install chatbotkit

You can also install directly from GitHub:

pip install "chatbotkit @ git+https://github.com/chatbotkit/python-sdk.git"

Requires Python 3.10 or later. The SDK is fully async and built on httpx.

To use the optional agent helpers, install the agent extra:

pip install "chatbotkit[agent]"

Or install the agent extra directly from GitHub:

pip install "chatbotkit[agent] @ git+https://github.com/chatbotkit/python-sdk.git"

Then import from chatbotkit.agent:

fromchatbotkit.agentimportTool, execute

Development Checks

From sdks/python, run the same checks used by CI:

pip install -e ".[dev]"
python -m pytest tests
python -m compileall -q chatbotkit examples
python -m build
python -m twine check dist/*

The GitHub Actions workflow builds and checks publishable sdist and wheel artifacts. Publishing is manual and disabled by default until PyPI trusted publishing is configured.

Quick Start

importasynciofromchatbotkitimportChatBotKitfromchatbotkit.typesimportConversationCompleteStreamItemTypeasyncdefmain():
asyncwithChatBotKit(secret="your-api-key") ascbk:
completion=cbk.conversation.complete(
None,
{
"messages": [
{"type": "user", "text": "Hello! Tell me a joke."},
],
},
)
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
asyncio.run(main())

SDK Client

Create a client with your API key and access resources as attributes:

fromchatbotkitimportChatBotKitcbk=ChatBotKit(
secret="your-api-key",
base_url="https://api.chatbotkit.com", # optionalrun_as_user_id="user-id", # optionaltimezone="America/New_York", # optional
)
cbk.bot# Bot managementcbk.conversation# Conversation managementcbk.dataset# Dataset management (cbk.dataset.record)cbk.skillset# Skillset management (cbk.skillset.ability)cbk.file# File managementcbk.contact# Contact management (cbk.contact.conversation/secret/space/task)cbk.secret# Secret managementcbk.memory# Memory managementcbk.blueprint# Blueprint management (cbk.blueprint.resource/bulletin)cbk.task# Task management (cbk.task.execution)cbk.team# Team managementcbk.space# Space management (cbk.space.storage)cbk.partner# Partner management (cbk.partner.user.token)cbk.policy# Policy managementcbk.portal# Portal managementcbk.usage# Usage reporting (cbk.usage.series)cbk.magic# Magic AI generation (cbk.magic.prompt)cbk.event# Event log access (cbk.event.log)cbk.graphql# GraphQL operationscbk.channel# Channel publish/subscribecbk.platform# Platform content (doc, example, manual, model, tutorial, ...)cbk.integration# Integrations (widget, slack, discord, whatsapp, telegram,# messenger, instagram, notion, sitemap, support, extract,# twilio, email, mcp_server, microsoft_teams, google_chat,# trigger)

The client manages an underlying httpx.AsyncClient. Use it as an async context manager (async with ChatBotKit(...) as cbk:) or call await cbk.aclose() when you are done to release the connection pool.

Every resource method returns an awaitable Response. await it to parse a normal JSON response, or call .stream() to iterate over a JSONL stream:

# Awaiting a response parses the JSON body into a typed objectbots=awaitcbk.bot.list({"take": 10})
# Streaming iterates over typed stream items as they arriveasyncforitemincbk.bot.list({"take": 10}).stream():
print(item.type, item.data.id)

Methods accept either a generated request/params object from chatbotkit.types or a plain dict. Generated objects are serialized automatically.

Resource Operations

Bots

# List botsbots=awaitcbk.bot.list({"take": 10})
# Fetch a botbot=awaitcbk.bot.fetch("bot-id")
# Create a botbot=awaitcbk.bot.create({
"name": "My Bot",
"description": "A helpful assistant",
"backstory": "You are a friendly AI assistant.",
})
# Update a botbot=awaitcbk.bot.update("bot-id", {"name": "Updated Bot Name"})
# Delete a botresult=awaitcbk.bot.delete("bot-id")

Conversations

# Create a conversationconversation=awaitcbk.conversation.create({})
# List conversationsconversations=awaitcbk.conversation.list({"take": 10})
# Continue an existing conversationresult=awaitcbk.conversation.complete("conversation-id", {
"messages": [{"type": "user", "text": "Hello!"}],
})
# Or use the stateless endpoint by passing None as the conversation idresult=awaitcbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Hello!"}],
})

Datasets

# Create a datasetdataset=awaitcbk.dataset.create({"name": "Knowledge Base"})
# Add a recordrecord=awaitcbk.dataset.record.create("dataset-id", {
"text": "Important information...",
})
# Search the datasetresults=awaitcbk.dataset.search("dataset-id", {"text": "search query"})

Integrations

Each integration is reachable under cbk.integration and follows the same CRUD shape, with a few integration-specific extras (setup, initiate, sync):

# List Slack integrationsslack=awaitcbk.integration.slack.list({"take": 10})
# Create a widget integrationwidget=awaitcbk.integration.widget.create({"name": "Website Widget"})
# Trigger a sync for a sitemap integrationawaitcbk.integration.sitemap.sync("integration-id")

The full list of resources is shown under SDK Client above.

Streaming

Completions and list endpoints support streaming. Call .stream() on the returned Response to get an async iterator of typed stream items. Each item has a type (an enum) and a data payload:

fromchatbotkit.typesimportConversationCompleteStreamItemTypecompletion=cbk.conversation.complete(None, {
"messages": [{"type": "user", "text": "Write a short poem."}],
})
asyncforeventincompletion.stream():
ifevent.type==ConversationCompleteStreamItemType.TOKEN:
print(event.data.token, end="", flush=True)
elifevent.type==ConversationCompleteStreamItemType.RESULT:
print("\nDone!")

Configuration Options

Options can be passed as keyword arguments or via a ClientOptions instance.

OptionDescription
secretAPI authentication token (required)
base_urlCustom API base URL
run_as_user_idExecute requests as a specific user
run_as_child_user_emailExecute requests as a specific child user
timezoneTimezone for timestamp handling
headersExtra headers to send with every request
timeoutRequest timeout in seconds
transportCustom httpx transport (useful for testing)
fromchatbotkitimportChatBotKit, ClientOptionscbk=ChatBotKit(ClientOptions(secret="your-api-key", timezone="UTC"))

Error Handling

Failed requests raise APIError, which carries the message, code, status, and URL returned by the API:

fromchatbotkitimportAPIErrortry:
bot=awaitcbk.bot.fetch("invalid-id")
exceptAPIErroraserror:
print(error.status_code, error.code, error.message)

Types

The chatbotkit.types module contains all request, response, and stream item types, generated from the ChatBotKit OpenAPI specification. Each type provides from_dict and to_dict helpers, and passing typed objects to resource methods is fully supported:

fromchatbotkit.typesimportBotCreateRequestbot=awaitcbk.bot.create(BotCreateRequest.from_dict({
"name": "My Bot",
"description": "Description",
}))

Documentation

  • Platform Documentation: Comprehensive guide to ChatBotKit here.
  • Platform Tutorials: Step-by-step tutorials for ChatBotKit here.

Contributing

Encounter a bug or want to contribute? Open an issue or submit a pull request on our official GitHub repository.

chatbotkit/types.py is generated and should not be edited by hand. To regenerate it from the latest API specification, run the type sync script from the platform repo:

pnpm --dir sites/main script:sync-types:python

Install the development dependencies and run the test suite with:

pip install -e ".[dev]"
pytest

License

See LICENSE for details.

About

Create conversational AI solutions with custom data and abilities using ChatBotKit for Python applications.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages