DevOps Bot Desktop SDK — thin client for the AgentOS Electron desktop app
Project description
DevOpsBot SDK
Python client for the DevOpsBot desktop app. Provides the agentos CLI to configure credentials and a BackendClient to interact with the DevOpsBot backend.
Private package — requires GitHub access to install.
For a full walkthrough including SSH setup, end-to-end testing, and troubleshooting see SETUP_GUIDE.md.
Requirements
| Minimum | Check | |
|---|---|---|
| Python | 3.11+ | python3 --version (Linux/macOS) · python --version (Windows) |
| Git | any | git --version |
| DevOpsBot account | — | Needed for your API token |
Installation
Choose the method that fits your setup. Option A (venv) is recommended for developers. Option B (system Python) works for everyone else and requires no extra steps.
Option A — Virtual environment (recommended for developers)
A virtual environment keeps the SDK isolated from your system Python.
Linux / macOS:
# Create and activate a venv
python3 -m venv devopsbot-env
source devopsbot-env/bin/activate
# Install via SSH
pip install "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git"
# OR install via HTTPS token
pip install "git+https://<YOUR_GITHUB_TOKEN>@github.com/consultancy-outfit/DevOpsBot-SDK.git"
Windows (Command Prompt):
python -m venv devopsbot-env
devopsbot-env\Scripts\activate
pip install "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git"
Windows (PowerShell):
python -m venv devopsbot-env
devopsbot-env\Scripts\Activate.ps1
pip install "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git"
The venv must be activated every time you open a new terminal before using
agentosor running SDK scripts. You only create it once.
Option B — System Python (simplest, works for everyone)
Installs directly into your default Python environment — no activation needed.
Linux / macOS:
# via SSH
pip3 install --break-system-packages "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git"
# via HTTPS token
pip3 install --break-system-packages "git+https://<YOUR_GITHUB_TOKEN>@github.com/consultancy-outfit/DevOpsBot-SDK.git"
Windows:
# via SSH
pip install "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git"
# via HTTPS token
pip install "git+https://<YOUR_GITHUB_TOKEN>@github.com/consultancy-outfit/DevOpsBot-SDK.git"
--break-system-packagesis required on Ubuntu 22.04+ and Debian 12+ due to PEP 668. It is safe — it only installs this package, it does not affect your system Python. Windows does not need this flag.
If
pipis not found on Windows, usepython -m pip install ...instead.
With optional collectors
Append [all] to either install command to enable screen capture and process listing:
Linux / macOS (system Python):
pip3 install --break-system-packages "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git[all]"
Linux / macOS (venv, after activation):
pip install "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git[all]"
Windows:
pip install "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git[all]"
Configure
Get your API token from DevOpsBot Web App → Settings → API Tokens → Generate Token.
Token format: co_<uuid>_<32-hex-secret>
agentos configure
To replace an existing token:
agentos configure --rotate
Quick Start
import asyncio
from sdk import BackendClient
async def main():
client = BackendClient.from_config() # reads ~/.agentos/config.toml
profile = await client.bootstrap()
print(f"Logged in — tier: {profile.tier}")
async for envelope in client.chat("my-thread", "What tasks are open?"):
if envelope.type == "delta":
print(envelope.data["text"], end="", flush=True)
elif envelope.type == "done":
print()
break
asyncio.run(main())
Agents
The orchestrator runs AI agent pipelines server-side. You submit a task, receive a stream of progress envelopes, and approve or reject the outcome.
Run an agent
import asyncio
from sdk import BackendClient
from sdk.models.requests import OrchestratorRequest
async def main():
client = BackendClient.from_config()
req = OrchestratorRequest(
task_input="hello",
intent="greet", # optional — helps the backend route the task
)
async for envelope in client.orchestrator_run(req):
print(f"[{envelope.type}] {envelope.data}")
if envelope.type == "awaiting_approval":
# Task needs a human decision before it continues
task_id = envelope.data["task_id"]
decision = input("Approve? (yes/no): ").strip().lower()
await client.approve_task(
task_id,
decision="approved" if decision == "yes" else "rejected",
note="Reviewed and approved by operator.",
)
elif envelope.type in ("done", "error"):
break
asyncio.run(main())
Envelope types emitted by the orchestrator
| Type | When it fires | Useful data |
|---|---|---|
pipeline_started |
Task accepted by backend | task_id |
pipeline.<key> |
A pipeline context field updated | key, value |
awaiting_approval |
Pipeline paused — human decision required | task_id |
done |
Pipeline completed | task_id, approval_status |
error |
Unrecoverable failure | code, message |
List and approve tasks
import asyncio
from sdk import BackendClient
async def main():
client = BackendClient.from_config()
# List tasks waiting for approval
result = await client.list_tasks(status="To Do", limit=20)
for task in result.get("tasks", []):
print(task["task_id"], task.get("summary", ""))
# Approve a specific task by ID
await client.approve_task("task-id-here", decision="approved", note="LGTM")
asyncio.run(main())
Test agents end-to-end (no repo clone needed)
Linux / macOS
python3 - << 'EOF'
import asyncio
from sdk import BackendClient
from sdk.models.requests import OrchestratorRequest
async def main():
client = BackendClient.from_config()
print("Starting agent pipeline...")
req = OrchestratorRequest(task_input="hello")
async for envelope in client.orchestrator_run(req):
print(f" [{envelope.type}] {envelope.data}")
if envelope.type == "awaiting_approval":
print(" → Auto-approving for test...")
await client.approve_task(envelope.data["task_id"], decision="approved")
elif envelope.type == "done":
print("\nAgent completed successfully.")
break
elif envelope.type == "error":
print(f"\nAgent error: {envelope.data}")
break
asyncio.run(main())
EOF
Windows (PowerShell)
python - << 'EOF'
import asyncio
from sdk import BackendClient
from sdk.models.requests import OrchestratorRequest
async def main():
client = BackendClient.from_config()
print("Starting agent pipeline...")
req = OrchestratorRequest(task_input="hello")
async for envelope in client.orchestrator_run(req):
print(f" [{envelope.type}] {envelope.data}")
if envelope.type == "awaiting_approval":
print(" -> Auto-approving for test...")
await client.approve_task(envelope.data["task_id"], decision="approved")
elif envelope.type == "done":
print("\nAgent completed successfully.")
break
elif envelope.type == "error":
print(f"\nAgent error: {envelope.data}")
break
asyncio.run(main())
EOF
Windows (Command Prompt)
Save as test_agent.py and run python test_agent.py:
# test_agent.py
import asyncio
from sdk import BackendClient
from sdk.models.requests import OrchestratorRequest
async def main():
client = BackendClient.from_config()
print("Starting agent pipeline...")
req = OrchestratorRequest(task_input="hello")
async for envelope in client.orchestrator_run(req):
print(f" [{envelope.type}] {envelope.data}")
if envelope.type == "awaiting_approval":
print(" -> Auto-approving for test...")
await client.approve_task(envelope.data["task_id"], decision="approved")
elif envelope.type == "done":
print("\nAgent completed successfully.")
break
elif envelope.type == "error":
print(f"\nAgent error: {envelope.data}")
break
asyncio.run(main())
Expected output
Starting agent pipeline...
[pipeline_started] {'task_id': 'tsk_abc123'}
[pipeline.summary] {'key': 'summary', 'value': 'Processing...'}
[awaiting_approval] {'task_id': 'tsk_abc123'}
-> Auto-approving for test...
[done] {'task_id': 'tsk_abc123', 'approval_status': 'approved'}
Agent completed successfully.
Error Handling
from sdk import BackendClient, TokenNotConfigured, BackendAuthFailed, BackendUnreachable
try:
client = BackendClient.from_config()
await client.ping()
except TokenNotConfigured:
print("Run: agentos configure")
except BackendAuthFailed:
print("Token expired — run: agentos configure --rotate")
except BackendUnreachable as e:
print(f"Backend unreachable: {e}")
Upgrade
Linux / macOS (system Python):
pip3 install --break-system-packages --upgrade "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git"
Linux / macOS (venv — activate first):
source devopsbot-env/bin/activate
pip install --upgrade "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git"
Windows:
pip install --upgrade "git+ssh://git@github.com/consultancy-outfit/DevOpsBot-SDK.git"
Uninstall
Remove the SDK package
Linux / macOS (system Python):
pip3 uninstall devops-bot-sdk -y
Linux / macOS (venv — activate first):
source devopsbot-env/bin/activate
pip uninstall devops-bot-sdk -y
Windows:
pip uninstall devops-bot-sdk -y
Remove the venv entirely (if you used one)
Linux / macOS:
rm -rf devopsbot-env
Windows (Command Prompt):
rmdir /s /q devopsbot-env
Windows (PowerShell):
Remove-Item -Recurse -Force devopsbot-env
Remove saved credentials
Deletes the stored token and backend URL from your machine.
Linux / macOS:
rm -rf ~/.agentos
Windows (Command Prompt):
rmdir /s /q %USERPROFILE%\.agentos
Windows (PowerShell):
Remove-Item -Recurse -Force $HOME\.agentos
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file devops_bot_sdk-1.4.13.tar.gz.
File metadata
- Download URL: devops_bot_sdk-1.4.13.tar.gz
- Upload date:
- Size: 70.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6b7dc94e3c4e3a958361b15dfdca7e84f277e2d48ead90951c6701db67d71f0
|
|
| MD5 |
5d8da53692998fac9bc94332200eb10f
|
|
| BLAKE2b-256 |
e3daffc155f0236bc7ace3926a9c1c6da4597a2e90846dd8e9df70dce015881c
|
Provenance
The following attestation bundles were made for devops_bot_sdk-1.4.13.tar.gz:
Publisher:
publish.yml on consultancy-outfit/DevOpsBot-SDK
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
devops_bot_sdk-1.4.13.tar.gz -
Subject digest:
d6b7dc94e3c4e3a958361b15dfdca7e84f277e2d48ead90951c6701db67d71f0 - Sigstore transparency entry: 1935065492
- Sigstore integration time:
-
Permalink:
consultancy-outfit/DevOpsBot-SDK@f2758485b4dceb6b99696bb078c39f62c6c73d4d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/consultancy-outfit
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f2758485b4dceb6b99696bb078c39f62c6c73d4d -
Trigger Event:
push
-
Statement type:
File details
Details for the file devops_bot_sdk-1.4.13-py3-none-any.whl.
File metadata
- Download URL: devops_bot_sdk-1.4.13-py3-none-any.whl
- Upload date:
- Size: 80.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
47ac338a68e4b1a3906f14bca86e9164d60aa6fd1c66a663469fe453b4f2e2e9
|
|
| MD5 |
056bfd6cd4c8db5f422e0f16c9e60d87
|
|
| BLAKE2b-256 |
2042f1587dd28264671102bc83c4429fa6c374e6350528ed6b2bd320e6ab83a3
|
Provenance
The following attestation bundles were made for devops_bot_sdk-1.4.13-py3-none-any.whl:
Publisher:
publish.yml on consultancy-outfit/DevOpsBot-SDK
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
devops_bot_sdk-1.4.13-py3-none-any.whl -
Subject digest:
47ac338a68e4b1a3906f14bca86e9164d60aa6fd1c66a663469fe453b4f2e2e9 - Sigstore transparency entry: 1935065518
- Sigstore integration time:
-
Permalink:
consultancy-outfit/DevOpsBot-SDK@f2758485b4dceb6b99696bb078c39f62c6c73d4d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/consultancy-outfit
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f2758485b4dceb6b99696bb078c39f62c6c73d4d -
Trigger Event:
push
-
Statement type: