models.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. """公共数据模型"""
  2. from __future__ import annotations
  3. from datetime import datetime
  4. from enum import Enum
  5. from typing import Any
  6. from pydantic import BaseModel, Field
  7. # ---- 枚举 ----
  8. class ToolStatus(str, Enum):
  9. ACTIVE = "active"
  10. INACTIVE = "inactive"
  11. STAGING = "staging"
  12. BUILDING = "building"
  13. class BackendRuntime(str, Enum):
  14. """工具后端执行环境(调用层统一为本地 Python/FastAPI)"""
  15. LOCAL = "local" # 本地 Python 运行时(纯 uv 子进程)
  16. DOCKER = "docker" # Docker 容器运行时
  17. REMOTE = "remote" # 云端 API / 远程服务后端
  18. class MessageType(str, Enum):
  19. TOOL_REQUEST = "tool_request"
  20. TOOL_READY = "tool_ready"
  21. TOOL_ERROR = "tool_error"
  22. HEALTH_ALERT = "health_alert"
  23. class ContainerStatus(str, Enum):
  24. RUNNING = "running"
  25. STOPPED = "stopped"
  26. DESTROYED = "destroyed"
  27. # ---- 工具元信息(纯元数据,不含运行时) ----
  28. class ToolMeta(BaseModel):
  29. """工具元信息 — 只描述工具是什么,不管在哪跑"""
  30. model_config = {"extra": "ignore"} # 兼容旧 registry.json 中的多余字段
  31. tool_id: str
  32. name: str
  33. category: str = "" # 功能领域分类(保留向后兼容)
  34. description: str = ""
  35. input_schema: dict[str, Any] = Field(default_factory=dict)
  36. output_schema: dict[str, Any] = Field(default_factory=dict)
  37. stream_support: bool = False
  38. status: ToolStatus = ToolStatus.ACTIVE
  39. # 新增字段(向后兼容)
  40. backend_runtime: BackendRuntime | None = None # 后端执行环境
  41. provider_ids: list[str] = Field(default_factory=list) # 工具提供方
  42. capability_ids: list[str] = Field(default_factory=list) # 工具解决的原子能力
  43. knowledge_ids: list[str] = Field(default_factory=list) # 工具挂载的知识资产
  44. # ---- 容器信息(Docker 运行时,独立于工具元数据) ----
  45. class ContainerInfo(BaseModel):
  46. container_id: str
  47. tool_id: str = ""
  48. image: str = ""
  49. port_mapping: dict[int, int] = Field(default_factory=dict)
  50. volumes: dict[str, str] = Field(default_factory=dict)
  51. mem_limit: str = "1g"
  52. nano_cpus: int = 1_000_000_000
  53. use_gpu: bool = False
  54. gpu_count: int = -1
  55. status: ContainerStatus = ContainerStatus.RUNNING
  56. created_at: datetime | None = None
  57. last_accessed: datetime | None = None
  58. destroyed_at: datetime | None = None
  59. # ---- 请求/响应 ----
  60. class InvokeRequest(BaseModel):
  61. params: dict[str, Any] = Field(default_factory=dict)
  62. stream: bool = False
  63. class InvokeResponse(BaseModel):
  64. status: str = "success"
  65. result: Any = None
  66. error: str | None = None
  67. class ToolRequest(BaseModel):
  68. """外部提交新工具需求"""
  69. description: str
  70. callback_url: str | None = None
  71. class TaskStatus(BaseModel):
  72. task_id: str
  73. status: str = "pending"
  74. result: Any = None
  75. # ---- 内部消息 ----
  76. class AgentMessage(BaseModel):
  77. type: MessageType
  78. payload: dict[str, Any] = Field(default_factory=dict)