87 lines
2.3 KiB
Python
87 lines
2.3 KiB
Python
"""Structured IO for typed input/output - Phase 10.2"""
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Any, Generic, TypeVar
|
|
|
|
T = TypeVar("T")
|
|
|
|
|
|
@dataclass
|
|
class StructuredInput:
|
|
"""Structured input wrapper"""
|
|
|
|
skill_name: str
|
|
parameters: dict[str, Any]
|
|
metadata: dict[str, Any]
|
|
|
|
|
|
@dataclass
|
|
class StructuredOutput:
|
|
"""Structured output wrapper"""
|
|
|
|
skill_name: str
|
|
result: Any
|
|
success: bool
|
|
error: str | None = None
|
|
metadata: dict[str, Any] | None = None
|
|
|
|
|
|
class StructuredIO:
|
|
"""Handles structured input/output for agent communication"""
|
|
|
|
def parse_input(self, data: dict[str, Any]) -> StructuredInput:
|
|
"""Parse structured input from dictionary.
|
|
|
|
Args:
|
|
data: Dictionary containing skill_name, parameters, and metadata
|
|
|
|
Returns:
|
|
StructuredInput instance
|
|
|
|
Raises:
|
|
ValueError: If required fields are missing
|
|
"""
|
|
if not isinstance(data, dict):
|
|
raise ValueError("Input data must be a dictionary")
|
|
|
|
skill_name = data.get("skill_name")
|
|
if not skill_name:
|
|
raise ValueError("Missing required field: skill_name")
|
|
if not isinstance(skill_name, str):
|
|
raise ValueError("skill_name must be a string")
|
|
|
|
parameters = data.get("parameters")
|
|
if parameters is None:
|
|
raise ValueError("Missing required field: parameters")
|
|
if not isinstance(parameters, dict):
|
|
raise ValueError("parameters must be a dictionary")
|
|
|
|
metadata = data.get("metadata", {})
|
|
if not isinstance(metadata, dict):
|
|
raise ValueError("metadata must be a dictionary")
|
|
|
|
return StructuredInput(skill_name=skill_name, parameters=parameters, metadata=metadata)
|
|
|
|
def format_output(self, output: StructuredOutput) -> dict[str, Any]:
|
|
"""Format structured output to dictionary.
|
|
|
|
Args:
|
|
output: StructuredOutput instance
|
|
|
|
Returns:
|
|
Dictionary representation of the output
|
|
"""
|
|
result = {
|
|
"skill_name": output.skill_name,
|
|
"result": output.result,
|
|
"success": output.success,
|
|
}
|
|
|
|
if output.error is not None:
|
|
result["error"] = output.error
|
|
|
|
if output.metadata is not None:
|
|
result["metadata"] = output.metadata
|
|
|
|
return result
|