Wl6adams's picture
Organize private Nexum release into Lite, Universal, and Expanded profiles
9a70a84
Raw
History Blame Contribute Delete
6.22 kB
"""Portable protocol projections over the Nexum runtime boundary."""
from __future__ import annotations
import json
import uuid
from typing import Any, Callable
from nexum_core.api import NEXUM_CORE_VERSION
from .capabilities import capabilities
from .executor import advertised_tool_spec, execute_tool_call, runtime_tool_schemas
from .tooling.contracts import tool_call_from_openai
def agent_card(base_url: str) -> dict[str, Any]:
skills = [
{
"id": row.capability_id,
"name": row.name,
"description": row.description,
"tags": list(row.surfaces),
}
for row in capabilities()
if row.available
]
return {
"name": "Nexum",
"description": "Private universal tool model served through NNF X.",
"url": base_url.rstrip("/") + "/a2a",
"version": NEXUM_CORE_VERSION,
"protocolVersion": "0.3.0",
"capabilities": {
"streaming": False,
"pushNotifications": False,
"stateTransitionHistory": True,
},
"defaultInputModes": ["text/plain", "application/json"],
"defaultOutputModes": ["text/plain", "application/json"],
"skills": skills,
}
def mcp_tools() -> list[dict[str, Any]]:
rows: list[dict[str, Any]] = []
for schema in runtime_tool_schemas():
function = schema.get("function")
if not isinstance(function, dict):
continue
rows.append(
{
"name": str(function.get("name") or ""),
"description": str(function.get("description") or ""),
"inputSchema": function.get("parameters") or {"type": "object"},
"annotations": schema.get("x-nexum") or {},
}
)
return rows
def mcp_request(
payload: dict[str, Any],
*,
workspace: str,
session_id: str,
tools_enabled: bool,
) -> dict[str, Any]:
request_id = payload.get("id")
method = str(payload.get("method") or "")
def success(result: dict[str, Any]) -> dict[str, Any]:
return {"jsonrpc": "2.0", "id": request_id, "result": result}
if method == "initialize":
return success(
{
"protocolVersion": "2025-11-25",
"capabilities": {"tools": {"listChanged": False}},
"serverInfo": {
"name": "Nexum NNF X",
"version": NEXUM_CORE_VERSION,
},
}
)
if method == "ping":
return success({})
if method == "tools/list":
return success({"tools": mcp_tools()})
if method == "tools/call":
if not tools_enabled:
raise PermissionError("server tool execution is disabled")
params = payload.get("params")
if not isinstance(params, dict):
raise ValueError("tools/call params must be an object")
call_id = str(params.get("call_id") or "call_" + uuid.uuid4().hex)
call = tool_call_from_openai(
{
"id": call_id,
"type": "function",
"function": {
"name": str(params.get("name") or ""),
"arguments": params.get("arguments") or {},
},
"x-nexum": params.get("x-nexum") or {},
}
)
selected_spec = advertised_tool_spec(call.name)
if selected_spec is not None and selected_spec.execution_owner != "runtime":
raise ValueError("caller-owned tools cannot execute through local MCP")
result = execute_tool_call(
call,
cwd=workspace,
session_id=session_id,
)
payload_result = result.to_dict()
return success(
{
"content": [{"type": "text", "text": json.dumps(payload_result, sort_keys=True)}],
"structuredContent": payload_result,
"isError": not result.ok,
}
)
raise ValueError(f"unsupported MCP method: {method}")
def a2a_request(
payload: dict[str, Any],
*,
run_agent: Callable[[dict[str, Any]], dict[str, Any]],
) -> dict[str, Any]:
request_id = payload.get("id")
method = str(payload.get("method") or "")
if method != "message/send":
raise ValueError(f"unsupported delegated-agent method: {method}")
params = payload.get("params")
if not isinstance(params, dict):
raise ValueError("delegated-agent params must be an object")
message = params.get("message")
if not isinstance(message, dict):
raise ValueError("message is required")
parts = message.get("parts")
text = ""
if isinstance(parts, list):
text = "\n".join(
str(part.get("text") or "")
for part in parts
if isinstance(part, dict) and part.get("kind") in {None, "text"}
)
response = run_agent(
{
"prompt": text,
"session_id": str(params.get("contextId") or uuid.uuid4().hex),
}
)
pending_calls = response.get("tool_calls")
if not isinstance(pending_calls, (list, tuple)):
pending_calls = ()
if response.get("message") == "completed":
state = "completed"
elif pending_calls:
state = "input-required"
else:
state = "working"
metadata = dict(response.get("metadata") or {})
if pending_calls:
metadata["pending_tool_calls"] = [
dict(call) for call in pending_calls if isinstance(call, dict)
]
result = {
"id": "task_" + uuid.uuid4().hex,
"contextId": str(params.get("contextId") or ""),
"status": {"state": state},
"artifacts": (
[
{
"artifactId": "artifact_" + uuid.uuid4().hex,
"parts": [{"kind": "text", "text": str(response.get("final_text") or "")}],
}
]
if state == "completed"
else []
),
"metadata": metadata,
}
return {"jsonrpc": "2.0", "id": request_id, "result": result}
__all__ = ["a2a_request", "agent_card", "mcp_request", "mcp_tools"]