Skip to main content

Qoder Agent SDK for Python

Python SDK for building applications on top of Qoder Agent.

The SDK starts qodercli for you, streams agent messages back to Python, and lets your application configure tools, permissions, working directories, MCP servers, hooks, and interactive sessions.

Installation

pip install qoder-agent-sdk

Prerequisites:

  • Python 3.10+
  • A Qoder account or another authentication method supported by your host application

CLI Behavior

Published platform wheels include a bundled qodercli, so a separate CLI installation is not required for normal SDK use. If you prefer to use a system-wide CLI or a pinned local build, pass QoderAgentOptions(cli_path=...).

Authentication

Every SDK query needs an explicit authentication option.

To reuse the local qodercli login state:

from qoder_agent_sdk import QoderAgentOptions, qodercli_auth

options = QoderAgentOptions(auth=qodercli_auth())

To authenticate with a personal access token:

Generate a Personal Access Token at qoder.com/account/integrations:

  1. Sign in to your Qoder account.
  2. Open the integrations page.
  3. Create a new PAT, choosing the expiry and scopes you need.
  4. Copy the token immediately. The value cannot be retrieved again after the page is closed.

Use separate tokens for local scripts, CI, and production services when possible, so each environment can be revoked independently. Do not hard-code tokens in source code.

from qoder_agent_sdk import QoderAgentOptions, access_token_from_env

options = QoderAgentOptions(auth=access_token_from_env())

access_token_from_env() reads QODER_PERSONAL_ACCESS_TOKEN by default.

Quick Start

import anyio
from qoder_agent_sdk import QoderAgentOptions, qodercli_auth, query


async def main() -> None:
    options = QoderAgentOptions(auth=qodercli_auth())

    async for message in query(
        prompt="What is 2 + 2?",
        options=options,
    ):
        print(message)


anyio.run(main)

Basic Usage

query() runs a single SDK query and returns an async iterator of response messages.

from qoder_agent_sdk import (
    AssistantMessage,
    QoderAgentOptions,
    TextBlock,
    qodercli_auth,
    query,
)

options = QoderAgentOptions(
    auth=qodercli_auth(),
    system_prompt="You are a helpful assistant.",
    max_turns=1,
)

async for message in query(prompt="Explain this repository", options=options):
    if isinstance(message, AssistantMessage):
        for block in message.content:
            if isinstance(block, TextBlock):
                print(block.text)

Tools and Permissions

Qoder Agent can use tools such as file reads, file edits, shell commands, and MCP tools. allowed_tools is an approval allowlist: listed tools are auto-approved, while unlisted tools continue through permission_mode and can_use_tool for a decision. It does not remove tools from the agent's available toolset. To block tools, use disallowed_tools.

from qoder_agent_sdk import QoderAgentOptions, qodercli_auth, query

options = QoderAgentOptions(
    auth=qodercli_auth(),
    allowed_tools=["Read", "Edit"],
    disallowed_tools=["Bash"],
    permission_mode="acceptEdits",
)

async for message in query(
    prompt="Update the README introduction.",
    options=options,
):
    print(message)

For application-specific approval flows, provide can_use_tool:

from qoder_agent_sdk import (
    PermissionResultAllow,
    PermissionResultDeny,
    QoderAgentOptions,
    ToolPermissionContext,
    qodercli_auth,
)


async def can_use_tool(
    tool_name: str,
    tool_input: dict,
    context: ToolPermissionContext,
):
    if tool_name == "Bash":
        return PermissionResultDeny(message="Shell commands are disabled here.")
    return PermissionResultAllow()


options = QoderAgentOptions(
    auth=qodercli_auth(),
    can_use_tool=can_use_tool,
)

Working Directory

Use cwd to run the agent in a specific project directory:

from pathlib import Path

from qoder_agent_sdk import QoderAgentOptions, qodercli_auth

options = QoderAgentOptions(
    auth=qodercli_auth(),
    cwd=Path("/path/to/project"),
)

Interactive Sessions

Use QoderSDKClient when you need a long-lived, bidirectional session instead of a single query() call.

from qoder_agent_sdk import QoderAgentOptions, QoderSDKClient, qodercli_auth

options = QoderAgentOptions(auth=qodercli_auth())

async with QoderSDKClient(options=options) as client:
    await client.query("Inspect this project and summarize the main modules.")

    async for message in client.receive_response():
        print(message)

QoderSDKClient is useful for chat interfaces, follow-up prompts, interrupts, runtime permission changes, MCP server management, and other workflows that need state across multiple turns.

Custom Tools

You can expose Python functions to Qoder Agent as in-process SDK MCP servers. This avoids managing a separate MCP subprocess for simple application-local tools.

from qoder_agent_sdk import (
    QoderAgentOptions,
    QoderSDKClient,
    create_sdk_mcp_server,
    qodercli_auth,
    tool,
)


@tool("greet", "Greet a user", {"name": str})
async def greet_user(args):
    return {
        "content": [
            {"type": "text", "text": f"Hello, {args['name']}!"}
        ]
    }


server = create_sdk_mcp_server(
    name="my-tools",
    version="1.0.0",
    tools=[greet_user],
)

options = QoderAgentOptions(
    auth=qodercli_auth(),
    mcp_servers={"tools": server},
    allowed_tools=["mcp__tools__greet"],
)

async with QoderSDKClient(options=options) as client:
    await client.query("Greet Alice.")
    async for message in client.receive_response():
        print(message)

Hooks

Hooks are deterministic Python callbacks invoked at specific points in the agent loop. They are useful for validation, policy checks, logging, and application-specific feedback.

from qoder_agent_sdk import HookMatcher, QoderAgentOptions, qodercli_auth


async def block_script(input_data, tool_use_id, context):
    if input_data["tool_name"] != "Bash":
        return {}

    command = input_data["tool_input"].get("command", "")
    if "./deploy.sh" in command:
        return {
            "hookSpecificOutput": {
                "hookEventName": "PreToolUse",
                "permissionDecision": "deny",
                "permissionDecisionReason": "Deployment scripts require review.",
            }
        }
    return {}


options = QoderAgentOptions(
    auth=qodercli_auth(),
    hooks={
        "PreToolUse": [
            HookMatcher(matcher="Bash", hooks=[block_script]),
        ],
    },
)

Error Handling

from qoder_agent_sdk import (
    CLIConnectionError,
    CLIJSONDecodeError,
    CLINotFoundError,
    ProcessError,
    QoderAgentOptions,
    QoderSDKError,
    qodercli_auth,
    query,
)

try:
    async for message in query(
        prompt="Hello Qoder",
        options=QoderAgentOptions(auth=qodercli_auth()),
    ):
        print(message)
except CLINotFoundError:
    print("qodercli was not found. Install a platform wheel or set cli_path.")
except CLIConnectionError as exc:
    print(f"Connection failed: {exc}")
except ProcessError as exc:
    print(f"qodercli exited with code {exc.exit_code}")
except CLIJSONDecodeError as exc:
    print(f"Could not parse qodercli output: {exc}")
except QoderSDKError as exc:
    print(f"SDK error: {exc}")

License and Terms

Copyright (c) 2026 Qoder

Use of this software is governed by the Qoder Product Service Terms:

https://qoder.com/product-service

