F1: add reusable task backend resources and migrate task tools
This commit is contained in:
+10
-27
@@ -21,7 +21,7 @@ AssistantType = Literal["prompt", "workflow", "dify", "fastgpt"]
|
||||
SUPPORTED_ASSISTANT_TYPES = get_args(AssistantType)
|
||||
TurnEndStrategy = Literal["silence", "smart_turn"]
|
||||
KnowledgeRetrievalMode = Literal["automatic", "on_demand"]
|
||||
ToolType = Literal["http", "mcp", "client", "task"]
|
||||
ToolType = Literal["http", "mcp", "client"]
|
||||
ToolStatus = Literal["active", "archived", "draft"]
|
||||
McpServerStatus = Literal["active", "archived", "draft"]
|
||||
McpTransport = Literal["streamable_http", "sse"]
|
||||
@@ -180,6 +180,12 @@ class ToolBinding(CamelModel):
|
||||
result_assignments: dict[str, str] = Field(default_factory=dict)
|
||||
|
||||
|
||||
class AssistantTaskBackendBinding(CamelModel):
|
||||
backend_id: str = Field(min_length=1, max_length=40)
|
||||
instruction_source: ValueSource = Field(default_factory=ModelValueSource)
|
||||
instructions: str = Field(default="", max_length=12000)
|
||||
|
||||
|
||||
class StartupAction(CamelModel):
|
||||
id: str = Field(min_length=1, max_length=64, pattern=r"^[A-Za-z][A-Za-z0-9_-]*$")
|
||||
phase: Literal["preflight", "opening"] = "opening"
|
||||
@@ -233,6 +239,7 @@ class AssistantUpsert(CamelModel):
|
||||
default_factory=KnowledgeRetrievalConfig
|
||||
)
|
||||
tool_bindings: list[ToolBinding] = Field(default_factory=list)
|
||||
task_backend: AssistantTaskBackendBinding | None = None
|
||||
built_in_tools: "BuiltInTools" = Field(default_factory=lambda: BuiltInTools())
|
||||
|
||||
# 瘦类型专属(真列);按 type 取用,无关字段写入时清零
|
||||
@@ -262,6 +269,8 @@ class AssistantUpsert(CamelModel):
|
||||
|
||||
@model_validator(mode="after")
|
||||
def _strip_irrelevant_fields(self):
|
||||
if self.task_backend and (self.type != "prompt" or self.runtime_mode != "pipeline"):
|
||||
raise ValueError("任务后端仅支持提示词 Pipeline")
|
||||
allowed = ALLOWED_FIELDS[self.type]
|
||||
for field in ("prompt", "api_url", "api_key", "app_id"):
|
||||
if field not in allowed:
|
||||
@@ -474,37 +483,11 @@ class McpToolDefinition(CamelModel):
|
||||
config: McpToolConfig
|
||||
|
||||
|
||||
class TaskToolConfig(CamelModel):
|
||||
provider: Literal["opencode"] = "opencode"
|
||||
url: str = Field(min_length=1, max_length=2048)
|
||||
directory: str = Field(min_length=1, max_length=2048)
|
||||
username: str = Field(default="opencode", max_length=128)
|
||||
timeout_seconds: int = Field(default=600, ge=30, le=7200)
|
||||
allow_interruptions: Literal[True] = True
|
||||
execution_mode: Literal["immediate"] = "immediate"
|
||||
|
||||
@field_validator("url")
|
||||
@classmethod
|
||||
def validate_task_url(cls, value: str) -> str:
|
||||
from urllib.parse import urlsplit
|
||||
parsed = urlsplit(value)
|
||||
if parsed.scheme not in {"http", "https"} or not parsed.hostname or parsed.username or parsed.password or parsed.query or parsed.fragment:
|
||||
raise ValueError("任务服务须使用不含凭证、查询参数的 HTTP(S) 地址")
|
||||
return value.rstrip("/")
|
||||
|
||||
|
||||
class TaskToolDefinition(CamelModel):
|
||||
schema_version: int = 2
|
||||
type: Literal["task"] = "task"
|
||||
config: TaskToolConfig
|
||||
|
||||
|
||||
ToolDefinition = Annotated[
|
||||
Union[
|
||||
HttpToolDefinition,
|
||||
ClientToolDefinition,
|
||||
McpToolDefinition,
|
||||
TaskToolDefinition,
|
||||
],
|
||||
Field(discriminator="type"),
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user