diff --git a/dap-gateway/src/main/resources/static/catalog.html b/dap-gateway/src/main/resources/static/catalog.html index a8a6de37..6e89d177 100644 --- a/dap-gateway/src/main/resources/static/catalog.html +++ b/dap-gateway/src/main/resources/static/catalog.html @@ -215,9 +215,10 @@ const badgeBorder = isDirect ? 'rgba(59,130,246,0.3)' : 'rgba(249,115,22,0.3)'; let paramHtml = ''; - if (tool.parametersSchema && tool.parametersSchema.properties) { - const props = tool.parametersSchema.properties; - const required = tool.parametersSchema.required || []; + const schema = tool.inputSchema || tool.parametersSchema; + if (schema && schema.properties) { + const props = schema.properties; + const required = schema.required || []; if (Object.keys(props).length > 0) { paramHtml = `
diff --git a/dap-gateway/src/main/resources/static/playground.html b/dap-gateway/src/main/resources/static/playground.html index 95b97f95..154d93ce 100644 --- a/dap-gateway/src/main/resources/static/playground.html +++ b/dap-gateway/src/main/resources/static/playground.html @@ -217,7 +217,7 @@ const option = document.createElement('option'); option.value = tool.name; option.textContent = tool.name; - option.dataset.schema = JSON.stringify(tool.parametersSchema); + option.dataset.schema = JSON.stringify(tool.inputSchema || tool.parametersSchema); option.dataset.prompts = JSON.stringify(tool.actionPrompts || {}); option.dataset.integrationType = tool.integrationType || 'HTTP'; optgroup.appendChild(option); diff --git a/dap-gateway/src/main/resources/static/static/index.html b/dap-gateway/src/main/resources/static/static/index.html index d76cf5cb..bfea6b77 100644 --- a/dap-gateway/src/main/resources/static/static/index.html +++ b/dap-gateway/src/main/resources/static/static/index.html @@ -351,12 +351,13 @@ option.value = tool.toolName; const commType = tool.integrationType ? tool.integrationType : 'HTTP'; option.textContent = tool.description ? `[${commType}] ${tool.description} (${tool.toolName})` : `[${commType}] ${tool.toolName}`; - option.dataset.schema = JSON.stringify(tool.parametersSchema); + option.dataset.schema = JSON.stringify(tool.inputSchema || tool.parametersSchema); option.dataset.prompts = JSON.stringify(tool.actionPrompts || {}); optgroup.appendChild(option); - const enums = tool.parametersSchema?.properties?.action?.enum || []; - const descStr = tool.parametersSchema?.properties?.action?.description || ""; + const schema = tool.inputSchema || tool.parametersSchema; + const enums = schema?.properties?.action?.enum || []; + const descStr = schema?.properties?.action?.description || ""; let descMap = {}; if(descStr.includes(":")) { diff --git a/dap-gateway/src/main/resources/static/tester.html b/dap-gateway/src/main/resources/static/tester.html index 137af8f4..c589a361 100644 --- a/dap-gateway/src/main/resources/static/tester.html +++ b/dap-gateway/src/main/resources/static/tester.html @@ -331,7 +331,7 @@ function generateDummyPayload(tool) { if (tool._customPayload) return tool._customPayload; - const schema = tool.parametersSchema; + const schema = tool.inputSchema || tool.parametersSchema; if (!schema || !schema.properties) return {}; const payload = {}; for (const [key, value] of Object.entries(schema.properties)) { @@ -705,7 +705,7 @@ } function renderSmartForm(tool, payloadToUse = null) { - const schema = tool.parametersSchema; + const schema = tool.inputSchema || tool.parametersSchema; const form = document.getElementById('payloadFormContainer'); form.innerHTML = ''; @@ -739,7 +739,7 @@ inputHtml = ``; } - let reqStar = (schema.required && schema.required.includes(key)) ? '*' : ''; + let reqStar = ((tool.inputSchema || tool.parametersSchema)?.required?.includes(key)) ? '*' : ''; html += `
${inputHtml} diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/dto/ToolMetadata.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/dto/ToolMetadata.java index d329d77b..909cd3dc 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/dto/ToolMetadata.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/dto/ToolMetadata.java @@ -12,7 +12,9 @@ import java.util.Map; import java.util.Set; import java.util.List; import java.util.HashSet; +import java.util.HashMap; import io.shinhanlife.dap.lib.dto.OperationType; +import com.fasterxml.jackson.annotation.JsonProperty; /** * Tool(Agent)의 명세 및 라우팅 정보를 담고 있는 메타데이터 클래스 * Redis 레지스트리에 저장되며, Planner와 Router 간의 통신 객체(Plan)로 사용됩니다. @@ -55,6 +57,7 @@ public class ToolMetadata { private List requiredEnvKeys; // 2. 파라미터 스키마 (JSON Schema 형태의 Map) + @JsonProperty("inputSchema") private Map parametersSchema; private Map outputSchema; @@ -143,4 +146,31 @@ public class ToolMetadata { if (parametersSchema == null || !parametersSchema.containsKey("required")) return Set.of(); return new HashSet<>((List) parametersSchema.get("required")); } + + @JsonProperty("_meta") + public Map get_meta() { + Map meta = new HashMap<>(); + meta.put("uid", this.uid); + meta.put("semver", this.semver); + meta.put("moduleName", this.moduleName); + meta.put("categoryKey", this.categoryKey); + meta.put("endpoint", this.endpoint); + meta.put("podUrl", this.podUrl); + meta.put("visible", this.visible); + meta.put("enabled", this.enabled); + meta.put("isRegistered", this.isRegistered); + meta.put("requiresApproval", this.requiresApproval); + meta.put("readOnlyHint", this.readOnlyHint); + meta.put("destructiveHint", this.destructiveHint); + meta.put("idempotentHint", this.idempotentHint); + meta.put("openWorldHint", this.openWorldHint); + meta.put("integrationType", this.integrationType); + meta.put("mciServiceId", this.mciServiceId); + meta.put("operationType", this.operationType); + meta.put("retryEnabled", this.retryEnabled); + meta.put("circuitBreakerFailureThreshold", this.circuitBreakerFailureThreshold); + meta.put("circuitBreakerOpenMillis", this.circuitBreakerOpenMillis); + meta.put("timeoutMillis", this.timeoutMillis); + return meta; + } }