feat: add system tools and state updates

This commit is contained in:
Xin Wang
2026-08-04 15:27:39 +08:00
parent 5bf5987fe4
commit 731a372df9
33 changed files with 1787 additions and 124 deletions
@@ -184,6 +184,7 @@ function blankPromptForm(name: string): AssistantForm {
actions: [],
openingMessage: null,
},
systemTools: [],
visionEnabled: false,
visionModelResourceId: "",
toolIds: [],
@@ -479,6 +480,7 @@ export function AssistantPage(props: AssistantPageProps) {
actions: a.startup?.actions ?? [],
openingMessage: a.startup?.openingMessage ?? null,
},
systemTools: a.systemTools ?? [],
visionEnabled: a.visionEnabled,
visionModelResourceId: a.visionModelResourceId ?? "",
toolIds: a.toolIds ?? [],
@@ -555,6 +557,7 @@ export function AssistantPage(props: AssistantPageProps) {
actions: [],
openingMessage: null,
},
systemTools: [],
visionEnabled: false,
visionModelResourceId: null,
modelResourceIds: {},
@@ -614,6 +617,7 @@ export function AssistantPage(props: AssistantPageProps) {
enableInterrupt: form.enableInterrupt,
turnConfig: form.turnConfig,
startup: form.startup,
systemTools: form.runtimeMode === "pipeline" ? form.systemTools : [],
visionEnabled: form.visionEnabled,
visionModelResourceId: form.visionModelResourceId || null,
modelResourceIds: {
@@ -1300,7 +1304,9 @@ export function AssistantPage(props: AssistantPageProps) {
vision: visionModelOptionsFor(""),
}}
toolOptions={tools
.filter((tool) => tool.status === "active")
.filter(
(tool) => tool.status === "active" && tool.type !== "system",
)
.map((tool) => ({ value: tool.id, label: tool.name }))}
knowledgeOptions={kbOptions}
onBack={() => router.push("/assistants")}
@@ -64,9 +64,9 @@ import {
type ToolUpsert,
} from "@/lib/api";
type ToolKind = "end_call" | "http" | "client";
type ToolKind = "system" | "http" | "client";
type HttpMethod = HttpToolDefinition["config"]["method"];
type ToolFilter = "全部" | "End Call" | "HTTP" | "Client" | "MCP";
type ToolFilter = "全部" | "System" | "HTTP" | "Client" | "MCP";
type SortOrder = "newest" | "oldest";
type ToolResource =
| { kind: "tool"; id: string; tool: Tool }
@@ -74,7 +74,7 @@ type ToolResource =
const toolFilters: readonly ToolFilter[] = [
"全部",
"End Call",
"System",
"HTTP",
"Client",
"MCP",
@@ -112,7 +112,7 @@ function blankForm(): ToolForm {
return {
name: "",
functionName: "",
type: "end_call",
type: "system",
description: "",
status: "active",
messageType: "none",
@@ -147,7 +147,7 @@ function formFromTool(tool: Tool): ToolForm {
base.type = tool.type;
base.description = tool.description;
base.status = tool.status;
if (tool.definition.type === "end_call") {
if (tool.definition.type === "system") {
base.messageType = tool.definition.config.messageType;
base.customMessage = tool.definition.config.customMessage;
base.captureReason = tool.definition.config.captureReason;
@@ -235,7 +235,7 @@ function payloadFromForm(form: ToolForm): ToolUpsert {
throw new Error("函数名必须以小写字母开头,且只能包含小写字母、数字和下划线");
}
if (form.type === "end_call") {
if (form.type === "system") {
return {
name: form.name.trim(),
functionName: form.functionName,
@@ -244,8 +244,9 @@ function payloadFromForm(form: ToolForm): ToolUpsert {
secrets: {},
definition: {
schemaVersion: 1,
type: "end_call",
type: "system",
config: {
kind: "end_conversation",
messageType: form.messageType,
customMessage: form.messageType === "custom" ? form.customMessage : "",
captureReason: form.captureReason,
@@ -418,7 +419,7 @@ export function ComponentsToolsPage() {
const tool = resource.tool;
return (
(filter === "全部" ||
(filter === "End Call" && tool.type === "end_call") ||
(filter === "System" && tool.type === "system") ||
(filter === "HTTP" && tool.type === "http") ||
(filter === "Client" && tool.type === "client")) &&
(!query ||
@@ -569,8 +570,8 @@ export function ComponentsToolsPage() {
>
{resource.kind === "mcp"
? "MCP"
: resource.tool.type === "end_call"
? "End Call"
: resource.tool.type === "system"
? "System"
: resource.tool.type === "client"
? "Client"
: "HTTP"}
@@ -783,7 +784,7 @@ export function ComponentsToolsPage() {
>
<SelectTrigger className="w-full"><SelectValue /></SelectTrigger>
<SelectContent>
<SelectItem value="end_call">End Call</SelectItem>
<SelectItem value="system">System</SelectItem>
<SelectItem value="http">HTTP</SelectItem>
<SelectItem value="client">Client Tool</SelectItem>
</SelectContent>
@@ -826,8 +827,8 @@ export function ComponentsToolsPage() {
</FieldSection>
<FieldSection title="参数配置" scrollable tall>
{form.type === "end_call" ? (
<EndCallFields form={form} setForm={setForm} />
{form.type === "system" ? (
<SystemToolFields form={form} setForm={setForm} />
) : form.type === "client" ? (
<ClientToolFields form={form} setForm={setForm} />
) : (
@@ -860,7 +861,7 @@ export function ComponentsToolsPage() {
);
}
function EndCallFields({
function SystemToolFields({
form,
setForm,
}: {
@@ -869,6 +870,16 @@ function EndCallFields({
}) {
return (
<div className="space-y-4">
<Field label="系统动作">
<Select value="end_conversation" disabled>
<SelectTrigger className="w-full border-hairline-strong bg-background">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="end_conversation">结束对话</SelectItem>
</SelectContent>
</Select>
</Field>
<Field label="结束语">
<Select
value={form.messageType}