Z ZPI 文档 v0.3.8
介绍页

源码

tests/desktop/reasoning-levels.spec.ts

typescript115 行查看原文
import { mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { presetModels } from "@zpi-dev/ai";
import { chunk, done, fakeServer, send } from "../fake-server.ts";
import { runCleanup } from "../helpers/cleanup.ts";
import { launchDesktop } from "../helpers/desktop.ts";
import { expect, test } from "../helpers/test.ts";

test("GPT models offer five or six efforts with medium default; Chinese models show only their controls", async () => {
  const dir = await mkdtemp(join(tmpdir(), "zpi-efforts-"));
  const server = await fakeServer((_, response) => {
    send(response, chunk({ content: "ok" }));
    done(response);
  });
  let app: Awaited<ReturnType<typeof launchDesktop>>;
  try {
    app = await launchDesktop({ dir, url: server.url });
    const page = await app.firstWindow();
    await page.evaluate(
      async ({ url, modelsJson }) => {
        const result = await window.zpi.saveProvider({
          id: "efforts",
          name: "档位测试",
          baseUrl: url,
          apiKey: "fake",
          models: JSON.parse(modelsJson),
        });
        if (!result.ok) throw new Error(result.error.message);
      },
      {
        url: server.url,
        modelsJson: JSON.stringify([
          ...presetModels("openai-chatgpt"),
          ...presetModels("deepseek"),
          ...presetModels("mimo-api"),
        ]),
      },
    );
    await page.reload();
    const openModel = async (name: string) => {
      await page.getByLabel("模型选择", { exact: true }).click();
      await page.getByRole("menuitem", { name, exact: true }).hover();
    };
    const efforts = () =>
      page.getByRole("menuitem").filter({ hasText: /^(关闭|低|中|高|极高|最高)( · 默认)?$/ });
    const editor = page.getByLabel("消息", { exact: true });
    const modelButton = page.getByLabel("模型选择", { exact: true });
    await editor.fill("前尾");
    await page.keyboard.press("ArrowLeft");
    await modelButton.click();
    await page.getByRole("menuitem", { name: "GPT-6.1 Sol", exact: true }).click();
    await expect(page.getByRole("menu")).toHaveCount(0);
    await expect(modelButton).toHaveText("GPT-6.1 Sol中");
    await expect(editor).toBeFocused();
    await page.keyboard.type("X");
    await expect(editor).toHaveText("前X尾");
    await openModel("GPT-6.1 Sol");
    await expect(efforts()).toHaveText(["低", "中 · 默认", "高", "极高", "最高"]);
    await expect(modelButton).toHaveText("GPT-6.1 Sol中");
    await page.screenshot({ path: "test-results/gpt-reasoning-levels.png" });
    await page.keyboard.press("Escape");
    await page.keyboard.press("Escape");
    await editor.fill("medium");
    await editor.press("Enter");
    await expect(page.getByTestId("run")).toHaveCount(1);
    await expect(page.getByTestId("run").last()).toHaveAttribute("data-status", "completed");
    expect(server.requests.at(-1)?.reasoning_effort).toBe("medium");
    await openModel("GPT-6 Astra");
    await expect(efforts()).toHaveText(["低", "中 · 默认", "高", "极高", "最高"]);
    await expect(modelButton).toHaveText("GPT-6.1 Sol中");
    await page.getByRole("menuitem", { name: "极高", exact: true }).click();
    await expect(page.getByRole("menu")).toHaveCount(0);
    await expect(page.getByLabel("模型选择", { exact: true })).toContainText("极高");
    await expect(editor).toBeFocused();
    await page.keyboard.type("xhigh");
    await page.keyboard.press("Enter");
    await expect(page.getByTestId("run")).toHaveCount(2);
    await expect(page.getByTestId("run").last()).toHaveAttribute("data-status", "completed");
    expect(server.requests.at(-1)?.reasoning_effort).toBe("xhigh");
    await modelButton.click();
    await page.getByRole("menuitem", { name: "GPT-6 Astra", exact: true }).click();
    await expect(page.getByRole("menu")).toHaveCount(0);
    await expect(modelButton).toHaveText("GPT-6 Astra中");
    await expect(editor).toBeFocused();
    await page.reload();
    await expect(modelButton).toHaveText("GPT-6 Astra中");
    await openModel("GPT-6 Luna");
    await expect(efforts()).toHaveText(["关闭", "低", "中 · 默认", "高", "极高", "最高"]);
    await page.getByRole("menuitem", { name: "最高", exact: true }).click();
    await expect(page.getByLabel("模型选择", { exact: true })).toContainText("最高");
    await expect(editor).toBeFocused();
    await page.keyboard.type("max");
    await page.keyboard.press("Enter");
    await expect(page.getByTestId("run")).toHaveCount(3);
    await expect(page.getByTestId("run").last()).toHaveAttribute("data-status", "completed");
    expect(server.requests.at(-1)?.reasoning_effort).toBe("max");
    await page.reload();
    await expect(page.getByLabel("模型选择", { exact: true })).toContainText("最高");
    await openModel(presetModels("deepseek")[0].name ?? "deepseek-flash");
    await expect(efforts()).toHaveText(["关闭", "低", "高", "最高"]);
    await page.getByRole("menuitem", { name: "高", exact: true }).click();
    await openModel(presetModels("mimo-api")[0].name ?? "mimo-v2.5");
    await expect(page.getByRole("menuitem", { name: "关闭", exact: true })).toBeVisible();
    await expect(page.getByRole("menuitem", { name: "默认", exact: true })).toBeVisible();
    await expect(page.getByRole("menuitem", { name: /^(中|极高|最高)$/ })).toHaveCount(0);
  } finally {
    await runCleanup([
      () => rm(dir, { recursive: true, force: true }),
      () => server.close(),
      () => app?.close(),
    ]);
  }
});