Add wait_for_response functionality to ToolResource and related components. Update API models, schemas, and routers to support new parameter. Enhance UI components to manage wait_for_response state, ensuring proper integration across the application.

This commit is contained in:
Xin Wang
2026-02-27 16:54:39 +08:00
parent 95c6e93a9c
commit 229243e832
9 changed files with 303 additions and 44 deletions

View File

@@ -184,6 +184,7 @@ export const ToolLibraryPage: React.FC = () => {
const [toolCategory, setToolCategory] = useState<'system' | 'query'>('system');
const [toolIcon, setToolIcon] = useState('Wrench');
const [toolEnabled, setToolEnabled] = useState(true);
const [toolWaitForResponse, setToolWaitForResponse] = useState(false);
const [toolHttpMethod, setToolHttpMethod] = useState<'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'>('GET');
const [toolHttpUrl, setToolHttpUrl] = useState('');
const [toolHttpHeadersText, setToolHttpHeadersText] = useState('{}');
@@ -215,6 +216,7 @@ export const ToolLibraryPage: React.FC = () => {
setToolCategory('system');
setToolIcon('Wrench');
setToolEnabled(true);
setToolWaitForResponse(false);
setToolHttpMethod('GET');
setToolHttpUrl('');
setToolHttpHeadersText('{}');
@@ -231,6 +233,7 @@ export const ToolLibraryPage: React.FC = () => {
setToolCategory(tool.category);
setToolIcon(tool.icon || 'Wrench');
setToolEnabled(tool.enabled ?? true);
setToolWaitForResponse(Boolean(tool.waitForResponse));
setToolHttpMethod((tool.httpMethod || 'GET') as 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE');
setToolHttpUrl(tool.httpUrl || '');
setToolHttpHeadersText(JSON.stringify(tool.httpHeaders || {}, null, 2));
@@ -269,6 +272,15 @@ export const ToolLibraryPage: React.FC = () => {
<Badge variant="outline" className={`text-[10px] border-0 px-0 ${tool.category === 'system' ? 'text-primary' : 'text-blue-400'}`}>
{tool.category === 'system' ? 'SYSTEM' : 'QUERY'}
</Badge>
{tool.category === 'system' && (
<Badge
variant="outline"
className={`text-[10px] h-4 px-1.5 border ${tool.waitForResponse ? 'border-amber-400/40 text-amber-300' : 'border-white/20 text-muted-foreground'}`}
title={tool.waitForResponse ? 'wait for response: ON' : 'wait for response: OFF'}
>
{tool.waitForResponse ? 'WAIT' : 'NO-WAIT'}
</Badge>
)}
<span className="text-[10px] text-muted-foreground font-mono opacity-50 truncate">ID: {tool.id}</span>
</div>
<p className="text-xs text-muted-foreground line-clamp-2 leading-relaxed opacity-80">{tool.description}</p>
@@ -371,6 +383,7 @@ export const ToolLibraryPage: React.FC = () => {
httpTimeoutMs: toolHttpTimeoutMs,
parameterSchema: parsedParameterSchema,
parameterDefaults: parsedParameterDefaults,
waitForResponse: toolCategory === 'system' ? toolWaitForResponse : false,
enabled: toolEnabled,
});
setTools((prev) => prev.map((item) => (item.id === updated.id ? updated : item)));
@@ -387,6 +400,7 @@ export const ToolLibraryPage: React.FC = () => {
httpTimeoutMs: toolHttpTimeoutMs,
parameterSchema: parsedParameterSchema,
parameterDefaults: parsedParameterDefaults,
waitForResponse: toolCategory === 'system' ? toolWaitForResponse : false,
enabled: toolEnabled,
});
setTools((prev) => [created, ...prev]);
@@ -573,6 +587,22 @@ export const ToolLibraryPage: React.FC = () => {
/>
</div>
{toolCategory === 'system' && (
<div className="rounded-md border border-white/10 bg-black/20 p-3 space-y-1.5">
<label className="flex items-center gap-2 text-xs text-muted-foreground">
<input
type="checkbox"
checked={toolWaitForResponse}
onChange={(e) => setToolWaitForResponse(e.target.checked)}
/>
(wait for response)
</label>
<p className="text-[11px] text-muted-foreground">
</p>
</div>
)}
<div className="space-y-4 rounded-md border border-white/10 bg-white/5 p-3">
<div className="flex items-center justify-between">
<div className="text-[10px] font-black uppercase tracking-widest text-emerald-300">Tool Parameters</div>