Skip to main content

cteno-sdk (Python)

Run Cteno agents from Python — same protocol and shape as the Node package @cteno/sdk. Standard library only, Python ≥ 3.9, asyncio.

The platform wheels (macOS arm64/x64, Linux x64 with glibc ≥ 2.34, Windows x64; Linux arm64 is not supported yet) include the Cteno daemon. CtenoSession.open() starts it in local mode on first use: no desktop app, no account, your own model key.

Install

pip install cteno-sdk

On a platform without a wheel pip falls back to the sdist, which has no daemon: set CTENO_SDK_DAEMON_PATH to a cteno-host-cli binary, or pass socket_path to a daemon you run yourself.

Quickstart

import asyncio, os
from cteno_sdk import CtenoSession

async def main():
    async with await CtenoSession.open() as cteno:          # starts the bundled daemon if needed
        await cteno.configure_model(base_url="https://api.openai.com/v1", model="gpt-4.1-mini",
                                    api_key=os.environ["OPENAI_API_KEY"])   # once; stays the default
        sid = await cteno.create(cwd=".")
        result = await cteno.run(sid, "Reply with exactly: hello from Cteno")
        print(result.text if result.ok else result.error)   # hello from Cteno
        await cteno.close_session(sid)

asyncio.run(main())

base_url is used as given: include the API version (https://api.openai.com/v1, https://api.deepseek.com/anthropic/v1, https://generativelanguage.googleapis.com/v1beta); the SDK appends only the resource path. A base that is missing or repeats a version segment makes configure_model() raise SdkError naming the full URL it would have requested. result.ok is False when the turn failed (model 404/401/429, quota, timeout); result.error is the original error text and result.error_kind its class.

Tools that are not read-only are denied at once unless you approve them:

result = await cteno.run(sid, "Run the tests", can_use_tool=lambda req: req["tool_name"] == "Bash")

can_use_tool may be async and may return {"allow": False, "reason": "..."}. The daemon keeps running after your process exits; await stop_daemon() stops it.

Your own agent

import asyncio
from cteno_sdk import CtenoSession, AgentSpec, ClientTool

async def search_places(args, ctx):          # runs in YOUR process
    return {"name": "Quiet Corner Cafe", "keyword": args["keyword"]}

async def main():
    async with await CtenoSession.open() as cteno:      # bundled daemon, or open("/path/to/host.sock")
        sid = await cteno.create(model="my-profile", spec=AgentSpec(
            system_prompt="You are a city guide.",
            tools={"allow": []},
            client_tools=[ClientTool("search_places", "Search places",
                                     {"type": "object", "properties": {"keyword": {"type": "string"}},
                                      "required": ["keyword"]},
                                     handler=search_places)],
            limits={"maxIterations": 10, "turnTimeoutMs": 60_000},
        ))
        result = await cteno.run(sid, "Somewhere quiet for coffee?", timeout=90)
        print(result.ok, result.text, result.tool_calls)
        await cteno.close_session(sid)

asyncio.run(main())

AgentSpec (custom prompt, client tools, terminal tools, output schema, limits, history, tenant) is supported by the bundled daemon; with an explicit socket_path to another daemon it needs ≥ 2.10.10 ("sdk-session-spec-v1" in await cteno.capabilities()). See the repository README for authentication and compatibility, and the Node README for the full spec field reference (same fields, snake_case here).

Tests

python -m unittest discover -s tests

License

MIT. The daemon binaries under cteno_sdk/_bin are not MIT; see cteno_sdk/_bin/LICENSE.daemon in the wheel.

Metadata

Release files for cteno-sdk 2.10.16

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cteno-sdk 2.10.16
File Size Uploaded Provenance Actions
cteno_sdk-2.10.16.tar.gz 26.1 kB Without provenance Details for cteno_sdk-2.10.16.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for cteno-sdk 2.10.16
File Actions
cteno_sdk-2.10.16-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details for cteno_sdk-2.10.16-py3-none-win_amd64.whl
cteno_sdk-2.10.16-py3-none-manylinux_2_34_x86_64.whl Python 3 none Linux glibc 2.34+ x86-64 Details for cteno_sdk-2.10.16-py3-none-manylinux_2_34_x86_64.whl
cteno_sdk-2.10.16-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details for cteno_sdk-2.10.16-py3-none-macosx_11_0_arm64.whl
cteno_sdk-2.10.16-py3-none-macosx_10_15_x86_64.whl Python 3 none macOS 10.15+ x86-64 Details for cteno_sdk-2.10.16-py3-none-macosx_10_15_x86_64.whl

Total release size: 269.4 MB

Release files / cteno_sdk-2.10.16.tar.gz

Download URL cteno_sdk-2.10.16.tar.gz
Size 26.1 kB
Tags Source
SHA-256 checksum
How to use checksums
0c2bab3509f00a040688b2e67a094d83ae7bb95aa4de7f7e272d9d3506ee8a60
BLAKE2b-256 checksum
How to use checksums
134a9394bafe9f686378c5de7e69395e55dd908abedd64d7a0ea97f8d2886c2b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / cteno_sdk-2.10.16-py3-none-win_amd64.whl

Download URL cteno_sdk-2.10.16-py3-none-win_amd64.whl
Size 53.6 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
d7b881d1a8ba92f4bcea153d63c6ac4faae42069c76ada01b314b2e3c1e6ceed
BLAKE2b-256 checksum
How to use checksums
fef9176e1bac266331481849fdefef421bb57f78c06ead0738578e266fd6058b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / cteno_sdk-2.10.16-py3-none-manylinux_2_34_x86_64.whl

Download URL cteno_sdk-2.10.16-py3-none-manylinux_2_34_x86_64.whl
Size 49.9 MB
Tags Linux glibc 2.34+ x86-64 Python 3
SHA-256 checksum
How to use checksums
fef412f0b86a851945cec0f241ef050e12d2333323d706767c0f60cccc5c3c99
BLAKE2b-256 checksum
How to use checksums
976180ffa437c5688b0e9ab2fe55bbba8eeaa8cca4820a7e76cc0edad04fde50
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / cteno_sdk-2.10.16-py3-none-macosx_11_0_arm64.whl

Download URL cteno_sdk-2.10.16-py3-none-macosx_11_0_arm64.whl
Size 81.4 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
cb966569935950cb19dfe08ed05da0c8ba37bdb9b1e3f9d2fda19bba56c1b411
BLAKE2b-256 checksum
How to use checksums
2b345f2e038a785301681f6af15291a57df5057164ae4a16846b5495990fc05a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / cteno_sdk-2.10.16-py3-none-macosx_10_15_x86_64.whl

Download URL cteno_sdk-2.10.16-py3-none-macosx_10_15_x86_64.whl
Size 84.5 MB
Tags Python 3 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
e01e4c2325529fc412ce4bc3ecd41a33de0006d1a9ca91c4bec575ac7102a5a9
BLAKE2b-256 checksum
How to use checksums
36dce4c0710723665021d940f10a9665b8f45fc2ac89397ea279366ba14c8b14
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for cteno-sdk 2.10.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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