teamver-agent-sdk
Official Teamver Agent SDK for agent runtimes (e.g. OpenClaw, Hermes).
변경 이력
| 일시 (KST) | 변경 내용 |
|---|---|
| 2026-09-21 16:15 | 0.6.15: inbox 출고 시도/성공 커서 · doctor deliver_ok · adapter tools-rpc |
| 2026-09-21 15:50 | 0.6.14: inbox 툴 기본 숨김 · webhook timestamp skew · from_token staging · echo queue skip |
| 2026-09-21 14:40 | 0.6.13: 채널 SSOT plugin/hostd · inbox opt-in · CIS HMAC · agent upload · staging env |
This directory is the source of truth. Publish to PyPI; do not fork it into ns-teamver-agents/packages.
One facade (TeamverAgent + AgentToolAdapter) for:
- Channels — list / post / read / react
- DM — threads open / read / post
- Drive — list / download / upload (presigned)
- Mail — via
teamver-mail-agent - Jobs · heartbeat · SSE events
- agent tools —
adapter.list_tools()/adapter.dispatch(...)
Install
pip install teamver-agent-sdk
python -m teamver_agent_sdk required-env # what a human must provide
python -m teamver_agent_sdk channels # ACL list (SDK fallbacks only)
python -m teamver_agent_sdk files # ACL shared-drive files (alias: drive-list)
python -m teamver_agent_sdk dm # agent DM threads (alias: dm-list)
TEAMVER_AGENT_TOKEN may be tv_ak_* or an OpenClaw oc-sent-v….end sentinel.
OpenClaw sentinel (권장 실행): Gateway가 HTTPS egress에서 sentinel을 tv_ak_*로 치환한다. CLI는 gateway 안에서 실행한다.
# OpenClaw VM / gateway_exec — substitution happens on egress
python -m teamver_agent_sdk doctor --probe
# Local shell without the proxy: sentinel will not become tv_ak_. Use a real tv_ak_ or gateway_exec.
Pulls in teamver-mail-agent and teamver-sdk-core. Python ≥ 3.11.
What a human must provide
Only TEAMVER_AGENT_TOKEN (tv_ak_*). Workspace id (W-… or O-…) and agent id (AG2-…) are discovered via GET /api/v2/ai-agents/me. Do not ask someone to copy those from the Teamver web UI.
Channel/DM auto-reply is not this SDK. Product OpenClaw uses the channel plugin + hostd turn (docs_specs/39). SDK can still read/write channel messages as a tool. The automatic conversation loop is not rewritten here — 설명: docs_reference/agent/03. inbox.poll / inbox.reply / adapter :8788 are opt-in for external workers. Set TEAMVER_INBOX_REPLY=1 only when you intentionally run a second loop. Product default is off so hostd and SDK cannot double-answer.
GET /api/v2/ai-agents/me response example
Main BE (not Agents). 200:
{
"workspace_id": "W-1a2b3c",
"agent_id": "AG2-9f8e7d",
"name": "한돌",
"handle": "handol",
"scopes": ["messages:read", "messages:write", "channels:read"],
"channels": {
"items": [
{"channel_id": "CH-aaa111", "name": "한돌ch2", "visibility": "public"},
{"channel_id": "CH-bbb222", "name": "한돌ch1", "visibility": "public"}
],
"total": 2
},
"drives": {
"items": [
{
"shared_drive_id": "SD-ccc333",
"name": "한돌 Drive",
"can_read": true,
"can_write": true
}
],
"total": 1
},
"dm": {"applied_enabled": true},
"report_channel_id": "CH-bbb222"
}
401: { "error": { "code": "invalid_token", "message": "Missing or invalid agent token", "retryable": false, "request_id": "req_…", "details": {} } }
Public contract: teamver-sdk-docs api-reference.
| env | purpose | default |
|---|---|---|
TEAMVER_AGENT_TOKEN |
channel/DM/Drive/jobs grant (tv_ak_*) |
required |
TEAMVER_ENV |
staging → stg-api.teamver.com (and staging mail/agent hosts) |
production |
TEAMVER_MAIN_API_BASE |
Main API host (no /api). Wins over TEAMVER_ENV |
https://api.teamver.com |
TEAMVER_INBOX_REPLY |
Enable inbox.reply (external worker). Product default 0 |
0 |
TEAMVER_WEBHOOK_SECRET |
W4 inbox HMAC. Alias: TEAMVER_CHANNEL_INGRESS_SECRET (tv_cis_) |
— |
TEAMVER_WEBHOOK_MAX_SKEW_SECONDS |
Reject stale HMAC timestamps. 0 disables |
600 |
TEAMVER_MAIL_AGENT_TOKEN |
mail agent token (tv_agent_*) |
— (mail only) |
TEAMVER_AGENT_API_BASE |
Agents BE host (jobs / heartbeat) | https://agent-api.teamver.com |
TEAMVER_AGENTS_API_BASE |
alias of the above (OpenClaw openclaw.env) |
used if TEAMVER_AGENT_API_BASE is unset |
TEAMVER_WORKSPACE_ID |
workspace id (W-… / O-…) |
optional — auto from token |
TEAMVER_AGENT_ID |
agent id (AG2-…) |
optional — auto from token |
TEAMVER_CONTROL_PLANE_TOKEN |
Agents whoami fallback (tv_cp_*) |
— (identity fallback only) |
Staging: TEAMVER_ENV=staging or set TEAMVER_MAIN_API_BASE=https://stg-api.teamver.com. Do not use the site host https://stg.teamver.com as an API base.
Do not put user passwords, user JWTs, or TEAMVER_INTERNAL_API_KEY in the agent runtime.
Quick start
import asyncio
from teamver_agent_sdk import TeamverAgent, AgentToolAdapter
async def main():
agent = await TeamverAgent.connect() # token → /me → workspace + agent id
who = await agent.whoami()
channels = await agent.channel.list_channels() # ACL accessible-channels
await agent.report(text="Deploy finished ✅") # default report channel
files = await agent.drive.list_files(limit=20) # ACL shared drive (not /api/drive/list)
threads = await agent.dm.list_threads(limit=10)
# Channel auto-receive is plugin + hostd. Do not enable inbox.reply here.
adapter = AgentToolAdapter(agent)
await adapter.dispatch("teamver_whoami", {})
await adapter.dispatch("teamver_drive_list_files", {})
await agent.aclose()
asyncio.run(main())
TeamverAgent() still works when ids are already in env. Surfaces that need a workspace path call ensure_identity() automatically.
Opt-in inbox worker (TEAMVER_INBOX_REPLY=1)
Not the product OpenClaw path. Use only for an external worker. HMAC accepts TEAMVER_WEBHOOK_SECRET or TEAMVER_CHANNEL_INGRESS_SECRET.
# export TEAMVER_INBOX_REPLY=1
for item in await agent.inbox.poll(store=store):
await agent.inbox.reply(item, "received", store=store)
# result = await agent.inbox.handle_webhook(raw_body, headers, store=store)
| ID | What | Channel message created? |
|---|---|---|
| W1 | Event webhook (Access UI) | No — notification only |
| W3 | Plugin /teamver/webhook loopback + tv_cis_ |
Yes, via hostd/plugin |
| W4 | SDK handle_webhook / adapter :8788 |
Only if inbox.reply is on |
Do not bind adapter :8788 on 0.0.0.0 in a product guest.
CLI
python -m teamver_agent_sdk required-env # print human prompt (no network)
python -m teamver_agent_sdk whoami # GET /ai-agents/me
python -m teamver_agent_sdk doctor --probe # identity + live channel/DM/files read
python -m teamver_agent_sdk channels # ACL channels
python -m teamver_agent_sdk files # ACL shared-drive files
Documentation
Public docs: github.com/NeuralStudioKr/teamver-sdk-docs/tree/main/agent-sdk
License
MIT — see LICENSE.
Metadata
Release files for teamver-agent-sdk 0.6.15
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| teamver_agent_sdk-0.6.15.tar.gz | 84.0 kB | Without provenance | Details for teamver_agent_sdk-0.6.15.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| teamver_agent_sdk-0.6.15-py3-none-any.whl | Python 3 | none | any | Details for teamver_agent_sdk-0.6.15-py3-none-any.whl |
Total release size: 151.7 kB
Release files / teamver_agent_sdk-0.6.15.tar.gz
| Download URL | teamver_agent_sdk-0.6.15.tar.gz |
|---|---|
| Size | 84.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b204d2c62468dc34583ace1e3ea393e50bac20bc6a99541879b5d0171d62203b
|
|
BLAKE2b-256 checksum How to use checksums |
0a1726b8e1545a784a0192a648ba0524abde8e9996353373496e2e51249d8c3c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.9
|
Release files / teamver_agent_sdk-0.6.15-py3-none-any.whl
| Download URL | teamver_agent_sdk-0.6.15-py3-none-any.whl |
|---|---|
| Size | 67.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1e09d3185c16bf60213e9ccd756a607a53d7be6788cf76a318130cce4eaa14e2
|
|
BLAKE2b-256 checksum How to use checksums |
cc99f795388f0369ba7586e7b2c52a70d39ce4cc8868c3007ee6933ff841c9e5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.9
|
Security for teamver-agent-sdk 0.6.15
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.