Skip to content

Commit 0195581

Browse files
fix: address critical issues in managed agents implementation
- Replace raw HTTP calls with proper SDK methods in CLI commands - Fix ExecutionConfig constructor to remove invalid compute_provider param - Map sandbox_type to proper code_sandbox_mode parameter - Fix trace emission to use actual ContextTraceEmitter API methods - Remove unnecessary getattr usage in tests per Ruff B009 - Add proper error exit codes for CLI command failures - Agents use archive() instead of delete() per Anthropic SDK Fixes all critical issues identified by CodeRabbit review. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Mervin Praison <MervinPraison@users.noreply.github.com>
1 parent 7e5eb36 commit 0195581

File tree

3 files changed

+48
-26
lines changed

3 files changed

+48
-26
lines changed

src/praisonai/praisonai/cli/commands/managed.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -550,11 +550,12 @@ def sessions_delete(
550550

551551
client = _get_client()
552552
try:
553-
# For Anthropic managed agents, delete via API
554-
response = client.delete(f"/v1/agent_sessions/{session_id}")
553+
# Use SDK resource method
554+
client.beta.sessions.delete(session_id)
555555
typer.secho(f"Session {session_id} deleted", fg="green")
556556
except Exception as e:
557557
typer.secho(f"Failed to delete session: {e}", fg="red")
558+
raise typer.Exit(1)
558559

559560

560561
@agents_app.command("delete")
@@ -571,10 +572,12 @@ def agents_delete(
571572

572573
client = _get_client()
573574
try:
574-
response = client.delete(f"/v1/agents/{agent_id}")
575-
typer.secho(f"Agent {agent_id} deleted", fg="green")
575+
# Agents use archive, not delete
576+
client.beta.agents.archive(agent_id)
577+
typer.secho(f"Agent {agent_id} archived", fg="green")
576578
except Exception as e:
577-
typer.secho(f"Failed to delete agent: {e}", fg="red")
579+
typer.secho(f"Failed to archive agent: {e}", fg="red")
580+
raise typer.Exit(1)
578581

579582

580583
@envs_app.command("update")
@@ -586,21 +589,23 @@ def envs_update(
586589
"""Update a managed environment."""
587590
if not name and not description:
588591
typer.echo("Must specify at least --name or --description")
589-
return
592+
raise typer.Exit(0)
590593

591594
client = _get_client()
592595
try:
593-
data = {}
596+
# Use SDK resource method
597+
kwargs = {}
594598
if name:
595-
data["name"] = name
599+
kwargs["name"] = name
596600
if description:
597-
data["description"] = description
601+
kwargs["description"] = description
598602

599-
response = client.patch(f"/v1/environments/{env_id}", json=data)
603+
response = client.beta.environments.update(env_id, **kwargs)
600604
typer.secho(f"Environment {env_id} updated", fg="green")
601-
typer.echo(json.dumps(response.json(), indent=2))
605+
typer.echo(str(response))
602606
except Exception as e:
603607
typer.secho(f"Failed to update environment: {e}", fg="red")
608+
raise typer.Exit(1)
604609

605610

606611
@envs_app.command("delete")
@@ -617,10 +622,12 @@ def envs_delete(
617622

618623
client = _get_client()
619624
try:
620-
response = client.delete(f"/v1/environments/{env_id}")
625+
# Use SDK resource method
626+
client.beta.environments.delete(env_id)
621627
typer.secho(f"Environment {env_id} deleted", fg="green")
622628
except Exception as e:
623629
typer.secho(f"Failed to delete environment: {e}", fg="red")
630+
raise typer.Exit(1)
624631

625632

626633
# ─────────────────────────────────────────────────────────────────────────────

src/praisonai/praisonai/integrations/managed_local.py

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -545,11 +545,15 @@ def _ensure_agent(self) -> Any:
545545
execution_config = None
546546
if self._compute:
547547
from praisonaiagents import ExecutionConfig
548+
# Map sandbox_type to proper code_sandbox_mode
549+
sandbox_type = self._cfg.get("sandbox_type", "subprocess")
550+
code_sandbox_mode = "sandbox" if sandbox_type == "subprocess" else "direct"
548551
execution_config = ExecutionConfig(
549552
code_execution=True,
550-
code_mode=self._cfg.get("sandbox_type", "subprocess"),
551-
compute_provider=self._compute
553+
code_mode=self._cfg.get("code_mode", "safe"),
554+
code_sandbox_mode=code_sandbox_mode
552555
)
556+
# Compute provider is managed directly by this backend
553557

554558
agent_kwargs: Dict[str, Any] = {
555559
"name": name,
@@ -923,16 +927,27 @@ def _emit_trace_event(self, event_type: str, data: Dict[str, Any]) -> None:
923927
try:
924928
from praisonaiagents.trace import get_context_emitter
925929
emitter = get_context_emitter()
926-
if emitter and hasattr(emitter, 'emit_action'):
927-
emitter.emit_action(
928-
action_type=event_type,
929-
data={
930-
**data,
931-
"agent_id": self.agent_id,
932-
"provider": self.provider,
933-
"timestamp": time.time()
934-
}
935-
)
930+
if emitter:
931+
# Map managed event types to ContextTraceEmitter methods
932+
enhanced_data = {
933+
**data,
934+
"agent_id": self.agent_id,
935+
"provider": self.provider,
936+
"timestamp": time.time()
937+
}
938+
939+
if event_type.startswith("managed.session"):
940+
if "created" in event_type or "start" in event_type:
941+
emitter.session_start(enhanced_data)
942+
elif "reset" in event_type:
943+
emitter.session_end(enhanced_data)
944+
elif event_type.startswith("managed.execution"):
945+
if "start" in event_type:
946+
emitter.agent_start(enhanced_data)
947+
elif "complete" in event_type or "error" in event_type:
948+
emitter.agent_end(enhanced_data)
949+
# For other events, we could add a generic emit if available
950+
# or just log them for now
936951
except Exception as e:
937952
logger.debug("[local_managed] trace emit failed: %s", e)
938953

src/praisonai/tests/unit/integrations/test_managed_agents.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,8 @@ def test_managed_agent_protocol_compliance():
184184
assert hasattr(local_agent, 'reset_all')
185185

186186
# Test method signatures exist and are callable
187-
assert callable(getattr(local_agent, 'execute'))
188-
assert callable(getattr(local_agent, 'stream'))
187+
assert callable(local_agent.execute)
188+
assert callable(local_agent.stream)
189189

190190

191191
@pytest.mark.asyncio

0 commit comments

Comments
 (0)