from datetime import datetime from typing import TYPE_CHECKING from pydantic import BaseModel, Field from core_shared import JSONValue if TYPE_CHECKING: from app.db.models import ToolBinding, ToolDefinition, ToolVersion class ToolCreateRequest(BaseModel): tenant_id: str plugin_id: str | None = None code: str name: str tool_type: str description: str | None = None class ToolResponse(BaseModel): id: str tenant_id: str plugin_id: str | None = None code: str name: str tool_type: str description: str | None = None created_time: datetime @classmethod def from_entity(cls, entity: "ToolDefinition") -> "ToolResponse": return cls.model_validate(entity, from_attributes=True) class ToolVersionCreateRequest(BaseModel): tenant_id: str tool_id: str input_schema_json: dict[str, JSONValue] = Field(default_factory=dict) output_schema_json: dict[str, JSONValue] = Field(default_factory=dict) invoke_config_json: dict[str, JSONValue] = Field(default_factory=dict) timeout_ms: int | None = None retry_policy_json: dict[str, JSONValue] = Field(default_factory=dict) class ToolVersionResponse(BaseModel): id: str tenant_id: str tool_id: str version_no: int input_schema_json: dict[str, JSONValue] | None = None output_schema_json: dict[str, JSONValue] | None = None invoke_config_json: dict[str, JSONValue] | None = None timeout_ms: int | None = None retry_policy_json: dict[str, JSONValue] | None = None created_time: datetime @classmethod def from_entity(cls, entity: "ToolVersion") -> "ToolVersionResponse": return cls.model_validate(entity, from_attributes=True) class ToolBindingCreateRequest(BaseModel): tenant_id: str app_id: str tool_version_id: str credential_id: str | None = None binding_scope: str = "app" enabled: bool = True config_json: dict[str, JSONValue] = Field(default_factory=dict) class ToolBindingResponse(BaseModel): id: str tenant_id: str app_id: str tool_version_id: str credential_id: str | None = None binding_scope: str enabled: bool config_json: dict[str, JSONValue] | None = None created_time: datetime @classmethod def from_entity(cls, entity: "ToolBinding") -> "ToolBindingResponse": return cls.model_validate(entity, from_attributes=True)