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.5.tar.gz (346.7 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.5-py3-none-win_amd64.whl (59.7 MB view details)

Uploaded Python 3Windows x86-64

qoder_agent_sdk-1.0.5-py3-none-musllinux_1_2_x86_64.whl (49.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

qoder_agent_sdk-1.0.5-py3-none-musllinux_1_2_aarch64.whl (48.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

qoder_agent_sdk-1.0.5-py3-none-manylinux_2_17_x86_64.whl (49.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

qoder_agent_sdk-1.0.5-py3-none-manylinux_2_17_aarch64.whl (49.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

qoder_agent_sdk-1.0.5-py3-none-macosx_11_0_x86_64.whl (41.5 MB view details)

Uploaded Python 3macOS 11.0+ x86-64

qoder_agent_sdk-1.0.5-py3-none-macosx_11_0_arm64.whl (37.5 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: qoder_agent_sdk-1.0.5.tar.gz
  • Upload date:
  • Size: 346.7 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.5.tar.gz
Algorithm Hash digest
SHA256 4f7b2321b7a00785078cb20a968c060f8903310387d01621404fc22a7a897cae
MD5 e4e5be68c35e6ecee141867724dc46a4
BLAKE2b-256 c4b4a499e9d8b0b5f2d5d12daec1469d97b4dff77f273cf70ddd3ee5fa171c6b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.5-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 98d7e085421d9a4ac02a043034746c99e507f8778ce86ed913a74dd357f4ea73
MD5 6b5f13c1c7b2b9729bffa51f9b09f148
BLAKE2b-256 4c78e9d4289c67836ee401ac63b43ec30a72cc003290de1b32792084714ff8ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.5-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a03cb67cb36901ef6d08ed899ef2f39fed8763a218bf8f43d5c0942549b9024c
MD5 7d6d0386b2354bee22a256ec35600265
BLAKE2b-256 acb235976f9ad8029a161eb350615ad628fa49b52e9cab332e84ba6f2558af61

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.5-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e86446756974531d474618d7f1ced2a4d02a97e7fa5dcc61df8d4a91a7feb02b
MD5 9daec71be6ff9c54fc1906ec542aa34f
BLAKE2b-256 fdd85a5ef9a585b05d45cb5a9e29e4bb47adbd76c652c8fd776b32e02d94865d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.5-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 05d34ce7366c8fa49a7791b8f593a241ed59cee978d992d89d910d4b345b4979
MD5 c1bf649ce3fb9d80b3b3336214285e2c
BLAKE2b-256 2819709c1c99a55df06915715bb30776eeada14319d434bf9bbf5ea20754edcd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.5-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 af228af52b780fa81aebac1593a7b062a64e3c5eec82f896992260877c7d8ccc
MD5 7bb9db14314d4c94ecf357b7d4c26e84
BLAKE2b-256 c28f846195407c8307fea87ef866ce338d66eb67662577f1d69073dbd6cefa25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.5-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 087d4e1a99c4172e042dffa9530b32988bc4d5ce287d22cbdbe0a8592e19dbb3
MD5 ccc24e7f712ce004b8a6a4a59991329f
BLAKE2b-256 f60502d0451f730c38a42daa703a488057f285cdde657141e075c18256e32d25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.5-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d522e8dea2556dc62eea9c7b39a53bda15d6f5ea9bbd1b7fc8e96d95f6f08bc9
MD5 b37b2f175b0936849c79efe7e820e0e6
BLAKE2b-256 29435c331b9f2af7c8484526b9a64dec27b683f9197c3f77ba93d3a8a46a3560

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