from datetime import datetime from typing import Any from uuid import UUID from ninja import Schema class ModelProviderIn(Schema): name: str base_url: str api_key: str enabled: bool = True default_timeout_seconds: int = 60 image_egress_approved: bool = False class ModelProviderUpdateIn(Schema): name: str | None = None base_url: str | None = None api_key: str | None = None clear_api_key: bool = False enabled: bool | None = None default_timeout_seconds: int | None = None image_egress_approved: bool | None = None class ModelProviderOut(Schema): id: int name: str base_url: str enabled: bool default_timeout_seconds: int credential_set: bool credential_masked: str image_egress_approved: bool image_egress_approved_by: str | None image_egress_approved_at: datetime | None credential_updated_at: datetime | None credential_updated_by: str | None archived_at: datetime | None archived_by: str | None deployment_count: int = 0 active_deployment_count: int = 0 effective_status: str created_at: datetime updated_at: datetime class ModelDeploymentIn(Schema): provider_id: int display_name: str model_name: str capability: str = "text_chat" default_temperature: float = 0.2 max_output_tokens: int = 2048 structured_output_mode: str = "unconfigured" enabled: bool = True class ModelDeploymentUpdateIn(Schema): display_name: str | None = None model_name: str | None = None capability: str | None = None default_temperature: float | None = None max_output_tokens: int | None = None structured_output_mode: str | None = None enabled: bool | None = None class ModelDeploymentOut(Schema): id: int provider_id: int provider_name: str display_name: str model_name: str capability: str default_temperature: float max_output_tokens: int structured_output_mode: str structured_output_test_status: str structured_output_verified_at: datetime | None structured_output_test_message: str structured_output_metrics: dict[str, Any] enabled: bool effective_status: str provider_effective_status: str reference_summary: dict[str, int] archived_at: datetime | None archived_by: str | None archived_via_provider: bool class ModelProviderPageOut(Schema): items: list[ModelProviderOut] page: int page_size: int total: int total_pages: int class ModelDeploymentPageOut(Schema): items: list[ModelDeploymentOut] page: int page_size: int total: int total_pages: int class ModelDeploymentOptionOut(Schema): id: int provider_id: int provider_name: str display_name: str model_name: str capability: str default_temperature: float max_output_tokens: int structured_output_mode: str structured_output_test_status: str structured_output_verified_at: datetime | None structured_output_test_message: str enabled: bool class ModelTestIn(Schema): prompt: str = "请回复:模型连接正常" class ModelInvocationOut(Schema): public_id: UUID deployment_id: int | None invocation_type: str status: str model_snapshot: dict[str, Any] output_text: str input_tokens: int | None output_tokens: int | None duration_ms: int retry_count: int error_code: str error_message: str created_at: datetime started_at: datetime | None finished_at: datetime | None diagnostics_scrubbed_at: datetime | None = None diagnostics_expires_at: datetime | None = None diagnostics_available: bool = True deployment_display_name: str | None = None provider_name: str | None = None model_snapshot_summary: dict[str, Any] = {} class ModelInvocationPageOut(Schema): items: list[ModelInvocationOut] page: int page_size: int total: int total_pages: int class ModelInvocationDiagnosticsOut(Schema): public_id: UUID input_snapshot: dict[str, Any] output_text: str diagnostics_scrubbed_at: datetime | None diagnostics_expires_at: datetime diagnostics_available: bool class DeletionImpactOut(Schema): suggested_action: str deployment_count: int agent_version_count: int step_binding_count: int run_step_count: int invocation_count: int class LifecycleResultOut(Schema): result: str impact: DeletionImpactOut