feat: organize tools and enable qwen realtime calls

This commit is contained in:
Xin Wang
2026-08-14 00:15:00 +08:00
parent eb111a3890
commit 5be21f5ccc
71 changed files with 5771 additions and 2026 deletions
+8 -1
View File
@@ -10,6 +10,7 @@
from datetime import datetime
from sqlalchemy import (
CheckConstraint,
JSON,
Boolean,
DateTime,
@@ -175,6 +176,7 @@ class Assistant(Base):
# ---- 瘦类型专属字段(真列,稀疏:按 type 用其中几列) ----
prompt: Mapped[str] = mapped_column(Text, default="") # prompt / opencode
dynamic_variable_definitions: Mapped[dict] = mapped_column(JSON, default=dict)
built_in_tools: Mapped[dict] = mapped_column(JSONB, default=dict)
analysis_config: Mapped[dict] = mapped_column(JSONB, default=dict)
api_url: Mapped[str] = mapped_column(String(512), default="") # dify / fastgpt / opencode
api_key: Mapped[str] = mapped_column(String(512), default="") # dify / fastgpt / opencode(打码/哨兵)
@@ -245,6 +247,10 @@ class Tool(Base):
"remote_tool_name",
name="uq_tools_mcp_server_remote_name",
),
CheckConstraint(
"type IN ('http', 'mcp', 'client')",
name="ck_tools_external_type",
),
)
id: Mapped[str] = mapped_column(String(40), primary_key=True)
@@ -273,7 +279,7 @@ class Tool(Base):
class AssistantToolBinding(Base):
"""Prompt assistant to reusable tool many-to-many binding."""
"""Assistant reference to a reusable tool plus Prompt usage config."""
__tablename__ = "assistant_tool_bindings"
@@ -288,6 +294,7 @@ class AssistantToolBinding(Base):
primary_key=True,
index=True,
)
config: Mapped[dict] = mapped_column(JSONB, default=dict)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now()
)
+8 -30
View File
@@ -10,7 +10,6 @@ import json
import settings
from services.interface_catalog import INTERFACE_DEFINITIONS
from services.system_tools import SYSTEM_TOOL_SPECS
from sqlalchemy import text
from sqlalchemy.ext.asyncio import (
AsyncSession,
@@ -43,39 +42,19 @@ async def sync_interface_definitions() -> None:
"interface_type": definition["interface_type"],
"name": definition["name"],
"capability": definition["capability"],
"field_schema": json.dumps({"fields": definition["fields"]}),
"field_schema": json.dumps(
{
"fields": definition["fields"],
"features": definition.get("features", {}),
}
),
},
)
async def sync_default_tools() -> None:
"""Ensure system-provided reusable tools exist without overwriting edits."""
default_system_tools = []
for kind, spec in SYSTEM_TOOL_SPECS.items():
config: dict[str, object] = {"kind": kind}
if kind == "end_conversation":
config.update(
{
"message_type": "none",
"custom_message": "",
"capture_reason": True,
"allow_end_interruption": False,
}
)
default_system_tools.append(
{
**spec,
"type": "system",
"definition": {
"schema_version": 1,
"type": "system",
"config": config,
},
}
)
"""Ensure workspace-owned reusable external tools exist."""
default_tools = [
*default_system_tools,
{
"id": "tool_show_message_default",
"name": "显示确认消息",
@@ -83,7 +62,7 @@ async def sync_default_tools() -> None:
"type": "client",
"description": "向用户显示必须主动确认的重要消息弹窗。",
"definition": {
"schema_version": 1,
"schema_version": 2,
"type": "client",
"config": {
"allow_interruptions": False,
@@ -121,7 +100,6 @@ async def sync_default_tools() -> None:
"required": False,
},
],
"dynamic_variable_assignments": {},
},
},
},