| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- from datetime import datetime
- from typing import TYPE_CHECKING, Generic, TypeVar
- from core_domain import (
- ToolBindingContract,
- ToolBindingDetailContract,
- ToolCredentialContract,
- ToolCredentialRevealContract,
- ToolDefinitionContract,
- ToolConnectionContract,
- )
- from core_shared import JSONValue
- from pydantic import BaseModel, Field
- if TYPE_CHECKING:
- from app.db.models import ToolBinding, ToolCredential, ToolDefinition, ToolConnection
- T = TypeVar("T")
- class ApiErrorResponse(BaseModel):
- errorType: str
- message: str
- details: dict[str, JSONValue] = Field(default_factory=dict)
- class ApiResponse(BaseModel, Generic[T]):
- success: bool = True
- data: T | None = None
- error: ApiErrorResponse | None = None
- requestId: str
- serverTime: datetime
- class PageRequest(BaseModel):
- page: int = Field(default=1, ge=1)
- pageSize: int = Field(default=20, ge=1, le=200)
- keyword: str | None = None
- @property
- def offset(self) -> int:
- return (self.page - 1) * self.pageSize
- class PageResult(BaseModel, Generic[T]):
- items: list[T]
- total: int
- page: int
- pageSize: int
- hasMore: bool
- @classmethod
- def from_items(
- cls,
- *,
- items: list[T],
- total: int,
- page: int,
- page_size: int) -> "PageResult[T]":
- return cls(
- items=items,
- total=total,
- page=page,
- pageSize=page_size,
- hasMore=page * page_size < total)
- class ToolCreateRequest(BaseModel):
- plugin_id: str | None = None
- code: str | None = None
- name: str
- tool_type: str
- description: str | None = None
- class ToolResponse(ToolDefinitionContract):
- @classmethod
- def from_entity(cls, entity: "ToolDefinition") -> "ToolResponse":
- return cls.model_validate(entity, from_attributes=True)
- class ToolConnectionCreateRequest(BaseModel):
- 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 ToolConnectionResponse(ToolConnectionContract):
- @classmethod
- def from_entity(cls, entity: "ToolConnection") -> "ToolConnectionResponse":
- return cls.model_validate(entity, from_attributes=True)
- class ToolBindingCreateRequest(BaseModel):
- app_id: str
- tool_connection_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(ToolBindingContract):
- @classmethod
- def from_entity(cls, entity: "ToolBinding") -> "ToolBindingResponse":
- return cls.model_validate(entity, from_attributes=True)
- class ToolBindingDetailResponse(ToolBindingDetailContract):
- binding: ToolBindingResponse
- connection: ToolConnectionResponse
- tool_definition: ToolResponse
- class ToolCredentialCreateRequest(BaseModel):
- name: str
- credential_type: str = "generic"
- secret_json: dict[str, JSONValue] = Field(default_factory=dict)
- metadata_json: dict[str, JSONValue] = Field(default_factory=dict)
- class ToolCredentialResponse(ToolCredentialContract):
- @classmethod
- def from_entity(cls, entity: "ToolCredential") -> "ToolCredentialResponse":
- return cls.model_validate(entity, from_attributes=True)
- class ToolCredentialRevealResponse(ToolCredentialRevealContract):
- credential: ToolCredentialResponse
- class ToolDto(BaseModel):
- id: str
- pluginId: str | None = None
- name: str
- toolType: str
- description: str | None = None
- createdTime: datetime
- @classmethod
- def from_entity(cls, entity: "ToolDefinition") -> "ToolDto":
- return cls(
- id=entity.id,
- pluginId=entity.plugin_id,
- name=entity.name,
- toolType=entity.tool_type,
- description=entity.description,
- createdTime=entity.created_time)
- class ToolCreateRequestDto(BaseModel):
- pluginId: str | None = None
- name: str
- toolType: str = "mcp"
- description: str | None = None
- class ToolDeleteRequestDto(BaseModel):
- toolId: str
- class ToolDetailRequestDto(BaseModel):
- toolId: str
- class ToolUpdateRequestDto(BaseModel):
- toolId: str
- name: str | None = None
- toolType: str | None = None
- description: str | None = None
- pluginId: str | None = None
- class ToolConnectionDto(BaseModel):
- id: str
- toolId: str
- inputSchema: dict[str, JSONValue] | None = None
- outputSchema: dict[str, JSONValue] | None = None
- invokeConfig: dict[str, JSONValue] | None = None
- timeoutMs: int | None = None
- retryPolicy: dict[str, JSONValue] | None = None
- createdTime: datetime
- @classmethod
- def from_entity(cls, entity: "ToolConnection") -> "ToolConnectionDto":
- return cls(
- id=entity.id,
- toolId=entity.tool_id,
- inputSchema=entity.input_schema_json,
- outputSchema=entity.output_schema_json,
- invokeConfig=entity.invoke_config_json,
- timeoutMs=entity.timeout_ms,
- retryPolicy=entity.retry_policy_json,
- createdTime=entity.created_time)
- class ToolConnectionListRequestDto(PageRequest):
- toolId: str | None = None
- class ToolConnectionCreateRequestDto(BaseModel):
- toolId: str
- inputSchema: dict[str, JSONValue] = Field(default_factory=dict)
- outputSchema: dict[str, JSONValue] = Field(default_factory=dict)
- invokeConfig: dict[str, JSONValue] = Field(default_factory=dict)
- timeoutMs: int | None = None
- retryPolicy: dict[str, JSONValue] = Field(default_factory=dict)
- class ToolConnectionDeleteRequestDto(BaseModel):
- connectionId: str
- class ToolConnectionDetailRequestDto(BaseModel):
- connectionId: str
- class ToolConnectionUpdateRequestDto(BaseModel):
- connectionId: str
- inputSchema: dict[str, JSONValue] | None = None
- outputSchema: dict[str, JSONValue] | None = None
- invokeConfig: dict[str, JSONValue] | None = None
- timeoutMs: int | None = None
- retryPolicy: dict[str, JSONValue] | None = None
- class ToolBindingDto(BaseModel):
- id: str
- appId: str
- connectionId: str
- credentialId: str | None = None
- bindingScope: str
- configJson: dict[str, JSONValue] | None = None
- createdTime: datetime
- @classmethod
- def from_entity(cls, entity: "ToolBinding") -> "ToolBindingDto":
- return cls(
- id=entity.id,
- appId=entity.app_id,
- connectionId=entity.tool_connection_id,
- credentialId=entity.credential_id,
- bindingScope=entity.binding_scope,
- configJson=entity.config_json,
- createdTime=entity.created_time)
- class ToolBindingListRequestDto(PageRequest):
- appId: str | None = None
- class ToolBindingCreateRequestDto(BaseModel):
- appId: str
- connectionId: str
- credentialId: str | None = None
- bindingScope: str = "app"
- configJson: dict[str, JSONValue] = Field(default_factory=dict)
- class ToolBindingDeleteRequestDto(BaseModel):
- bindingId: str
- class ToolBindingDetailRequestDto(BaseModel):
- bindingId: str
- class ToolBindingUpdateRequestDto(BaseModel):
- bindingId: str
- credentialId: str | None = None
- bindingScope: str | None = None
- configJson: dict[str, JSONValue] | None = None
- class ToolCredentialDto(BaseModel):
- id: str
- name: str
- credentialType: str
- secretFingerprint: str
- encryptionAlgorithm: str
- metadataJson: dict[str, JSONValue] = Field(default_factory=dict)
- createdTime: datetime
- @classmethod
- def from_entity(cls, entity: "ToolCredential") -> "ToolCredentialDto":
- return cls(
- id=entity.id,
- name=entity.name,
- credentialType=entity.credential_type,
- secretFingerprint=entity.secret_fingerprint,
- encryptionAlgorithm=entity.encryption_algorithm,
- metadataJson=entity.metadata_json,
- createdTime=entity.created_time)
- class ToolCredentialCreateRequestDto(BaseModel):
- name: str
- credentialType: str = "generic"
- secretJson: dict[str, JSONValue] = Field(default_factory=dict)
- metadataJson: dict[str, JSONValue] = Field(default_factory=dict)
- class ToolCredentialDeleteRequestDto(BaseModel):
- credentialId: str
- class ToolCredentialDetailRequestDto(BaseModel):
- credentialId: str
- class ToolCredentialUpdateRequestDto(BaseModel):
- credentialId: str
- name: str | None = None
- metadataJson: dict[str, JSONValue] | None = None
- class ToolCredentialRevealRequestDto(BaseModel):
- credentialId: str
- class ToolCredentialRevealDto(BaseModel):
- credential: ToolCredentialDto
- secretJson: dict[str, JSONValue] = Field(default_factory=dict)
- class McpToolDto(BaseModel):
- name: str
- description: str | None = None
- inputSchema: dict[str, JSONValue] | None = None
- class McpConnectRequestDto(BaseModel):
- name: str | None = None
- config: dict[str, JSONValue]
- class McpDiscoverRequestDto(BaseModel):
- connectionId: str
- class McpConnectData(BaseModel):
- tool: ToolDto
- connection: ToolConnectionDto
- discoveredTools: list[McpToolDto] = Field(default_factory=list)
- class DeleteData(BaseModel):
- deleted: bool
- toolId: str | None = None
- connectionId: str | None = None
- bindingId: str | None = None
- credentialId: str | None = None
|