Ship trust-first CLI and runtime defaults
This commit is contained in:
parent
fb718af154
commit
5d63e4c16e
26 changed files with 894 additions and 134 deletions
|
|
@ -10,6 +10,13 @@ from collections.abc import Callable
|
|||
from typing import Any, Final, cast
|
||||
|
||||
from pyro_mcp.api import Pyro
|
||||
from pyro_mcp.vm_manager import (
|
||||
DEFAULT_ALLOW_HOST_COMPAT,
|
||||
DEFAULT_MEM_MIB,
|
||||
DEFAULT_TIMEOUT_SECONDS,
|
||||
DEFAULT_TTL_SECONDS,
|
||||
DEFAULT_VCPU_COUNT,
|
||||
)
|
||||
|
||||
__all__ = ["Pyro", "run_ollama_tool_demo"]
|
||||
|
||||
|
|
@ -39,8 +46,9 @@ TOOL_SPECS: Final[list[dict[str, Any]]] = [
|
|||
"timeout_seconds": {"type": "integer"},
|
||||
"ttl_seconds": {"type": "integer"},
|
||||
"network": {"type": "boolean"},
|
||||
"allow_host_compat": {"type": "boolean"},
|
||||
},
|
||||
"required": ["environment", "command", "vcpu_count", "mem_mib"],
|
||||
"required": ["environment", "command"],
|
||||
"additionalProperties": False,
|
||||
},
|
||||
},
|
||||
|
|
@ -61,7 +69,7 @@ TOOL_SPECS: Final[list[dict[str, Any]]] = [
|
|||
"type": "function",
|
||||
"function": {
|
||||
"name": "vm_create",
|
||||
"description": "Create an ephemeral VM with explicit vCPU and memory sizing.",
|
||||
"description": "Create an ephemeral VM with optional resource sizing.",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
|
@ -70,8 +78,9 @@ TOOL_SPECS: Final[list[dict[str, Any]]] = [
|
|||
"mem_mib": {"type": "integer"},
|
||||
"ttl_seconds": {"type": "integer"},
|
||||
"network": {"type": "boolean"},
|
||||
"allow_host_compat": {"type": "boolean"},
|
||||
},
|
||||
"required": ["environment", "vcpu_count", "mem_mib"],
|
||||
"required": ["environment"],
|
||||
"additionalProperties": False,
|
||||
},
|
||||
},
|
||||
|
|
@ -192,6 +201,12 @@ def _require_int(arguments: dict[str, Any], key: str) -> int:
|
|||
raise ValueError(f"{key} must be an integer")
|
||||
|
||||
|
||||
def _optional_int(arguments: dict[str, Any], key: str, *, default: int) -> int:
|
||||
if key not in arguments:
|
||||
return default
|
||||
return _require_int(arguments, key)
|
||||
|
||||
|
||||
def _require_bool(arguments: dict[str, Any], key: str, *, default: bool = False) -> bool:
|
||||
value = arguments.get(key, default)
|
||||
if isinstance(value, bool):
|
||||
|
|
@ -211,27 +226,37 @@ def _dispatch_tool_call(
|
|||
pyro: Pyro, tool_name: str, arguments: dict[str, Any]
|
||||
) -> dict[str, Any]:
|
||||
if tool_name == "vm_run":
|
||||
ttl_seconds = arguments.get("ttl_seconds", 600)
|
||||
timeout_seconds = arguments.get("timeout_seconds", 30)
|
||||
ttl_seconds = arguments.get("ttl_seconds", DEFAULT_TTL_SECONDS)
|
||||
timeout_seconds = arguments.get("timeout_seconds", DEFAULT_TIMEOUT_SECONDS)
|
||||
return pyro.run_in_vm(
|
||||
environment=_require_str(arguments, "environment"),
|
||||
command=_require_str(arguments, "command"),
|
||||
vcpu_count=_require_int(arguments, "vcpu_count"),
|
||||
mem_mib=_require_int(arguments, "mem_mib"),
|
||||
vcpu_count=_optional_int(arguments, "vcpu_count", default=DEFAULT_VCPU_COUNT),
|
||||
mem_mib=_optional_int(arguments, "mem_mib", default=DEFAULT_MEM_MIB),
|
||||
timeout_seconds=_require_int({"timeout_seconds": timeout_seconds}, "timeout_seconds"),
|
||||
ttl_seconds=_require_int({"ttl_seconds": ttl_seconds}, "ttl_seconds"),
|
||||
network=_require_bool(arguments, "network", default=False),
|
||||
allow_host_compat=_require_bool(
|
||||
arguments,
|
||||
"allow_host_compat",
|
||||
default=DEFAULT_ALLOW_HOST_COMPAT,
|
||||
),
|
||||
)
|
||||
if tool_name == "vm_list_environments":
|
||||
return {"environments": pyro.list_environments()}
|
||||
if tool_name == "vm_create":
|
||||
ttl_seconds = arguments.get("ttl_seconds", 600)
|
||||
ttl_seconds = arguments.get("ttl_seconds", DEFAULT_TTL_SECONDS)
|
||||
return pyro.create_vm(
|
||||
environment=_require_str(arguments, "environment"),
|
||||
vcpu_count=_require_int(arguments, "vcpu_count"),
|
||||
mem_mib=_require_int(arguments, "mem_mib"),
|
||||
vcpu_count=_optional_int(arguments, "vcpu_count", default=DEFAULT_VCPU_COUNT),
|
||||
mem_mib=_optional_int(arguments, "mem_mib", default=DEFAULT_MEM_MIB),
|
||||
ttl_seconds=_require_int({"ttl_seconds": ttl_seconds}, "ttl_seconds"),
|
||||
network=_require_bool(arguments, "network", default=False),
|
||||
allow_host_compat=_require_bool(
|
||||
arguments,
|
||||
"allow_host_compat",
|
||||
default=DEFAULT_ALLOW_HOST_COMPAT,
|
||||
),
|
||||
)
|
||||
if tool_name == "vm_start":
|
||||
return pyro.start_vm(_require_str(arguments, "vm_id"))
|
||||
|
|
@ -275,10 +300,10 @@ def _run_direct_lifecycle_fallback(pyro: Pyro) -> dict[str, Any]:
|
|||
return pyro.run_in_vm(
|
||||
environment="debian:12",
|
||||
command=NETWORK_PROOF_COMMAND,
|
||||
vcpu_count=1,
|
||||
mem_mib=512,
|
||||
vcpu_count=DEFAULT_VCPU_COUNT,
|
||||
mem_mib=DEFAULT_MEM_MIB,
|
||||
timeout_seconds=60,
|
||||
ttl_seconds=600,
|
||||
ttl_seconds=DEFAULT_TTL_SECONDS,
|
||||
network=True,
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue