Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
2aeafc2
feat: add IO Intelligence provider
smiraldr Sep 17, 2026
e542095
fix(api): derive IO Intelligence model metadata from the live catalog
smiraldr Sep 18, 2026
514746b
fix(api): forward IO Intelligence completion options only when set
smiraldr Sep 18, 2026
71387bf
fix(api): harden IO Intelligence schema and temperature guard
smiraldr Sep 18, 2026
d293beb
fix(api): forward IO Intelligence temperature in completePrompt
smiraldr Sep 19, 2026
fa2d1ac
test(api): use a catalog-listed model id in the IO Intelligence fixture
smiraldr Sep 19, 2026
6c25367
fix(webview): link the IO Intelligence model hint to the product page
smiraldr Sep 19, 2026
ad3d75d
fix: align IO Intelligence usage mapping and render order with the pr…
smiraldr Sep 19, 2026
27aebd3
test(api): cover cached_tokens:0 preservation in the IO Intelligence …
smiraldr Sep 21, 2026
e44e06a
chore: drop the IO Intelligence changeset
smiraldr Sep 23, 2026
23b0842
fix(api): redact the IO Intelligence key before the provider error is…
smiraldr Sep 23, 2026
9949b13
test: reject a disallowed IO Intelligence model in ProfileValidator
smiraldr Sep 23, 2026
9802e78
fix(webview): debounce IO Intelligence catalog refreshes while the ke…
smiraldr Sep 23, 2026
ffb2bcc
fix(webview): keep an unlisted IO Intelligence model id as the picker…
smiraldr Sep 23, 2026
5946552
fix: redact raw error metadata and keep IO Intelligence ready after a…
smiraldr Sep 24, 2026
a7379bc
fix: serialize object-valued raw error bodies before redacting them
smiraldr Sep 26, 2026
f525c0c
fix(io-intelligence): stop rendering catalog names as model descriptions
smiraldr Sep 26, 2026
2ed2d75
fix(io-intelligence): do not forward OpenAI Compatible custom headers
smiraldr Sep 26, 2026
eee097a
test(io-intelligence): assert the catalog published for each router-m…
smiraldr Sep 26, 2026
073ef6f
fix(io-intelligence): build the model catalog on a null-prototype object
smiraldr Sep 26, 2026
57170b8
test(io-intelligence): pin the request messages and the completePromp…
smiraldr Oct 2, 2026
7a4fbef
test(io-intelligence): add a visual snapshot of the provider settings
smiraldr Oct 2, 2026
e121cad
test(io-intelligence): keep only the screenshot check in the visual test
smiraldr Oct 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/cli/src/lib/utils/__tests__/context-window.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ describe("getContextWindow", () => {
[providerIdentifiers.vercelAiGateway, "vercelAiGatewayModelId"],
[providerIdentifiers.opencodeGo, "opencodeGoModelId"],
[providerIdentifiers.kenari, "kenariModelId"],
[providerIdentifiers.ioIntelligence, "ioIntelligenceModelId"],
[providerIdentifiers.nanogpt, "nanoGptModelId"],
[providerIdentifiers.zooGateway, "zooGatewayModelId"],
] as const)("uses the provider-specific model field for %s", (provider, modelField) => {
Expand Down
3 changes: 2 additions & 1 deletion apps/cli/src/lib/utils/context-window.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ function getModelIdForProvider(config: ProviderSettings): string | undefined {
return config.unboundModelId
case providerIdentifiers.litellm:
return config.litellmModelId
case providerIdentifiers.ioIntelligence:
return config.ioIntelligenceModelId
case providerIdentifiers.vercelAiGateway:
return config.vercelAiGatewayModelId
case providerIdentifiers.opencodeGo:
Expand Down Expand Up @@ -88,7 +90,6 @@ function getModelIdForProvider(config: ProviderSettings): string | undefined {
case retiredProviderIdentifiers.featherless:
case retiredProviderIdentifiers.groq:
case retiredProviderIdentifiers.huggingface:
case retiredProviderIdentifiers.ioIntelligence:
case retiredProviderIdentifiers.roo:
case providerIdentifiers.vscodeLm:
case providerIdentifiers.fakeAi:
Expand Down
26 changes: 26 additions & 0 deletions packages/types/src/__tests__/io-intelligence.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import {
dynamicProviders,
getModelId,
getProviderDefaultModelId,
ioIntelligenceDefaultModelId,
isSecretStateKey,
providerIdentifiers,
providerSettingsSchema,
} from "../index.js"

describe("IO Intelligence shared contract", () => {
it("registers the stable dynamic-provider identity and default model", () => {
expect(providerIdentifiers.ioIntelligence).toBe("io-intelligence")
expect(dynamicProviders).toContain(providerIdentifiers.ioIntelligence)
expect(getProviderDefaultModelId(providerIdentifiers.ioIntelligence)).toBe(ioIntelligenceDefaultModelId)
})

it("classifies the API key as secret and resolves the configured model", () => {
expect(isSecretStateKey("ioIntelligenceApiKey")).toBe(true)
const settings = providerSettingsSchema.parse({
apiProvider: providerIdentifiers.ioIntelligence,
ioIntelligenceModelId: "model",
})
expect(getModelId(settings)).toBe("model")
})
})
3 changes: 2 additions & 1 deletion packages/types/src/__tests__/provider-identifiers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const expectedProviderIdentifiers = [
"opencode-go",
"kenari",
"nanogpt",
"io-intelligence",
"ollama",
"lmstudio",
"vscode-lm",
Expand Down Expand Up @@ -69,7 +70,6 @@ const expectedRetiredProviderIdentifiers = [
"featherless",
"groq",
"huggingface",
"io-intelligence",
"roo",
]
/* eslint-enable zoo/no-raw-provider-identifiers */
Expand Down Expand Up @@ -111,6 +111,7 @@ describe("provider identifiers", () => {
providerIdentifiers.opencodeGo,
providerIdentifiers.kenari,
providerIdentifiers.nanogpt,
providerIdentifiers.ioIntelligence,
providerIdentifiers.kimiCode,
])
expect(localProviders).toEqual([providerIdentifiers.ollama, providerIdentifiers.lmstudio])
Expand Down
1 change: 1 addition & 0 deletions packages/types/src/__tests__/provider-model-id.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const expectedModelIdKeys = [
"opencodeGoModelId",
"kenariModelId",
"nanoGptModelId",
"ioIntelligenceModelId",
"zooGatewayModelId",
] as const

Expand Down
1 change: 1 addition & 0 deletions packages/types/src/global-settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,7 @@ export const SECRET_STATE_KEYS = [
"vercelAiGatewayApiKey",
"opencodeGoApiKey",
"kenariApiKey",
"ioIntelligenceApiKey",
"nanoGptApiKey",
"basetenApiKey",
] as const
Expand Down
2 changes: 1 addition & 1 deletion packages/types/src/provider-identifiers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export const providerIdentifiers = {
opencodeGo: "opencode-go",
kenari: "kenari",
nanogpt: "nanogpt",
ioIntelligence: "io-intelligence",
ollama: "ollama",
lmstudio: "lmstudio",
vscodeLm: "vscode-lm",
Expand Down Expand Up @@ -52,7 +53,6 @@ export const retiredProviderIdentifiers = {
featherless: "featherless",
groq: "groq",
huggingface: "huggingface",
ioIntelligence: "io-intelligence",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

was this provider previously enabled?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. It was added in #6875 and removed in #11297 with the low-usage batch. This puts it back, so the id comes out of the retired list and settings saved before the removal get the provider again instead of the retired-provider message.

roo: "roo",
} as const

Expand Down
7 changes: 7 additions & 0 deletions packages/types/src/provider-settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
providerIdentifiers.opencodeGo,
providerIdentifiers.kenari,
providerIdentifiers.nanogpt,
providerIdentifiers.ioIntelligence,
providerIdentifiers.kimiCode,
] as const

Expand Down Expand Up @@ -287,6 +288,7 @@
"opencodeGoModelId",
"kenariModelId",
"nanoGptModelId",
"ioIntelligenceModelId",
"zooGatewayModelId",
] as const satisfies readonly ModelIdKey[]

Expand Down Expand Up @@ -515,6 +517,11 @@
},
[providerIdentifiers.opencodeGo]: { id: providerIdentifiers.opencodeGo, label: "Opencode Go", models: [] },
[providerIdentifiers.kenari]: { id: providerIdentifiers.kenari, label: "Kenari", models: [] },
[providerIdentifiers.ioIntelligence]: {
id: providerIdentifiers.ioIntelligence,
label: "IO Intelligence",

Check warning on line 522 in packages/types/src/provider-settings.ts

View workflow job for this annotation

GitHub Actions / mutation-diff

Mutation test advisory

packages/types/src/provider-settings.ts:522: Survived StringLiteral mutant (replacement: ""). See the job summary for the complete list and resolution guidance.
models: [],

Check warning on line 523 in packages/types/src/provider-settings.ts

View workflow job for this annotation

GitHub Actions / mutation-diff

Mutation test advisory

packages/types/src/provider-settings.ts:523: Survived ArrayDeclaration mutant (replacement: ["Stryker was here"]). See the job summary for the complete list and resolution guidance.
},
[providerIdentifiers.nanogpt]: { id: providerIdentifiers.nanogpt, label: "NanoGPT", models: [] },
[providerIdentifiers.zooGateway]: { id: providerIdentifiers.zooGateway, label: "Zoo Gateway", models: [] },

Expand Down
2 changes: 2 additions & 0 deletions packages/types/src/provider-settings/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import { qwenCodeProviderDefinition } from "./qwen-code.js"
import { vercelAiGatewayProviderDefinition } from "./vercel-ai-gateway.js"
import { opencodeGoProviderDefinition } from "./opencode-go.js"
import { kenariProviderDefinition } from "./kenari.js"
import { ioIntelligenceProviderDefinition } from "./io-intelligence.js"
import { nanoGptProviderDefinition } from "./nanogpt.js"
import { zooGatewayProviderDefinition } from "./zoo-gateway.js"
import { basetenProviderDefinition } from "./baseten.js"
Expand Down Expand Up @@ -82,6 +83,7 @@ export const providerDefinitionList = [
opencodeGoProviderDefinition,
kenariProviderDefinition,
nanoGptProviderDefinition,
ioIntelligenceProviderDefinition,
zooGatewayProviderDefinition,
basetenProviderDefinition,
] as const satisfies readonly ProviderDefinition[]
17 changes: 17 additions & 0 deletions packages/types/src/provider-settings/io-intelligence.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { z } from "zod"

import { providerIdentifiers } from "../provider-identifiers.js"
import { baseProviderSettingsShape, createModelIdAccessor, createProviderDefinition } from "./common.js"

const IO_INTELLIGENCE_MODEL_ID_FIELD = "ioIntelligenceModelId"

Check warning on line 6 in packages/types/src/provider-settings/io-intelligence.ts

View workflow job for this annotation

GitHub Actions / mutation-diff

Mutation test advisory

packages/types/src/provider-settings/io-intelligence.ts:6: Survived StringLiteral mutant (replacement: ""). See the job summary for the complete list and resolution guidance.

export const ioIntelligenceProviderDefinition = createProviderDefinition({

Check warning on line 8 in packages/types/src/provider-settings/io-intelligence.ts

View workflow job for this annotation

GitHub Actions / mutation-diff

Mutation test advisory

packages/types/src/provider-settings/io-intelligence.ts:8: Survived ObjectLiteral mutant (replacement: {}). See the job summary for the complete list and resolution guidance.
apiProvider: providerIdentifiers.ioIntelligence,
modelIdKey: IO_INTELLIGENCE_MODEL_ID_FIELD,
getModelId: createModelIdAccessor(IO_INTELLIGENCE_MODEL_ID_FIELD),
schema: {
...baseProviderSettingsShape,
ioIntelligenceApiKey: z.string().optional(),
[IO_INTELLIGENCE_MODEL_ID_FIELD]: z.string().optional(),
},
})
4 changes: 4 additions & 0 deletions packages/types/src/providers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export * from "./xai.js"
export * from "./vercel-ai-gateway.js"
export * from "./opencode-go.js"
export * from "./kenari.js"
export * from "./io-intelligence.js"
export * from "./nanogpt.js"
export * from "./kimi-code.js"
export * from "./zai.js"
Expand Down Expand Up @@ -55,6 +56,7 @@ import { xaiDefaultModelId } from "./xai.js"
import { vercelAiGatewayDefaultModelId } from "./vercel-ai-gateway.js"
import { opencodeGoDefaultModelId } from "./opencode-go.js"
import { kenariDefaultModelId } from "./kenari.js"
import { ioIntelligenceDefaultModelId } from "./io-intelligence.js"
import { nanoGptDefaultModelId } from "./nanogpt.js"
import { kimiCodeDefaultModelId } from "./kimi-code.js"
import { internationalZAiDefaultModelId, mainlandZAiDefaultModelId } from "./zai.js"
Expand Down Expand Up @@ -135,6 +137,8 @@ export function getProviderDefaultModelId(
return opencodeGoDefaultModelId
case providerIdentifiers.kenari:
return kenariDefaultModelId
case providerIdentifiers.ioIntelligence:
return ioIntelligenceDefaultModelId
case providerIdentifiers.nanogpt:
return nanoGptDefaultModelId
case providerIdentifiers.kimiCode:
Expand Down
13 changes: 13 additions & 0 deletions packages/types/src/providers/io-intelligence.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { ModelInfo } from "../model.js"

export const IO_INTELLIGENCE_BASE_URL = "https://api.intelligence.io.solutions/api/v1"

Check warning on line 3 in packages/types/src/providers/io-intelligence.ts

View workflow job for this annotation

GitHub Actions / mutation-diff

Mutation test advisory

packages/types/src/providers/io-intelligence.ts:3: Survived StringLiteral mutant (replacement: ""). See the job summary for the complete list and resolution guidance.

export const ioIntelligenceDefaultModelId = "meta-llama/Llama-3.3-70B-Instruct"

Check warning on line 5 in packages/types/src/providers/io-intelligence.ts

View workflow job for this annotation

GitHub Actions / mutation-diff

Mutation test advisory

packages/types/src/providers/io-intelligence.ts:5: Survived StringLiteral mutant (replacement: ""). See the job summary for the complete list and resolution guidance.

export const ioIntelligenceDefaultModelInfo: ModelInfo = {

Check warning on line 7 in packages/types/src/providers/io-intelligence.ts

View workflow job for this annotation

GitHub Actions / mutation-diff

Mutation test advisory

packages/types/src/providers/io-intelligence.ts:7: Survived ObjectLiteral mutant (replacement: {}). See the job summary for the complete list and resolution guidance.
maxTokens: 8192,
contextWindow: 128_000,
supportsImages: false,

Check warning on line 10 in packages/types/src/providers/io-intelligence.ts

View workflow job for this annotation

GitHub Actions / mutation-diff

Mutation test advisory

packages/types/src/providers/io-intelligence.ts:10: Survived BooleanLiteral mutant (replacement: true). See the job summary for the complete list and resolution guidance.
supportsPromptCache: false,

Check warning on line 11 in packages/types/src/providers/io-intelligence.ts

View workflow job for this annotation

GitHub Actions / mutation-diff

Mutation test advisory

packages/types/src/providers/io-intelligence.ts:11: Survived BooleanLiteral mutant (replacement: true). See the job summary for the complete list and resolution guidance.
description: "IO Intelligence model. The full model catalog is resolved dynamically from the /models endpoint.",

Check warning on line 12 in packages/types/src/providers/io-intelligence.ts

View workflow job for this annotation

GitHub Actions / mutation-diff

Mutation test advisory

packages/types/src/providers/io-intelligence.ts:12: Survived StringLiteral mutant (replacement: ""). See the job summary for the complete list and resolution guidance.
}
2 changes: 2 additions & 0 deletions src/api/__tests__/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import {
FireworksHandler,
FriendliHandler,
GeminiHandler,
IOIntelligenceHandler,
KenariHandler,
KimiCodeHandler,
LiteLLMHandler,
Expand Down Expand Up @@ -100,6 +101,7 @@ const expectedHandlers = {
[providerIdentifiers.vercelAiGateway]: VercelAiGatewayHandler,
[providerIdentifiers.opencodeGo]: OpencodeGoHandler,
[providerIdentifiers.kenari]: KenariHandler,
[providerIdentifiers.ioIntelligence]: IOIntelligenceHandler,
[providerIdentifiers.nanogpt]: NanoGptHandler,
[providerIdentifiers.zooGateway]: ZooGatewayHandler,
[providerIdentifiers.minimax]: MiniMaxHandler,
Expand Down
3 changes: 3 additions & 0 deletions src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import {
VercelAiGatewayHandler,
OpencodeGoHandler,
KenariHandler,
IOIntelligenceHandler,
NanoGptHandler,
ZooGatewayHandler,
MiniMaxHandler,
Expand Down Expand Up @@ -225,6 +226,8 @@ export function buildApiHandler(configuration: ProviderSettings): ApiHandler {
return new OpencodeGoHandler(options)
case providerIdentifiers.kenari:
return new KenariHandler(options)
case providerIdentifiers.ioIntelligence:
return new IOIntelligenceHandler(options)
case providerIdentifiers.nanogpt:
return new NanoGptHandler(options)
case providerIdentifiers.zooGateway:
Expand Down
Loading
Loading