By installing or using this package, you agree to those terms.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qoder_agent_sdk-1.0.9.tar.gz (352.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

qoder_agent_sdk-1.0.9-py3-none-win_amd64.whl (59.9 MB view details)

Uploaded Python 3Windows x86-64

qoder_agent_sdk-1.0.9-py3-none-musllinux_1_2_x86_64.whl (49.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

qoder_agent_sdk-1.0.9-py3-none-musllinux_1_2_aarch64.whl (48.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

qoder_agent_sdk-1.0.9-py3-none-manylinux_2_17_x86_64.whl (50.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

qoder_agent_sdk-1.0.9-py3-none-manylinux_2_17_aarch64.whl (49.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

qoder_agent_sdk-1.0.9-py3-none-macosx_11_0_x86_64.whl (41.7 MB view details)

Uploaded Python 3macOS 11.0+ x86-64

qoder_agent_sdk-1.0.9-py3-none-macosx_11_0_arm64.whl (37.7 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file qoder_agent_sdk-1.0.9.tar.gz.

File metadata

  • Download URL: qoder_agent_sdk-1.0.9.tar.gz
  • Upload date:
  • Size: 352.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.14

File hashes

Hashes for qoder_agent_sdk-1.0.9.tar.gz
Algorithm Hash digest
SHA256 55e6df3679cef9e78476646309cf3ccbe2763a24b2c2090b6396681bb8f7a861
MD5 c3268d3a985f5f5695b6290cd116210e
BLAKE2b-256 ee4b365b30bdce7ba4b15ead11c0c8a452d07e144f6e0ac361ca719b42d785b5

See more details on using hashes here.

File details

Details for the file qoder_agent_sdk-1.0.9-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.9-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 e4c85e882022e73f9327dd892b0c42b8ffc11ce5d55a3c06a192b07eafd31dd6
MD5 fb7764c8e6a15644ab41b134cf14c305
BLAKE2b-256 339d2a0c2cbd2a357be558e7af3b57f4a9bc48dee3533b6ad14f6c383c754ef4

See more details on using hashes here.

File details

Details for the file qoder_agent_sdk-1.0.9-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.9-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6f3cbff5cc0687a0768cd554477b47be381b4490258ce8d903eb769e633c01a3
MD5 fdf8d701d158d72010e5fce770395d0b
BLAKE2b-256 2b73eb60a43c2dd8c5cd59bc1f2ec63a72b94c72d26034a7bfa357df6b2eef01

See more details on using hashes here.

File details

Details for the file qoder_agent_sdk-1.0.9-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.9-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a6319a2dd209ee56b177d60a8fb0e1fd536785030096e49f51b17f1f7c789e2d
MD5 b5be35d700d99ca28fbfba4fc54e2551
BLAKE2b-256 8d84e6059d2e0c18dec8f615655b8fa4b027c1d3777d3f4d60c44af2ba3cb6e0

See more details on using hashes here.

File details

Details for the file qoder_agent_sdk-1.0.9-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.9-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 c127d606046263a6acc545d8c1271d9885708e6fab5b5428bd893567af12b296
MD5 ba2a45916cf1838ede4cf2351ad61181
BLAKE2b-256 62141e8a57896c38f147f0c98f58e58d9994ef1650c3dc5fd03f139a81395c89

See more details on using hashes here.

File details

Details for the file qoder_agent_sdk-1.0.9-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.9-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 888a46133abe1524823c18f1874cd84aad36c3e3ba708884c8d91498efd34c43
MD5 c9e031b6432e911d81720f86e9660774
BLAKE2b-256 24b016c0e65e62092402d538e6a3154c223294ef9f899e6d997c9cc263e76418

See more details on using hashes here.

File details

Details for the file qoder_agent_sdk-1.0.9-py3-none-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.9-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 360f25389bd795146bd6a7bcae4abac7ada2ffe115448e1b6e8b95d65005d4b3
MD5 afdab2113b557d9c6ef81f5bdddc7b1c
BLAKE2b-256 437f84e5ee41d10e7ad3b313bbe9ddf8585e1ec149c2e1c21647be8a2cd080d6

See more details on using hashes here.

File details

Details for the file qoder_agent_sdk-1.0.9-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.9-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1239d42e2c82cb4d67f4abc451e7baae696e8b803a1d42a7eb6ee9d2811493ee
MD5 ed99f8063abbe153206522cd6f0687a0
BLAKE2b-256 5b26913f95260f645c4775adfc3a496248d51abb219c26a3e37a59f822a41987

See more details on using hashes here.

Release history Release notifications | RSS feed

1.0.13

8 files

1.0.12

8 files

1.0.11

8 files

1.0.10

8 files

This release

1.0.9 This release

8 files

1.0.8

8 files

1.0.5

8 files

1.0.2

8 files

1.0.1

8 files

1.0.0

8 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page