文档

集成

状态报告和警告

测试版功能

插件支持目前处于内部测试阶段。在此加入测试

有时,一个工具可能需要很长时间才能执行。在这种情况下,提供状态更新将很有帮助,以便用户知道正在发生什么。在其他时候,您可能希望警告用户潜在的问题。

您可以使用工具实现函数的第二个参数中的 statuswarn 方法发送状态更新和警告。

以下示例展示了如何实现一个工具,该工具会等待指定的秒数,如果等待时间超过 10 秒,则提供状态更新和警告

import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk";
import { z } from "zod";

export async function toolsProvider(ctl: ToolsProviderController) {
  const tools: Tool[] = [];

  const waitTool = tool({
    name: `wait`,
    description: "Wait for a specified number of seconds.",
    parameters: { seconds: z.number().min(1) },
    implementation: async ({ seconds }, { status, warn }) => {
      if (seconds > 10) {
        warn("The model asks to wait for more than 10 seconds.");
      }
      for (let i = 0; i < seconds; i++) {
        status(`Waiting... ${i + 1}/${seconds} seconds`);
        await new Promise((resolve) => setTimeout(resolve, 1000));
      }
    },
  });
  tools.push(waitTool);

  return tools; // Return the tools array
}

请注意,状态更新和警告仅对用户可见。如果您希望模型也能看到这些消息,则应将它们作为工具返回值的一部分返回。

处理中止

在您的工具仍在运行时,用户可能会中止预测。在这种情况下,您应该通过处理作为工具实现函数的第二个参数传递的 AbortSignal 对象来优雅地处理中止。

import { tool, Tool, ToolsProviderController } from "@lmstudio/sdk";
import { z } from "zod";

export async function toolsProvider(ctl: ToolsProviderController) {
  const tools: Tool[] = [];

  const fetchTool = tool({
    name: `fetch`,
    description: "Fetch a URL using GET method.",
    parameters: { url: z.string() },
    implementation: async ({ url }, { signal }) => {
      const response = await fetch(url, {
        method: "GET",
        signal, // <-- Here, we pass the signal to fetch to allow cancellation
      });
      if (!response.ok) {
        return `Error: Failed to fetch ${url}: ${response.statusText}`;
      }
      const data = await response.text();
      return {
        status: response.status,
        headers: Object.fromEntries(response.headers.entries()),
        data: data.substring(0, 1000), // Limit to 1000 characters
      };
    },
  });
  tools.push(fetchTool);

  return tools;
}

您可以在 MDN 文档中了解更多关于 AbortSignal 的信息。

本页源代码可在 GitHub 上获取