ForcePilot/backend/package/yuxi/external_systems/integrations/schemas.py
Kris 74709ba2d3 feat: 完成外部系统限界上下文核心代码实现
新增六边形架构核心代码包,包含:
1. 协议适配器层:HTTP/SMTP/IMAP/SSH/GRPC等多协议适配器实现
2. 认证插件体系:基础认证、API密钥、HMAC等多类型认证插件
3. 执行编排框架:工具执行器、上下文构建、运行时治理组件
4. 用例端口与DTO:定义领域服务端口与数据传输对象
5. 厂商集成包框架:支持第三方系统集成扩展
6. 基础设施装配层:实现依赖注入与服务装配

所有代码遵循六边形架构设计原则,实现端口与适配器解耦,支持动态扩展与自动发现。
2026-06-20 22:12:42 +08:00

62 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""integrations 层数据结构。
定义两个 Pydantic BaseModel
- ``IntegrationMetadata``:厂商集成元数据(内存态),由各集成包在启动时自注册,
供前端集成目录展示与 use_cases 层查询。不持久化到数据库。
- ``GeneratedToolsDraft``:工具生成草稿,由 ``create_tools`` handler 返回,
由 use_cases 层统一持久化到 ORM。集成包不反向依赖 tool_service
遵循"草稿生成与持久化职责分离"原则。
放置位置说明:放在 ``integrations/schemas.py`` 而非 ``core/models.py``,因为:
- ``core/models.py`` 是 dataclass不依赖 Pydantic与 ORM 一一对齐
- ``IntegrationMetadata`` 是 Pydantic BaseModel需 JSON Schema 序列化),
且为 integrations 层专属数据结构
- ``core/contracts.py`` 端口返回类型使用 ``Any``,运行时 core 不依赖本文件
"""
from __future__ import annotations
from typing import Any
from pydantic import BaseModel, ConfigDict, Field
class IntegrationMetadata(BaseModel):
"""厂商集成元数据(内存态)。
由厂商集成包在应用启动时通过 ``integrations/discovery`` 自动发现并注册,
不持久化到数据库。供前端集成目录展示与 use_cases 层查询。
"""
model_config = ConfigDict(extra="forbid")
key: str = Field(..., min_length=1, max_length=64, description="厂商唯一标识,如 salesforce")
display_name: str = Field(..., min_length=1, max_length=128, description="展示名称")
description: str = Field(default="", max_length=512, description="简要描述")
adapter_type: str = Field(..., max_length=32, description="运行时协议适配器,如 http")
source_types: list[str] = Field(..., min_length=1, description="该集成注册的 source_type 列表")
supported_auth_types: list[str] = Field(default_factory=list, description="支持的认证类型列表")
tags: list[str] = Field(default_factory=list, description="分类标签")
icon: str | None = Field(default=None, description="图标标识(前端消费)")
docs_url: str | None = Field(default=None, description="官方文档链接")
connection_extra_schema: dict[str, Any] | None = Field(default=None, description="连接配置额外字段的 JSON Schema")
example_config: dict[str, Any] | None = Field(default=None, description="推荐配置示例")
dependency_note: str | None = Field(default=None, description="依赖说明(密钥/前置条件)")
class GeneratedToolsDraft(BaseModel):
"""工具生成草稿(不直接持久化)。
由 ``IntegrationOperationRegistry.create_tools`` 返回,由 use_cases 层
``import_service`` / ``integration_tool_service``)统一持久化到 ORM。
集成包不反向依赖 tool_service遵循"草稿生成与持久化职责分离"原则。
"""
model_config = ConfigDict(extra="forbid")
tool_configs: list[dict[str, Any]] = Field(
..., description="待持久化的工具配置草稿列表(每项为 ExternalToolCreateInput 兼容的 dict"
)
override_existing: bool = Field(default=False, description="slug 已存在时是否覆盖")