feat(phase-2): workstream 2 — Python SDK (sentryagent-idp)
Sync (requests) and async (httpx) clients with identical API surface to the Node.js SDK. Delivered: - pyproject.toml — python>=3.9, hatchling build, mypy strict config - types.py — all 14-endpoint request/response dataclasses - errors.py — AgentIdPError with from_api_error, from_oauth2_error, network_error - token_manager.py — thread-safe sync TokenManager, 60s refresh buffer - async_token_manager.py — asyncio-safe AsyncTokenManager (httpx) - _request.py — shared sync/async request helper (DRY) - services/agents.py — AgentRegistryClient + AsyncAgentRegistryClient (5 methods each) - services/credentials.py — CredentialClient + AsyncCredentialClient (4 methods each) - services/token.py — TokenClient + AsyncTokenClient (introspect + revoke) - services/audit.py — AuditClient + AsyncAuditClient (query + get) - client.py — AgentIdPClient + AsyncAgentIdPClient - __init__.py — barrel exports - README.md — installation, quick start, full API reference QA gates: - mypy --strict: 0 errors (12 source files) - pytest: 57/57 passed - Coverage: 90.83% (required >= 80%) - All 14 endpoints covered (sync + async) - AgentIdPError raised on all failure paths Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
82
sdk-python/src/sentryagent_idp/__init__.py
Normal file
82
sdk-python/src/sentryagent_idp/__init__.py
Normal file
@@ -0,0 +1,82 @@
|
||||
"""
|
||||
SentryAgent.ai AgentIdP Python SDK.
|
||||
|
||||
Provides synchronous and asynchronous clients for the AgentIdP API.
|
||||
|
||||
Example (sync)::
|
||||
|
||||
from sentryagent_idp import AgentIdPClient
|
||||
|
||||
client = AgentIdPClient(
|
||||
base_url="http://localhost:3000",
|
||||
client_id="your-agent-id",
|
||||
client_secret="your-client-secret",
|
||||
)
|
||||
result = client.agents.list_agents()
|
||||
|
||||
Example (async)::
|
||||
|
||||
from sentryagent_idp import AsyncAgentIdPClient
|
||||
|
||||
client = AsyncAgentIdPClient(
|
||||
base_url="http://localhost:3000",
|
||||
client_id="your-agent-id",
|
||||
client_secret="your-client-secret",
|
||||
)
|
||||
result = await client.agents.list_agents()
|
||||
"""
|
||||
|
||||
from .client import AgentIdPClient, AsyncAgentIdPClient
|
||||
from .errors import AgentIdPError
|
||||
from .token_manager import TokenManager
|
||||
from .async_token_manager import AsyncTokenManager
|
||||
from .types import (
|
||||
Agent,
|
||||
AgentStatus,
|
||||
AgentType,
|
||||
AuditAction,
|
||||
AuditEvent,
|
||||
AuditOutcome,
|
||||
Credential,
|
||||
CredentialStatus,
|
||||
CredentialWithSecret,
|
||||
DeploymentEnv,
|
||||
IntrospectResponse,
|
||||
OAuthScope,
|
||||
PaginatedAgents,
|
||||
PaginatedAuditEvents,
|
||||
PaginatedCredentials,
|
||||
RegisterAgentRequest,
|
||||
TokenResponse,
|
||||
UpdateAgentRequest,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
# Clients
|
||||
"AgentIdPClient",
|
||||
"AsyncAgentIdPClient",
|
||||
# Errors
|
||||
"AgentIdPError",
|
||||
# Token managers (for advanced use)
|
||||
"TokenManager",
|
||||
"AsyncTokenManager",
|
||||
# Types
|
||||
"Agent",
|
||||
"AgentStatus",
|
||||
"AgentType",
|
||||
"AuditAction",
|
||||
"AuditEvent",
|
||||
"AuditOutcome",
|
||||
"Credential",
|
||||
"CredentialStatus",
|
||||
"CredentialWithSecret",
|
||||
"DeploymentEnv",
|
||||
"IntrospectResponse",
|
||||
"OAuthScope",
|
||||
"PaginatedAgents",
|
||||
"PaginatedAuditEvents",
|
||||
"PaginatedCredentials",
|
||||
"RegisterAgentRequest",
|
||||
"TokenResponse",
|
||||
"UpdateAgentRequest",
|
||||
]
|
||||
Reference in New Issue
Block a user