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

Uploaded Python 3Windows x86-64

qoder_agent_sdk-1.0.0-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.0-py3-none-musllinux_1_2_aarch64.whl (48.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

qoder_agent_sdk-1.0.0-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.0-py3-none-manylinux_2_17_aarch64.whl (49.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

qoder_agent_sdk-1.0.0-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.0-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.0.tar.gz.

File metadata

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

File hashes

Hashes for qoder_agent_sdk-1.0.0.tar.gz
Algorithm Hash digest
SHA256 09490dfbd1afd629c3ade6299942c3d870fa311b7cb515edec92446b7aeadd2d
MD5 eb7aa46939433103b0f8479b255198aa
BLAKE2b-256 8b63de98afe4e8674c2e665b503edb62897e73d7fcb7ca53e562851b07f24164

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 0aeb59628d1fe21ee12689d712c5ace6021f8d33f58e5998b9a626ee821ed733
MD5 45e8c6ca91e14b7b13d87ec427891e3c
BLAKE2b-256 317e1534c417049ff2b99daa49b7f38a1fe766334ff477f72b340dacb15a7d3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9dc2e4d31a85b9d73b7b391f77861132ac7fa55ad4dceafb975a90451e7a0780
MD5 8d0b9d80d380d69ee2d9798d91481c1b
BLAKE2b-256 aaa9a4edd53b307006a77b1f4f3e7f5192965e8913b18a6d4657db12738b27ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f70299c5b9fdb7be659b01da5c36c05c45e02b9b0b4b02c42f6d0a93d50e8a32
MD5 cb5fe2117466c34fd2f5089492f42840
BLAKE2b-256 79fc6624ef5c1ebb2347c4978448c24b16a2ba96509713d5b7050c86425db0c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.0-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 6e2e5dfad29181cb97ac987e92d4090e912ed02d55968b6e79c03dca7988d0a6
MD5 2a363956326ae7242754c29c277c6002
BLAKE2b-256 3a639348ac38b64c3169880324430cad149499aaf46ec0e7526096f3188d92a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.0-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 4c91ef2c18fb45aa5f67881bec227dbc5dd9b65363ce0835dfb86a346276c5b4
MD5 9f9c50b11e7f3a41bccb46320c64275c
BLAKE2b-256 3e079e76cfc6dbe377441b76e198e989876303489dabfa566ca2b34bfecc9488

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.0-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 d8a4bb7faa14b1e4274deb61980520410bcdfdf83c7fac3380a51bfcb2290281
MD5 13c5eab14027d2064b51cb52f51d1d1f
BLAKE2b-256 8e59c6701fdf8ecb264ab7f5342615d78e4a99217e7a77691dd696127e82a7ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for qoder_agent_sdk-1.0.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9dbbdcda7711ca541418a2582b1f5c9b24e88d505dd83dc1087be114c786211e
MD5 98b4d5c9bb7d81530ffb770e964ce321
BLAKE2b-256 310724e9580309b860d5aef874cc00d374e51d29601e2354372fdb98e1cac56f

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