Skip to main content

Python SDK for Qoder Agent

Project description

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.

Project details


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.2.tar.gz (340.1 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.2-py3-none-win_amd64.whl (68.5 MB view details)

Uploaded Python 3Windows x86-64

qoder_agent_sdk-1.0.2-py3-none-musllinux_1_2_x86_64.whl (48.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

qoder_agent_sdk-1.0.2-py3-none-musllinux_1_2_aarch64.whl (48.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

qoder_agent_sdk-1.0.2-py3-none-manylinux_2_17_x86_64.whl (49.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

qoder_agent_sdk-1.0.2-py3-none-manylinux_2_17_aarch64.whl (49.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

qoder_agent_sdk-1.0.2-py3-none-macosx_11_0_x86_64.whl (41.3 MB view details)

Uploaded Python 3macOS 11.0+ x86-64

qoder_agent_sdk-1.0.2-py3-none-macosx_11_0_arm64.whl (37.9 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: qoder_agent_sdk-1.0.2.tar.gz
  • Upload date:
  • Size: 340.1 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.2.tar.gz
Algorithm Hash digest
SHA256 ec2c2538956b5a9062af23fbbc4726689f7d802877bec594a3b62b302425810e
MD5 075aac37cbf90e423ab7d8808bf138d6
BLAKE2b-256 a76edc543016591405708843d5ce636368b47fc1fdb3d50b0e831bb62ca7ea85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 71b5589632e01ccc3b33a5cfefcdbded5eade0700deca72f6132cfbda71d0f1d
MD5 e4584cf4704097f5641baa07532a8d3a
BLAKE2b-256 0e327fdb28628cb66e2c239b79d82d54a281c0b9762a9c9ec1595061d1405386

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2955b2eeb1b581fabe9d334bc5385880f714f7c57d8993253b6d99e386ffdd38
MD5 a4f1ce58086dd39ae57779eebf9ae3e0
BLAKE2b-256 f852f59c1d425c0deaf54a355a1a47ef6b2e7947fb1fa5236425d9c1b8fafaaa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6ca01c5d6447253a45a09f2c2b7ae97954d503d2d00a29554e19b1d1a79ca687
MD5 2883dc0e91f7c821e483ffde72a1d337
BLAKE2b-256 c959c66820a34185370d2f4478cc2488fab56e3089d7f7f946e29954eab4da8f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.2-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 f4f2645b4e4d1f20fe75fc7dec804f778bbfe509a2767bfaa31063f857626f07
MD5 52bdd9b39a55325d4b68e4b5e5b913be
BLAKE2b-256 8e3acc0761428526e2cb4f03e09cb5959931c53f33a5ebc41281aca0d82da94f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.2-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 4cee1c30f0c1c3b169f9c2f755558ce41dd65ee078c18aa079144b264c31cc94
MD5 e67a1f5f21c19f117762f2aac1389b9d
BLAKE2b-256 28b542a60dab2635b6aff3534f225bb69a4415fdbca693e9bd0450bde3a21300

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.2-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 3ae2008f34252e5f70fbafaee752dcbb66771fbfc5ab010c2144ff6795b76c4c
MD5 57f4ad6e09c2665eb7f928c2acd3414d
BLAKE2b-256 ac59659e3fc5581c951f5dbbdb26f7917beb39ea140c55821a1207afd9a97e5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1072e2154edf3ce2e7a7c39d7541d67c35ce27f2130ec5149b9ef4bea6ce8b59
MD5 2f8ea297e4930668e7a141c75b493be9
BLAKE2b-256 76ecc20a7f3f6c9daf9e7970191a8a6b276c5cc3fcdf5083d1db63739567bf49

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page