1 line
7.3 KiB
JSON
1 line
7.3 KiB
JSON
{"repo": "benewende-dev/outtio", "files": {"extensions/opencode-go/index.test.ts": {"65e969aeea8cc43f6d544c096200cc65382f5968": {"t": 1785596392.9742932, "n": 6819, "h": "f6320c8f07b90774", "c": "import { getModels } from \"@mariozechner/pi-ai\";\nimport {\n registerProviderPlugin,\n registerSingleProviderPlugin,\n} from \"openclaw/plugin-sdk/plugin-test-runtime\";\nimport { expectPassthroughReplayPolicy } from \"openclaw/plugin-sdk/provider-test-contracts\";\nimport { describe, expect, it } from \"vitest\";\nimport plugin from \"./index.js\";\n\ndescribe(\"opencode-go provider plugin\", () => {\n it(\"registers image media understanding through the OpenCode Go plugin\", async () => {\n const { mediaProviders } = await registerProviderPlugin({\n plugin,\n id: \"opencode-go\",\n name: \"OpenCode Go Provider\",\n });\n\n expect(mediaProviders).toEqual(\n expect.arrayContaining([\n expect.objectContaining({\n id: \"opencode-go\",\n capabilities: [\"image\"],\n defaultModels: { image: \"kimi-k2.6\" },\n describeImage: expect.any(Function),\n describeImages: expect.any(Function),\n }),\n ]),\n );\n });\n\n it(\"owns passthrough-gemini replay policy for Gemini-backed models\", async () => {\n await expectPassthroughReplayPolicy({\n plugin,\n providerId: \"opencode-go\",\n modelId: \"gemini-2.5-pro\",\n sanitizeThoughtSignatures: true,\n });\n });\n\n it(\"keeps non-Gemini replay policy minimal on passthrough routes\", async () => {\n await expectPassthroughReplayPolicy({\n plugin,\n providerId: \"opencode-go\",\n modelId: \"qwen3-coder\",\n });\n });\n\n it(\"keeps OpenCode Go catalog coverage aligned with upstream\", async () => {\n const provider = await registerSingleProviderPlugin(plugin);\n expect(provider.catalog).toBeUndefined();\n\n const models = new Map(getModels(\"opencode-go\").map((model) => [model.id, model]));\n expect([...models.keys()]).toEqual([\n \"deepseek-v4-flash\",\n \"deepseek-v4-pro\",\n \"glm-5\",\n \"glm-5.1\",\n \"kimi-k2.5\",\n \"kimi-k2.6\",\n \"mimo-v2-omni\",\n \"mimo-v2-pro\",\n \"mimo-v2.5\",\n \"mimo-v2.5-pro\",\n \"minimax-m2.5\",\n \"minimax-m2.7\",\n \"qwen3.5-plus\",\n \"qwen3.6-plus\",\n ]);\n const supplemental = await provider.augmentModelCatalog?.({\n entries: [...models.values()].map((model) => ({\n provider: model.provider,\n id: model.id,\n name: model.name,\n })),\n } as never);\n expect(supplemental).toEqual(\n expect.arrayContaining([\n expect.objectContaining({\n provider: \"opencode-go\",\n id: \"deepseek-v4-pro\",\n name: \"DeepSeek V4 Pro\",\n }),\n expect.objectContaining({\n provider: \"opencode-go\",\n id: \"deepseek-v4-flash\",\n name: \"DeepSeek V4 Flash\",\n }),\n ]),\n );\n\n expect(models.get(\"kimi-k2.6\")).toMatchObject({\n api: \"openai-completions\",\n baseUrl: \"https://opencode.ai/zen/go/v1\",\n input: [\"text\", \"image\"],\n reasoning: true,\n contextWindow: 262_144,\n maxTokens: 65_536,\n });\n expect(models.get(\"minimax-m2.7\")).toMatchObject({\n api: \"anthropic-messages\",\n baseUrl: \"https://opencode.ai/zen/go\",\n reasoning: true,\n contextWindow: 204_800,\n maxTokens: 131_072,\n });\n expect(models.get(\"mimo-v2-pro\")).toMatchObject({\n api: \"openai-completions\",\n baseUrl: \"https://opencode.ai/zen/go/v1\",\n input: [\"text\"],\n reasoning: true,\n contextWindow: 1_048_576,\n maxTokens: 128_000,\n });\n expect(models.get(\"mimo-v2-omni\")).toMatchObject({\n input: [\"text\", \"image\"],\n reasoning: true,\n contextWindow: 262_144,\n maxTokens: 128_000,\n });\n expect(\n provider.resolveDynamicModel?.({\n modelId: \"deepseek-v4-pro\",\n } as never),\n ).toMatchObject({\n id: \"deepseek-v4-pro\",\n api: \"openai-completions\",\n provider: \"opencode-go\",\n baseUrl: \"https://opencode.ai/zen/go/v1\",\n reasoning: true,\n contextWindow: 1_000_000,\n maxTokens: 384_000,\n compat: {\n supportsUsageInStreaming: true,\n supportsReasoningEffort: true,\n maxTokensField: \"max_tokens\",\n },\n });\n });\n\n it(\"disables invalid DeepSeek V4 reasoning_effort off payloads on OpenCode Go\", async () => {\n const provider = await registerSingleProviderPlugin(plugin);\n const capturedPayloads: Record<string, unknown>[] = [];\n const baseStreamFn = (_model: unknown, _context: unknown, options: unknown) => {\n const payload = {\n model: \"deepseek-v4-flash\",\n reasoning_effort: \"off\",\n reasoning: \"off\",\n };\n (options as { onPayload?: (payload: Record<string, unknown>) => void })?.onPayload?.(payload);\n capturedPayloads.push(payload);\n return {} as never;\n };\n\n const streamFn = provider.wrapStreamFn?.({\n streamFn: baseStreamFn as never,\n providerId: \"opencode-go\",\n modelId: \"deepseek-v4-flash\",\n thinkingLevel: \"off\",\n } as never);\n\n expect(streamFn).toBeTypeOf(\"function\");\n await streamFn?.(\n { provider: \"opencode-go\", id: \"deepseek-v4-flash\" } as never,\n {} as never,\n {},\n );\n\n expect(capturedPayloads).toEqual([\n {\n model: \"deepseek-v4-flash\",\n thinking: { type: \"disabled\" },\n },\n ]);\n });\n\n it(\"canonicalizes stale OpenCode Go base URLs\", async () => {\n const provider = await registerSingleProviderPlugin(plugin);\n\n expect(\n provider.normalizeConfig?.({\n provider: \"opencode-go\",\n providerConfig: {\n api: \"openai-completions\",\n baseUrl: \"https://opencode.ai/go/v1/\",\n models: [],\n },\n } as never),\n ).toMatchObject({\n baseUrl: \"https://opencode.ai/zen/go/v1\",\n });\n\n expect(\n provider.normalizeResolvedModel?.({\n provider: \"opencode-go\",\n model: {\n provider: \"opencode-go\",\n id: \"kimi-k2.5\",\n name: \"Kimi K2.5\",\n api: \"openai-completions\",\n baseUrl: \"https://opencode.ai/go/v1\",\n reasoning: true,\n input: [\"text\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 262_144,\n maxTokens: 65_536,\n },\n } as never),\n ).toMatchObject({\n baseUrl: \"https://opencode.ai/zen/go/v1\",\n });\n\n expect(\n provider.normalizeTransport?.({\n provider: \"opencode-go\",\n api: \"openai-completions\",\n baseUrl: \"https://opencode.ai/go/v1\",\n } as never),\n ).toEqual({\n api: \"openai-completions\",\n baseUrl: \"https://opencode.ai/zen/go/v1\",\n });\n\n expect(\n provider.normalizeTransport?.({\n provider: \"opencode-go\",\n api: \"anthropic-messages\",\n baseUrl: \"https://opencode.ai/go\",\n } as never),\n ).toEqual({\n api: \"anthropic-messages\",\n baseUrl: \"https://opencode.ai/zen/go\",\n });\n });\n});\n"}}}} |