models.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. DESTROYED = "destroyed"
  26. # ---- 工具元信息(纯元数据,不含运行时) ----
  27. class ToolMeta(BaseModel):
  28. """工具元信息 — 只描述工具是什么,不管在哪跑"""
  29. model_config = {"extra": "ignore"} # 兼容旧 registry.json 中的多余字段
  30. tool_id: str
  31. name: str
  32. category: str = "" # 功能领域分类(保留向后兼容)
  33. description: str = ""
  34. input_schema: dict[str, Any] = Field(default_factory=dict)
  35. output_schema: dict[str, Any] = Field(default_factory=dict)
  36. stream_support: bool = False
  37. status: ToolStatus = ToolStatus.ACTIVE
  38. # 新增字段(向后兼容)
  39. backend_runtime: BackendRuntime | None = None # 后端执行环境
  40. provider_ids: list[str] = Field(default_factory=list) # 工具提供方
  41. capability_ids: list[str] = Field(default_factory=list) # 工具解决的原子能力
  42. knowledge_ids: list[str] = Field(default_factory=list) # 工具挂载的知识资产
  43. # ---- 容器信息(Docker 运行时,独立于工具元数据) ----
  44. class ContainerInfo(BaseModel):
  45. container_id: str
  46. tool_id: str = ""
  47. image: str = ""
  48. port_mapping: dict[int, int] = Field(default_factory=dict)
  49. volumes: dict[str, str] = Field(default_factory=dict)
  50. mem_limit: str = "1g"
  51. nano_cpus: int = 1_000_000_000
  52. use_gpu: bool = False
  53. gpu_count: int = -1
  54. status: ContainerStatus = ContainerStatus.RUNNING
  55. created_at: datetime | None = None
  56. last_accessed: datetime | None = None
  57. destroyed_at: datetime | None = None
  58. # ---- 请求/响应 ----
  59. class InvokeRequest(BaseModel):
  60. params: dict[str, Any] = Field(default_factory=dict)
  61. stream: bool = False
  62. class InvokeResponse(BaseModel):
  63. status: str = "success"
  64. result: Any = None
  65. error: str | None = None
  66. class ToolRequest(BaseModel):
  67. """外部提交新工具需求"""
  68. description: str
  69. callback_url: str | None = None
  70. class TaskStatus(BaseModel):
  71. task_id: str
  72. status: str = "pending"
  73. result: Any = None
  74. # ---- 内部消息 ----
  75. class AgentMessage(BaseModel):
  76. type: MessageType
  77. payload: dict[str, Any] = Field(default_factory=dict)