| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- import { describe, expect, test } from "bun:test"
- import { Effect } from "effect"
- import { parseResponse } from "../../src/tool/mcp-websearch"
- import { selectWebSearchProvider, webSearchModelName, webSearchProviderLabel } from "../../src/tool/websearch"
- import { webSearchEnabled } from "../../src/tool/registry"
- import { it } from "../lib/effect"
- import { ProviderV2 } from "@kirincode-ai/core/provider"
- const SESSION_ID = "ses_0196aabbccddeeff001122334455"
- describe("websearch provider", () => {
- test("selects a stable provider per session", () => {
- expect(selectWebSearchProvider(SESSION_ID)).toBe(selectWebSearchProvider(SESSION_ID))
- })
- test("supports an operational override", () => {
- const original = process.env.KIRINCODE_WEBSEARCH_PROVIDER
- try {
- process.env.KIRINCODE_WEBSEARCH_PROVIDER = "parallel"
- expect(selectWebSearchProvider(SESSION_ID)).toBe("parallel")
- process.env.KIRINCODE_WEBSEARCH_PROVIDER = "exa"
- expect(selectWebSearchProvider(SESSION_ID)).toBe("exa")
- } finally {
- if (original === undefined) delete process.env.KIRINCODE_WEBSEARCH_PROVIDER
- else process.env.KIRINCODE_WEBSEARCH_PROVIDER = original
- }
- })
- test("routes to Exa when the Exa flag is enabled", () => {
- expect(selectWebSearchProvider(SESSION_ID, { exa: true, parallel: false })).toBe("exa")
- })
- test("routes to Parallel when the Parallel flag is enabled", () => {
- expect(selectWebSearchProvider(SESSION_ID, { exa: false, parallel: true })).toBe("parallel")
- })
- test("is only enabled for kirincode or explicit websearch provider flags", () => {
- expect(webSearchEnabled(ProviderV2.ID.kirincode, { exa: false, parallel: false })).toBe(true)
- expect(webSearchEnabled(ProviderV2.ID.openai, { exa: false, parallel: false })).toBe(false)
- expect(webSearchEnabled(ProviderV2.ID.openai, { exa: true, parallel: false })).toBe(true)
- expect(webSearchEnabled(ProviderV2.ID.openai, { exa: false, parallel: true })).toBe(true)
- })
- test("uses branded labels", () => {
- expect(webSearchProviderLabel("parallel")).toBe("Parallel Web Search")
- expect(webSearchProviderLabel("exa")).toBe("Exa Web Search")
- expect(webSearchProviderLabel(undefined)).toBe("Web Search")
- })
- test("uses the provider API model id for Parallel analytics", () => {
- expect(
- webSearchModelName({
- model: {
- id: "claude-opus-4-7",
- api: { id: "claude-opus-4.7" },
- },
- }),
- ).toBe("claude-opus-4.7")
- })
- })
- describe("websearch MCP response parser", () => {
- const payload = JSON.stringify({
- jsonrpc: "2.0",
- id: 1,
- result: {
- content: [
- {
- type: "text",
- text: "search results",
- },
- ],
- },
- })
- it.effect("parses plain JSON-RPC responses", () =>
- Effect.gen(function* () {
- const result = yield* parseResponse(payload)
- expect(result).toBe("search results")
- }),
- )
- it.effect("parses SSE JSON-RPC responses", () =>
- Effect.gen(function* () {
- const result = yield* parseResponse(`event: message\ndata: ${payload}\n\n`)
- expect(result).toBe("search results")
- }),
- )
- it.effect("ignores non-JSON SSE data frames", () =>
- Effect.gen(function* () {
- const result = yield* parseResponse(`data: [DONE]\ndata: ${payload}\n\n`)
- expect(result).toBe("search results")
- }),
- )
- })
|