|
@@ -8,6 +8,8 @@ const systemPrompts = document.querySelector("#system-prompts");
|
|
|
const preMessages = document.querySelector("#pre-messages");
|
|
const preMessages = document.querySelector("#pre-messages");
|
|
|
const preMessageTemplate = document.querySelector("#pre-message-template");
|
|
const preMessageTemplate = document.querySelector("#pre-message-template");
|
|
|
const toolList = document.querySelector("#tool-list");
|
|
const toolList = document.querySelector("#tool-list");
|
|
|
|
|
+const toolCount = document.querySelector("#tool-count");
|
|
|
|
|
+const promptDialog = document.querySelector("#prompt-dialog");
|
|
|
const PROMPT_SETS_STORAGE_KEY = "agent-lab.prompt-sets.v1";
|
|
const PROMPT_SETS_STORAGE_KEY = "agent-lab.prompt-sets.v1";
|
|
|
|
|
|
|
|
let socket = null;
|
|
let socket = null;
|
|
@@ -28,6 +30,18 @@ document.querySelector("#add-pre-message").addEventListener("click", () => {
|
|
|
document.querySelector("#save-prompt-set").addEventListener("click", savePromptSet);
|
|
document.querySelector("#save-prompt-set").addEventListener("click", savePromptSet);
|
|
|
document.querySelector("#load-prompt-set").addEventListener("click", loadPromptSet);
|
|
document.querySelector("#load-prompt-set").addEventListener("click", loadPromptSet);
|
|
|
document.querySelector("#delete-prompt-set").addEventListener("click", deletePromptSet);
|
|
document.querySelector("#delete-prompt-set").addEventListener("click", deletePromptSet);
|
|
|
|
|
+document.querySelector("#open-prompt-config").addEventListener("click", () => {
|
|
|
|
|
+ promptDialog.showModal();
|
|
|
|
|
+});
|
|
|
|
|
+document.querySelector("#close-prompt-config").addEventListener("click", () => {
|
|
|
|
|
+ promptDialog.close();
|
|
|
|
|
+});
|
|
|
|
|
+document.querySelector("#select-all-tools").addEventListener("click", () => {
|
|
|
|
|
+ setAllTools(true);
|
|
|
|
|
+});
|
|
|
|
|
+document.querySelector("#clear-tools").addEventListener("click", () => {
|
|
|
|
|
+ setAllTools(false);
|
|
|
|
|
+});
|
|
|
|
|
|
|
|
chatForm.addEventListener("submit", (event) => {
|
|
chatForm.addEventListener("submit", (event) => {
|
|
|
event.preventDefault();
|
|
event.preventDefault();
|
|
@@ -53,10 +67,14 @@ function renderTools(tools) {
|
|
|
toolList.textContent = "";
|
|
toolList.textContent = "";
|
|
|
if (!tools.length) {
|
|
if (!tools.length) {
|
|
|
toolList.textContent = "No tools available";
|
|
toolList.textContent = "No tools available";
|
|
|
|
|
+ updateToolCount();
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
tools.forEach((tool) => {
|
|
tools.forEach((tool) => {
|
|
|
|
|
+ const item = document.createElement("div");
|
|
|
|
|
+ item.className = "tool-card";
|
|
|
|
|
+
|
|
|
const label = document.createElement("label");
|
|
const label = document.createElement("label");
|
|
|
label.className = "checkbox";
|
|
label.className = "checkbox";
|
|
|
label.title = tool.description || tool.name;
|
|
label.title = tool.description || tool.name;
|
|
@@ -66,15 +84,47 @@ function renderTools(tools) {
|
|
|
checkbox.className = "tool-toggle";
|
|
checkbox.className = "tool-toggle";
|
|
|
checkbox.value = tool.name;
|
|
checkbox.value = tool.name;
|
|
|
checkbox.checked = true;
|
|
checkbox.checked = true;
|
|
|
|
|
+ checkbox.addEventListener("change", updateToolCount);
|
|
|
|
|
|
|
|
label.append(checkbox, ` ${tool.name}`);
|
|
label.append(checkbox, ` ${tool.name}`);
|
|
|
- toolList.append(label);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ const description = document.createElement("div");
|
|
|
|
|
+ description.className = "tool-description";
|
|
|
|
|
+ description.textContent = tool.description || "No description";
|
|
|
|
|
+
|
|
|
|
|
+ const required = document.createElement("div");
|
|
|
|
|
+ required.className = "tool-required";
|
|
|
|
|
+ required.textContent = formatRequiredParameters(tool);
|
|
|
|
|
+
|
|
|
|
|
+ item.append(label, description, required);
|
|
|
|
|
+ toolList.append(item);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
if (pendingEnabledTools) {
|
|
if (pendingEnabledTools) {
|
|
|
applySelectedTools(pendingEnabledTools);
|
|
applySelectedTools(pendingEnabledTools);
|
|
|
pendingEnabledTools = null;
|
|
pendingEnabledTools = null;
|
|
|
}
|
|
}
|
|
|
|
|
+ updateToolCount();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function formatRequiredParameters(tool) {
|
|
|
|
|
+ const required = tool.parameters && Array.isArray(tool.parameters.required)
|
|
|
|
|
+ ? tool.parameters.required
|
|
|
|
|
+ : [];
|
|
|
|
|
+ return required.length ? `Required: ${required.join(", ")}` : "No required parameters";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function setAllTools(checked) {
|
|
|
|
|
+ toolList.querySelectorAll(".tool-toggle").forEach((checkbox) => {
|
|
|
|
|
+ checkbox.checked = checked;
|
|
|
|
|
+ });
|
|
|
|
|
+ updateToolCount();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function updateToolCount() {
|
|
|
|
|
+ const selected = selectedTools().length;
|
|
|
|
|
+ const total = toolList.querySelectorAll(".tool-toggle").length;
|
|
|
|
|
+ toolCount.textContent = `${selected}/${total} selected`;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function savePromptSet() {
|
|
function savePromptSet() {
|
|
@@ -142,8 +192,15 @@ function buildPromptSet() {
|
|
|
model: document.querySelector("#model").value.trim(),
|
|
model: document.querySelector("#model").value.trim(),
|
|
|
temperature: Number(document.querySelector("#temperature").value),
|
|
temperature: Number(document.querySelector("#temperature").value),
|
|
|
max_tokens: Number(document.querySelector("#max-tokens").value),
|
|
max_tokens: Number(document.querySelector("#max-tokens").value),
|
|
|
|
|
+ system_prompt: document.querySelector("#chat-system-prompt").value.trim(),
|
|
|
|
|
+ extra_body: buildExtraBody("chat"),
|
|
|
},
|
|
},
|
|
|
event_agent: {
|
|
event_agent: {
|
|
|
|
|
+ model: document.querySelector("#event-model").value.trim(),
|
|
|
|
|
+ temperature: Number(document.querySelector("#event-temperature").value),
|
|
|
|
|
+ max_tokens: Number(document.querySelector("#event-max-tokens").value),
|
|
|
|
|
+ system_prompt: document.querySelector("#event-system-prompt").value.trim(),
|
|
|
|
|
+ extra_body: buildExtraBody("event"),
|
|
|
enabled_tools: selectedTools(),
|
|
enabled_tools: selectedTools(),
|
|
|
max_event_loops: Number(document.querySelector("#max-event-loops").value),
|
|
max_event_loops: Number(document.querySelector("#max-event-loops").value),
|
|
|
},
|
|
},
|
|
@@ -158,13 +215,45 @@ function restorePromptSet(promptSet) {
|
|
|
document.querySelector("#model").value = chatAgent.model || "";
|
|
document.querySelector("#model").value = chatAgent.model || "";
|
|
|
document.querySelector("#temperature").value = chatAgent.temperature ?? 0.2;
|
|
document.querySelector("#temperature").value = chatAgent.temperature ?? 0.2;
|
|
|
document.querySelector("#max-tokens").value = chatAgent.max_tokens ?? 800;
|
|
document.querySelector("#max-tokens").value = chatAgent.max_tokens ?? 800;
|
|
|
|
|
+ document.querySelector("#chat-system-prompt").value = chatAgent.system_prompt || "";
|
|
|
|
|
+ restoreExtraBody("chat", chatAgent.extra_body);
|
|
|
|
|
|
|
|
const eventAgent = promptSet.event_agent || {};
|
|
const eventAgent = promptSet.event_agent || {};
|
|
|
- document.querySelector("#max-event-loops").value = eventAgent.max_event_loops ?? 3;
|
|
|
|
|
|
|
+ document.querySelector("#event-model").value = eventAgent.model || "";
|
|
|
|
|
+ document.querySelector("#event-temperature").value = eventAgent.temperature ?? 0.2;
|
|
|
|
|
+ document.querySelector("#event-max-tokens").value = eventAgent.max_tokens ?? 800;
|
|
|
|
|
+ document.querySelector("#event-system-prompt").value = eventAgent.system_prompt || "";
|
|
|
|
|
+ restoreExtraBody("event", eventAgent.extra_body);
|
|
|
|
|
+ document.querySelector("#max-event-loops").value = eventAgent.max_event_loops ?? 1;
|
|
|
const enabledTools = eventAgent.enabled_tools || [];
|
|
const enabledTools = eventAgent.enabled_tools || [];
|
|
|
pendingEnabledTools = applySelectedTools(enabledTools) ? null : enabledTools;
|
|
pendingEnabledTools = applySelectedTools(enabledTools) ? null : enabledTools;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+function buildExtraBody(prefix) {
|
|
|
|
|
+ const thinkingDisabled = document.querySelector(`#${prefix}-thinking-disabled`).checked;
|
|
|
|
|
+ const enableSearch = document.querySelector(`#${prefix}-enable-search`).checked;
|
|
|
|
|
+ const forcedSearch = document.querySelector(`#${prefix}-forced-search`).checked;
|
|
|
|
|
+ const extraBody = {
|
|
|
|
|
+ enable_search: enableSearch,
|
|
|
|
|
+ search_options: {
|
|
|
|
|
+ forced_search: forcedSearch,
|
|
|
|
|
+ },
|
|
|
|
|
+ };
|
|
|
|
|
+ if (thinkingDisabled) {
|
|
|
|
|
+ extraBody.thinking = { type: "disabled" };
|
|
|
|
|
+ }
|
|
|
|
|
+ return extraBody;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function restoreExtraBody(prefix, extraBody = {}) {
|
|
|
|
|
+ document.querySelector(`#${prefix}-thinking-disabled`).checked =
|
|
|
|
|
+ !extraBody.thinking || extraBody.thinking.type === "disabled";
|
|
|
|
|
+ document.querySelector(`#${prefix}-enable-search`).checked =
|
|
|
|
|
+ Boolean(extraBody.enable_search);
|
|
|
|
|
+ document.querySelector(`#${prefix}-forced-search`).checked =
|
|
|
|
|
+ Boolean(extraBody.search_options && extraBody.search_options.forced_search);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function restoreSystemPrompts(prompts) {
|
|
function restoreSystemPrompts(prompts) {
|
|
|
systemPrompts.textContent = "";
|
|
systemPrompts.textContent = "";
|
|
|
const values = prompts.length ? prompts : [""];
|
|
const values = prompts.length ? prompts : [""];
|
|
@@ -205,6 +294,7 @@ function applySelectedTools(toolNames) {
|
|
|
checkboxes.forEach((checkbox) => {
|
|
checkboxes.forEach((checkbox) => {
|
|
|
checkbox.checked = selected.has(checkbox.value);
|
|
checkbox.checked = selected.has(checkbox.value);
|
|
|
});
|
|
});
|
|
|
|
|
+ updateToolCount();
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -296,8 +386,15 @@ function buildRequest() {
|
|
|
model: document.querySelector("#model").value.trim(),
|
|
model: document.querySelector("#model").value.trim(),
|
|
|
temperature: Number(document.querySelector("#temperature").value),
|
|
temperature: Number(document.querySelector("#temperature").value),
|
|
|
max_tokens: Number(document.querySelector("#max-tokens").value),
|
|
max_tokens: Number(document.querySelector("#max-tokens").value),
|
|
|
|
|
+ system_prompt: document.querySelector("#chat-system-prompt").value.trim(),
|
|
|
|
|
+ extra_body: buildExtraBody("chat"),
|
|
|
},
|
|
},
|
|
|
event_agent: {
|
|
event_agent: {
|
|
|
|
|
+ model: document.querySelector("#event-model").value.trim(),
|
|
|
|
|
+ temperature: Number(document.querySelector("#event-temperature").value),
|
|
|
|
|
+ max_tokens: Number(document.querySelector("#event-max-tokens").value),
|
|
|
|
|
+ system_prompt: document.querySelector("#event-system-prompt").value.trim(),
|
|
|
|
|
+ extra_body: buildExtraBody("event"),
|
|
|
enabled_tools: selectedTools(),
|
|
enabled_tools: selectedTools(),
|
|
|
max_event_loops: Number(document.querySelector("#max-event-loops").value),
|
|
max_event_loops: Number(document.querySelector("#max-event-loops").value),
|
|
|
},
|
|
},
|
|
@@ -327,6 +424,10 @@ function handleServerMessage(message) {
|
|
|
updateRoundStats(message);
|
|
updateRoundStats(message);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (message.type === "audit") {
|
|
|
|
|
+ appendLog("audit", formatAuditMessage(message));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
if (message.type === "event") {
|
|
if (message.type === "event") {
|
|
|
appendLog("event", message.event.name);
|
|
appendLog("event", message.event.name);
|
|
|
return;
|
|
return;
|
|
@@ -345,6 +446,13 @@ function handleServerMessage(message) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+function formatAuditMessage(message) {
|
|
|
|
|
+ const details = message.details && Object.keys(message.details).length
|
|
|
|
|
+ ? ` ${JSON.stringify(message.details)}`
|
|
|
|
|
+ : "";
|
|
|
|
|
+ return `${message.event}${details}`;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function appendAssistantDelta(content) {
|
|
function appendAssistantDelta(content) {
|
|
|
if (!firstTokenAt) {
|
|
if (!firstTokenAt) {
|
|
|
firstTokenAt = performance.now();
|
|
firstTokenAt = performance.now();
|