Skip to content

feat!: align Python SDK with Symbiont OSS runtime v1.14.3#5

Merged
jaschadub merged 1 commit into
mainfrom
feat/oss-runtime-1.14.3-parity
May 31, 2026
Merged

feat!: align Python SDK with Symbiont OSS runtime v1.14.3#5
jaschadub merged 1 commit into
mainfrom
feat/oss-runtime-1.14.3-parity

Conversation

@jaschadub
Copy link
Copy Markdown
Contributor

Summary

Brings the Python SDK to exact parity with the Symbiont OSS runtime v1.14.3 HTTP surface and removes everything that targeted endpoints the OSS runtime does not serve. Validated by cross-checking every remaining SDK call against the runtime route table in crates/runtime/src/api/server.rs.

⚠️ Breaking change — see "Removed" below. Version bumped 1.11.0 → 1.14.3.

Added (real OSS endpoints the SDK was missing)

Method Route
execute_agent POST /api/v1/agents/{id}/execute
send_message POST /api/v1/agents/{id}/messages
receive_messages GET /api/v1/agents/{id}/messages
get_message_status GET /api/v1/messages/{id}/status
send_heartbeat POST /api/v1/agents/{id}/heartbeat
push_agent_event POST /api/v1/agents/{id}/events

Fixed

  • /api/v1 double-prefix bug. Default base_url already includes /api/v1, but ~12 methods hard-coded an extra api/v1/, producing /api/v1/api/v1/... (404). Client._request now de-duplicates the version segment in one place; base URLs with a different prefix are untouched.
  • execute_workflowPOST /api/v1/workflows/execute (was /workflows).
  • get_agent_statusGET /api/v1/agents/{id}/status (was /agents/{id}).

Removed (BREAKING)

Endpoints/modules the OSS runtime does not expose over HTTP (every call returned 404):

  • Client methods: get_agent_metrics, re_execute_agent; all tool-review, secrets, MCP-management, knowledge/RAG/vector, DSL/deploy, http-input, http-endpoint, memory, and communication-rule methods.
  • Modules: reasoning_client.py, reasoning.py, toolclad.py, qdrant.py, memory.py (+ client.reasoning / client.toolclad accessors).
  • MetricsClient trimmed to get_metrics()GET /api/v1/metrics; the /metrics/snapshot|scheduler|system|export methods were removed.
  • Retained client-side helpers (no runtime dependency): AgentPin verification, webhook signature verification, skill scanning, markdown memory store.

Validation

  • Every remaining SDK HTTP call maps to a real OSS route; zero phantom paths.
  • Intentionally unwrapped: /ws/chat (WebSocket), /health/live, /health/ready (probes).
  • black + ruff clean; test suite 131 passed (new tests/test_oss_endpoints.py covers the added methods + prefix de-dup).

20 files changed, +469 / −2902.

Brings the SDK to exact parity with the Symbiont OSS runtime v1.14.3 HTTP
surface (the ~41 routes served by crates/runtime/src/api/server.rs) and
removes everything that targeted endpoints the OSS runtime does not serve.

Added (real OSS endpoints the SDK was missing):
- execute_agent      -> POST /api/v1/agents/{id}/execute
- send_message       -> POST /api/v1/agents/{id}/messages
- receive_messages   -> GET  /api/v1/agents/{id}/messages
- get_message_status -> GET  /api/v1/messages/{id}/status
- send_heartbeat     -> POST /api/v1/agents/{id}/heartbeat
- push_agent_event   -> POST /api/v1/agents/{id}/events

Fixed:
- /api/v1 double-prefix bug. The default base_url already includes /api/v1,
  but ~12 methods hard-coded an extra "api/v1/" in the endpoint, producing
  "/api/v1/api/v1/..." (404). Client._request now de-duplicates the version
  segment in one place; base URLs with a different prefix are untouched, so
  custom deployments and existing URL-construction tests are unaffected.
- execute_workflow now targets POST /api/v1/workflows/execute (was /workflows).
- get_agent_status now targets GET /api/v1/agents/{id}/status (was /agents/{id}).

Removed (BREAKING) — endpoints/modules the OSS runtime does not expose, every
call to which returned 404:
- Client methods: get_agent_metrics, re_execute_agent, and all tool-review,
  secrets, MCP-management, knowledge/RAG/vector, DSL/deploy, http-input,
  http-endpoint, memory, and communication-rule methods.
- Modules: reasoning_client.py, reasoning.py, toolclad.py, qdrant.py,
  memory.py (and the client.reasoning / client.toolclad accessors).
- MetricsClient trimmed to get_metrics() -> GET /api/v1/metrics; the former
  /metrics/snapshot|scheduler|system|export methods were removed. Client-side
  exporters (File/OTLP/Collector) are unchanged.
- Retained client-side helpers (no runtime dependency): AgentPin verification,
  webhook signature verification, skill scanning, markdown memory store.

Validated: remaining SDK HTTP surface cross-checked against the runtime route
table in crates/runtime/src/api/server.rs — every call maps to a real OSS
route, zero phantom paths remain. Intentionally unwrapped: /ws/chat and the
/health/live, /health/ready probes.

Version: 1.11.0 -> 1.14.3 (tracks the runtime). black + ruff clean;
test suite 131 passed.
@jaschadub jaschadub force-pushed the feat/oss-runtime-1.14.3-parity branch from 60bea4a to af1d971 Compare May 31, 2026 00:32
@jaschadub jaschadub merged commit 1f5b39f into main May 31, 2026
3 of 8 checks passed
@jaschadub jaschadub deleted the feat/oss-runtime-1.14.3-parity branch May 31, 2026 18:38
jaschadub added a commit that referenced this pull request May 31, 2026
The CI "Security check with bandit" step (`bandit -r symbiont/`) failed on a
single LOW-severity B105 (hardcoded_password_string) false positive: the
human-readable validation error string "JWT secret key required when refresh
tokens enabled" assigned to errors["auth.jwt_secret_key"]. It is an error
message, not a secret.

The line already carried a `# nosec B105` suppression, but it stopped working
after black wrapped the assignment across multiple lines: bandit attributes
the finding to the statement-start line (`errors[...] = (`), while the nosec
comment ended up on the following (string-literal) line, so they no longer
matched and bandit exited 1.

Fix: bind the message to a plainly-named local (`message`) first, then assign
it. The dict value is now a Name node rather than a string literal, so B105
does not fire at all — robust against future reformatting, no nosec needed.

Verified locally: `bandit -r symbiont/` -> exit 0 ("No issues identified");
`ruff check symbiont/ tests/` clean; `black --check` clean; pytest 131 passed.

Note: PR #5 was merged while this CI step was red (the other test jobs were
cancelled by concurrency, masking that only the bandit step truly failed).
This commit lands the fix directly on main.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant