@clinebot/llms 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -0
- package/dist/config-browser.d.ts +3 -0
- package/dist/config.d.ts +3 -0
- package/dist/index.browser.d.ts +4 -0
- package/dist/index.browser.js +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +7 -0
- package/dist/models/generated-access.d.ts +4 -0
- package/dist/models/generated-provider-loaders.d.ts +13 -0
- package/dist/models/generated.d.ts +14 -0
- package/dist/models/index.d.ts +43 -0
- package/dist/models/models-dev-catalog.d.ts +32 -0
- package/dist/models/providers/aihubmix.d.ts +5 -0
- package/dist/models/providers/anthropic.d.ts +53 -0
- package/dist/models/providers/asksage.d.ts +5 -0
- package/dist/models/providers/baseten.d.ts +5 -0
- package/dist/models/providers/bedrock.d.ts +7 -0
- package/dist/models/providers/cerebras.d.ts +7 -0
- package/dist/models/providers/claude-code.d.ts +4 -0
- package/dist/models/providers/cline.d.ts +34 -0
- package/dist/models/providers/deepseek.d.ts +8 -0
- package/dist/models/providers/dify.d.ts +5 -0
- package/dist/models/providers/doubao.d.ts +7 -0
- package/dist/models/providers/fireworks.d.ts +8 -0
- package/dist/models/providers/gemini.d.ts +9 -0
- package/dist/models/providers/groq.d.ts +8 -0
- package/dist/models/providers/hicap.d.ts +5 -0
- package/dist/models/providers/huawei-cloud-maas.d.ts +5 -0
- package/dist/models/providers/huggingface.d.ts +6 -0
- package/dist/models/providers/index.d.ts +45 -0
- package/dist/models/providers/litellm.d.ts +5 -0
- package/dist/models/providers/lmstudio.d.ts +5 -0
- package/dist/models/providers/minimax.d.ts +7 -0
- package/dist/models/providers/mistral.d.ts +5 -0
- package/dist/models/providers/moonshot.d.ts +7 -0
- package/dist/models/providers/nebius.d.ts +7 -0
- package/dist/models/providers/nous-research.d.ts +7 -0
- package/dist/models/providers/oca.d.ts +9 -0
- package/dist/models/providers/ollama.d.ts +5 -0
- package/dist/models/providers/openai-codex.d.ts +10 -0
- package/dist/models/providers/openai.d.ts +9 -0
- package/dist/models/providers/opencode.d.ts +10 -0
- package/dist/models/providers/openrouter.d.ts +7 -0
- package/dist/models/providers/qwen-code.d.ts +7 -0
- package/dist/models/providers/qwen.d.ts +7 -0
- package/dist/models/providers/requesty.d.ts +6 -0
- package/dist/models/providers/sambanova.d.ts +7 -0
- package/dist/models/providers/sapaicore.d.ts +7 -0
- package/dist/models/providers/together.d.ts +8 -0
- package/dist/models/providers/vercel-ai-gateway.d.ts +5 -0
- package/dist/models/providers/vertex.d.ts +7 -0
- package/dist/models/providers/xai.d.ts +8 -0
- package/dist/models/providers/zai.d.ts +7 -0
- package/dist/models/query.d.ts +181 -0
- package/dist/models/registry.d.ts +123 -0
- package/dist/models/schemas/index.d.ts +7 -0
- package/dist/models/schemas/model.d.ts +340 -0
- package/dist/models/schemas/query.d.ts +191 -0
- package/dist/providers/handlers/ai-sdk-community.d.ts +46 -0
- package/dist/providers/handlers/ai-sdk-provider-base.d.ts +32 -0
- package/dist/providers/handlers/anthropic-base.d.ts +26 -0
- package/dist/providers/handlers/asksage.d.ts +12 -0
- package/dist/providers/handlers/auth.d.ts +5 -0
- package/dist/providers/handlers/base.d.ts +55 -0
- package/dist/providers/handlers/bedrock-base.d.ts +23 -0
- package/dist/providers/handlers/bedrock-client.d.ts +4 -0
- package/dist/providers/handlers/community-sdk.d.ts +97 -0
- package/dist/providers/handlers/fetch-base.d.ts +18 -0
- package/dist/providers/handlers/gemini-base.d.ts +25 -0
- package/dist/providers/handlers/index.d.ts +19 -0
- package/dist/providers/handlers/openai-base.d.ts +54 -0
- package/dist/providers/handlers/openai-responses.d.ts +64 -0
- package/dist/providers/handlers/providers.d.ts +43 -0
- package/dist/providers/handlers/r1-base.d.ts +62 -0
- package/dist/providers/handlers/registry.d.ts +106 -0
- package/dist/providers/handlers/vertex.d.ts +32 -0
- package/dist/providers/index.d.ts +100 -0
- package/dist/providers/public.browser.d.ts +2 -0
- package/dist/providers/public.d.ts +3 -0
- package/dist/providers/shared/openai-compatible.d.ts +10 -0
- package/dist/providers/transform/ai-sdk-community-format.d.ts +9 -0
- package/dist/providers/transform/anthropic-format.d.ts +24 -0
- package/dist/providers/transform/content-format.d.ts +3 -0
- package/dist/providers/transform/gemini-format.d.ts +19 -0
- package/dist/providers/transform/index.d.ts +10 -0
- package/dist/providers/transform/openai-format.d.ts +36 -0
- package/dist/providers/transform/r1-format.d.ts +26 -0
- package/dist/providers/types/config.d.ts +261 -0
- package/dist/providers/types/handler.d.ts +71 -0
- package/dist/providers/types/index.d.ts +11 -0
- package/dist/providers/types/messages.d.ts +139 -0
- package/dist/providers/types/model-info.d.ts +32 -0
- package/dist/providers/types/provider-ids.d.ts +63 -0
- package/dist/providers/types/settings.d.ts +308 -0
- package/dist/providers/types/stream.d.ts +106 -0
- package/dist/providers/utils/index.d.ts +7 -0
- package/dist/providers/utils/retry.d.ts +38 -0
- package/dist/providers/utils/stream-processor.d.ts +110 -0
- package/dist/providers/utils/tool-processor.d.ts +34 -0
- package/dist/sdk.d.ts +18 -0
- package/dist/types.d.ts +60 -0
- package/package.json +66 -0
- package/src/catalog.ts +20 -0
- package/src/config-browser.ts +11 -0
- package/src/config.ts +49 -0
- package/src/index.browser.ts +9 -0
- package/src/index.ts +10 -0
- package/src/live-providers.test.ts +137 -0
- package/src/models/generated-access.ts +41 -0
- package/src/models/generated-provider-loaders.ts +166 -0
- package/src/models/generated.ts +11997 -0
- package/src/models/index.ts +271 -0
- package/src/models/models-dev-catalog.test.ts +161 -0
- package/src/models/models-dev-catalog.ts +161 -0
- package/src/models/providers/aihubmix.ts +19 -0
- package/src/models/providers/anthropic.ts +60 -0
- package/src/models/providers/asksage.ts +19 -0
- package/src/models/providers/baseten.ts +21 -0
- package/src/models/providers/bedrock.ts +30 -0
- package/src/models/providers/cerebras.ts +24 -0
- package/src/models/providers/claude-code.ts +51 -0
- package/src/models/providers/cline.ts +25 -0
- package/src/models/providers/deepseek.ts +33 -0
- package/src/models/providers/dify.ts +17 -0
- package/src/models/providers/doubao.ts +33 -0
- package/src/models/providers/fireworks.ts +34 -0
- package/src/models/providers/gemini.ts +43 -0
- package/src/models/providers/groq.ts +33 -0
- package/src/models/providers/hicap.ts +18 -0
- package/src/models/providers/huawei-cloud-maas.ts +18 -0
- package/src/models/providers/huggingface.ts +22 -0
- package/src/models/providers/index.ts +162 -0
- package/src/models/providers/litellm.ts +19 -0
- package/src/models/providers/lmstudio.ts +22 -0
- package/src/models/providers/minimax.ts +34 -0
- package/src/models/providers/mistral.ts +19 -0
- package/src/models/providers/moonshot.ts +34 -0
- package/src/models/providers/nebius.ts +24 -0
- package/src/models/providers/nous-research.ts +21 -0
- package/src/models/providers/oca.ts +30 -0
- package/src/models/providers/ollama.ts +18 -0
- package/src/models/providers/openai-codex.ts +30 -0
- package/src/models/providers/openai.ts +43 -0
- package/src/models/providers/opencode.ts +28 -0
- package/src/models/providers/openrouter.ts +24 -0
- package/src/models/providers/qwen-code.ts +33 -0
- package/src/models/providers/qwen.ts +34 -0
- package/src/models/providers/requesty.ts +23 -0
- package/src/models/providers/sambanova.ts +23 -0
- package/src/models/providers/sapaicore.ts +34 -0
- package/src/models/providers/together.ts +35 -0
- package/src/models/providers/vercel-ai-gateway.ts +23 -0
- package/src/models/providers/vertex.ts +36 -0
- package/src/models/providers/xai.ts +34 -0
- package/src/models/providers/zai.ts +25 -0
- package/src/models/query.ts +407 -0
- package/src/models/registry.ts +511 -0
- package/src/models/schemas/index.ts +62 -0
- package/src/models/schemas/model.ts +308 -0
- package/src/models/schemas/query.ts +336 -0
- package/src/providers/browser.ts +4 -0
- package/src/providers/handlers/ai-sdk-community.ts +226 -0
- package/src/providers/handlers/ai-sdk-provider-base.ts +193 -0
- package/src/providers/handlers/anthropic-base.ts +372 -0
- package/src/providers/handlers/asksage.test.ts +103 -0
- package/src/providers/handlers/asksage.ts +138 -0
- package/src/providers/handlers/auth.test.ts +19 -0
- package/src/providers/handlers/auth.ts +121 -0
- package/src/providers/handlers/base.test.ts +46 -0
- package/src/providers/handlers/base.ts +160 -0
- package/src/providers/handlers/bedrock-base.ts +390 -0
- package/src/providers/handlers/bedrock-client.ts +100 -0
- package/src/providers/handlers/codex.test.ts +123 -0
- package/src/providers/handlers/community-sdk.test.ts +288 -0
- package/src/providers/handlers/community-sdk.ts +392 -0
- package/src/providers/handlers/fetch-base.ts +68 -0
- package/src/providers/handlers/gemini-base.ts +302 -0
- package/src/providers/handlers/index.ts +67 -0
- package/src/providers/handlers/openai-base.ts +277 -0
- package/src/providers/handlers/openai-responses.ts +598 -0
- package/src/providers/handlers/providers.test.ts +120 -0
- package/src/providers/handlers/providers.ts +563 -0
- package/src/providers/handlers/r1-base.ts +280 -0
- package/src/providers/handlers/registry.ts +185 -0
- package/src/providers/handlers/vertex.test.ts +124 -0
- package/src/providers/handlers/vertex.ts +292 -0
- package/src/providers/index.ts +534 -0
- package/src/providers/public.browser.ts +20 -0
- package/src/providers/public.ts +51 -0
- package/src/providers/shared/openai-compatible.ts +63 -0
- package/src/providers/transform/ai-sdk-community-format.test.ts +73 -0
- package/src/providers/transform/ai-sdk-community-format.ts +115 -0
- package/src/providers/transform/anthropic-format.ts +218 -0
- package/src/providers/transform/content-format.ts +34 -0
- package/src/providers/transform/format-conversion.test.ts +310 -0
- package/src/providers/transform/gemini-format.ts +167 -0
- package/src/providers/transform/index.ts +22 -0
- package/src/providers/transform/openai-format.ts +247 -0
- package/src/providers/transform/r1-format.ts +287 -0
- package/src/providers/types/config.ts +388 -0
- package/src/providers/types/handler.ts +87 -0
- package/src/providers/types/index.ts +120 -0
- package/src/providers/types/messages.ts +158 -0
- package/src/providers/types/model-info.test.ts +57 -0
- package/src/providers/types/model-info.ts +65 -0
- package/src/providers/types/provider-ids.test.ts +12 -0
- package/src/providers/types/provider-ids.ts +89 -0
- package/src/providers/types/settings.test.ts +49 -0
- package/src/providers/types/settings.ts +533 -0
- package/src/providers/types/stream.ts +117 -0
- package/src/providers/utils/index.ts +27 -0
- package/src/providers/utils/retry.test.ts +140 -0
- package/src/providers/utils/retry.ts +188 -0
- package/src/providers/utils/stream-processor.test.ts +232 -0
- package/src/providers/utils/stream-processor.ts +472 -0
- package/src/providers/utils/tool-processor.test.ts +34 -0
- package/src/providers/utils/tool-processor.ts +111 -0
- package/src/sdk.ts +264 -0
- package/src/types.ts +79 -0
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@clinebot/llms",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"main": "./dist/index.js",
|
|
5
|
+
"module": "./dist/index.js",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@clinebot/shared": "workspace:*",
|
|
8
|
+
"@ai-sdk/amazon-bedrock": "^4.0.67",
|
|
9
|
+
"@ai-sdk/google-vertex": "^4.0.74",
|
|
10
|
+
"@ai-sdk/mistral": "^3.0.24",
|
|
11
|
+
"@anthropic-ai/sdk": "^0.78.0",
|
|
12
|
+
"@aws-sdk/credential-providers": "^3.922.0",
|
|
13
|
+
"@google/genai": "^1.43.0",
|
|
14
|
+
"@streamparser/json": "^0.0.21",
|
|
15
|
+
"ai": "^6.0.112",
|
|
16
|
+
"ai-sdk-provider-claude-code": "^3.4.3",
|
|
17
|
+
"ai-sdk-provider-codex-cli": "^1.1.0",
|
|
18
|
+
"ai-sdk-provider-opencode-sdk": "^2.1.2",
|
|
19
|
+
"dify-ai-provider": "^1.1.0",
|
|
20
|
+
"nanoid": "^5.1.6",
|
|
21
|
+
"openai": "^6.25.0",
|
|
22
|
+
"zod": "^4.3.6"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@aws-sdk/client-bedrock-runtime": "^3.0.0"
|
|
26
|
+
},
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"browser": "./dist/index.browser.js",
|
|
30
|
+
"react-server": "./dist/index.browser.js",
|
|
31
|
+
"development": "./src/index.ts",
|
|
32
|
+
"import": "./dist/index.js",
|
|
33
|
+
"types": "./dist/index.d.ts"
|
|
34
|
+
},
|
|
35
|
+
"./node": {
|
|
36
|
+
"development": "./src/index.ts",
|
|
37
|
+
"import": "./dist/index.js",
|
|
38
|
+
"types": "./dist/index.d.ts"
|
|
39
|
+
},
|
|
40
|
+
"./browser": {
|
|
41
|
+
"development": "./src/index.browser.ts",
|
|
42
|
+
"import": "./dist/index.browser.js",
|
|
43
|
+
"types": "./dist/index.browser.d.ts"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"description": "Config-driven SDK for selecting, extending, and instantiating LLM providers and models",
|
|
47
|
+
"files": [
|
|
48
|
+
"dist",
|
|
49
|
+
"src"
|
|
50
|
+
],
|
|
51
|
+
"peerDependenciesMeta": {
|
|
52
|
+
"@aws-sdk/client-bedrock-runtime": {
|
|
53
|
+
"optional": true
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "bun run bun.mts && bun tsc -p tsconfig.build.json",
|
|
58
|
+
"typecheck": "bun tsc -p tsconfig.dev.json --noEmit",
|
|
59
|
+
"test": "vitest run",
|
|
60
|
+
"test:watch": "vitest",
|
|
61
|
+
"clean": "rm -rf dist node_modules",
|
|
62
|
+
"generate:models": "bun run scripts/generate-models.ts"
|
|
63
|
+
},
|
|
64
|
+
"type": "module",
|
|
65
|
+
"types": "./dist/index.d.ts"
|
|
66
|
+
}
|
package/src/catalog.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ProviderCapability } from "./models/schemas/index";
|
|
2
|
+
import {
|
|
3
|
+
buildOpenAICompatibleProviderDefaults,
|
|
4
|
+
type OpenAICompatibleProviderDefaults,
|
|
5
|
+
} from "./providers/shared/openai-compatible";
|
|
6
|
+
|
|
7
|
+
export * as models from "./models/index";
|
|
8
|
+
export type { ProviderCapability } from "./models/schemas/index";
|
|
9
|
+
|
|
10
|
+
export interface CatalogProviderDefaults
|
|
11
|
+
extends Omit<OpenAICompatibleProviderDefaults, "capabilities"> {
|
|
12
|
+
capabilities?: ProviderCapability[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const OPENAI_COMPATIBLE_PROVIDERS: Record<
|
|
16
|
+
string,
|
|
17
|
+
CatalogProviderDefaults
|
|
18
|
+
> = buildOpenAICompatibleProviderDefaults({
|
|
19
|
+
includeKnownModels: true,
|
|
20
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { LlmsConfig } from "./types";
|
|
2
|
+
|
|
3
|
+
export function defineLlmsConfig(config: LlmsConfig): LlmsConfig {
|
|
4
|
+
return config;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export async function loadLlmsConfigFromFile(): Promise<LlmsConfig> {
|
|
8
|
+
throw new Error(
|
|
9
|
+
"loadLlmsConfigFromFile is Node-only. Use @clinebot/llms in a Node runtime or pass a config object directly in browser runtimes.",
|
|
10
|
+
);
|
|
11
|
+
}
|
package/src/config.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import type { LlmsConfig } from "./types";
|
|
4
|
+
|
|
5
|
+
export function defineLlmsConfig(config: LlmsConfig): LlmsConfig {
|
|
6
|
+
return config;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export async function loadLlmsConfigFromFile(
|
|
10
|
+
configPath: string,
|
|
11
|
+
): Promise<LlmsConfig> {
|
|
12
|
+
const resolvedPath = path.resolve(configPath);
|
|
13
|
+
const raw = await readFile(resolvedPath, "utf8");
|
|
14
|
+
|
|
15
|
+
let parsed: unknown;
|
|
16
|
+
try {
|
|
17
|
+
parsed = JSON.parse(raw);
|
|
18
|
+
} catch (error) {
|
|
19
|
+
const details = error instanceof Error ? error.message : String(error);
|
|
20
|
+
throw new Error(
|
|
21
|
+
`Failed to parse JSON config at "${resolvedPath}": ${details}`,
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return assertLlmsConfig(parsed, resolvedPath);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function assertLlmsConfig(value: unknown, source: string): LlmsConfig {
|
|
29
|
+
if (!value || typeof value !== "object") {
|
|
30
|
+
throw new Error(`Invalid llms config in "${source}": expected an object.`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const config = value as Record<string, unknown>;
|
|
34
|
+
const providers = config.providers;
|
|
35
|
+
|
|
36
|
+
if (!Array.isArray(providers)) {
|
|
37
|
+
throw new Error(
|
|
38
|
+
`Invalid llms config in "${source}": "providers" must be an array.`,
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!providers.length) {
|
|
43
|
+
throw new Error(
|
|
44
|
+
`Invalid llms config in "${source}": "providers" cannot be empty.`,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return value as LlmsConfig;
|
|
49
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { defineLlmsConfig, loadLlmsConfigFromFile } from "./config-browser";
|
|
2
|
+
export * as models from "./models/index";
|
|
3
|
+
export * as providers from "./providers/public.browser";
|
|
4
|
+
export type {
|
|
5
|
+
CustomProviderConfig,
|
|
6
|
+
LlmsConfig,
|
|
7
|
+
LlmsSdk,
|
|
8
|
+
ProviderSelectionConfig,
|
|
9
|
+
} from "./types";
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { defineLlmsConfig } from "./config";
|
|
2
|
+
export * as models from "./models/index";
|
|
3
|
+
export * as providers from "./providers/public";
|
|
4
|
+
export { createLlmsSdk } from "./sdk";
|
|
5
|
+
export type {
|
|
6
|
+
CustomProviderConfig,
|
|
7
|
+
LlmsConfig,
|
|
8
|
+
LlmsSdk,
|
|
9
|
+
ProviderSelectionConfig,
|
|
10
|
+
} from "./types";
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { describe, it } from "vitest";
|
|
4
|
+
import { providers } from "./index";
|
|
5
|
+
|
|
6
|
+
type ProviderConfig = providers.ProviderConfig;
|
|
7
|
+
type ProviderSettings = providers.ProviderSettings;
|
|
8
|
+
|
|
9
|
+
interface StoredProviderSettingsEntryLike {
|
|
10
|
+
settings?: unknown;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface StoredProviderSettingsLike {
|
|
14
|
+
providers?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface ProviderTarget {
|
|
18
|
+
label: string;
|
|
19
|
+
config: ProviderConfig;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const LIVE_TEST_ENABLED = process.env.LLMS_LIVE_TESTS === "1";
|
|
23
|
+
const PROVIDERS_FILE_ENV = "LLMS_LIVE_PROVIDERS_PATH";
|
|
24
|
+
const PROVIDER_TIMEOUT_MS = Number(
|
|
25
|
+
process.env.LLMS_LIVE_PROVIDER_TIMEOUT_MS ?? "90000",
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const liveDescribe = LIVE_TEST_ENABLED ? describe : describe.skip;
|
|
29
|
+
|
|
30
|
+
function requireProvidersFilePath(): string {
|
|
31
|
+
const filePath = process.env[PROVIDERS_FILE_ENV];
|
|
32
|
+
if (!filePath) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
`Set ${PROVIDERS_FILE_ENV} to a providers.json file path before running live provider tests.`,
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
return path.resolve(filePath);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function toTargetsFromStoredFormat(
|
|
41
|
+
json: StoredProviderSettingsLike,
|
|
42
|
+
): ProviderTarget[] {
|
|
43
|
+
const entries = Object.entries(json.providers ?? {});
|
|
44
|
+
return entries.map(([entryKey, entryValue]) => {
|
|
45
|
+
const maybeEntry = entryValue as StoredProviderSettingsEntryLike;
|
|
46
|
+
const rawSettings = maybeEntry.settings ?? entryValue;
|
|
47
|
+
const parsed = providers.ProviderSettingsSchema.parse(
|
|
48
|
+
rawSettings,
|
|
49
|
+
) as ProviderSettings;
|
|
50
|
+
return {
|
|
51
|
+
label: `${entryKey} (${parsed.provider})`,
|
|
52
|
+
config: providers.toProviderConfig(parsed),
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function loadProviderTargets(filePath: string): ProviderTarget[] {
|
|
58
|
+
const raw = readFileSync(filePath, "utf8");
|
|
59
|
+
const parsed = JSON.parse(raw) as unknown;
|
|
60
|
+
|
|
61
|
+
if (Array.isArray(parsed)) {
|
|
62
|
+
return parsed.map((entry, index) => {
|
|
63
|
+
const settings = providers.ProviderSettingsSchema.parse(
|
|
64
|
+
entry,
|
|
65
|
+
) as ProviderSettings;
|
|
66
|
+
return {
|
|
67
|
+
label: `index:${index} (${settings.provider})`,
|
|
68
|
+
config: providers.toProviderConfig(settings),
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const maybeStored = parsed as StoredProviderSettingsLike;
|
|
74
|
+
return toTargetsFromStoredFormat(maybeStored);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function withTimeout<T>(
|
|
78
|
+
promise: Promise<T>,
|
|
79
|
+
timeoutMs: number,
|
|
80
|
+
label: string,
|
|
81
|
+
): Promise<T> {
|
|
82
|
+
let timeout: NodeJS.Timeout | undefined;
|
|
83
|
+
const timeoutPromise = new Promise<T>((_, reject) => {
|
|
84
|
+
timeout = setTimeout(() => {
|
|
85
|
+
reject(new Error(`Timed out after ${timeoutMs}ms: ${label}`));
|
|
86
|
+
}, timeoutMs);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
return await Promise.race([promise, timeoutPromise]);
|
|
91
|
+
} finally {
|
|
92
|
+
if (timeout) {
|
|
93
|
+
clearTimeout(timeout);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function runPrompt(target: ProviderTarget): Promise<void> {
|
|
99
|
+
const handler = await providers.createHandlerAsync(target.config);
|
|
100
|
+
const stream = handler.createMessage("You are a concise assistant.", [
|
|
101
|
+
{ role: "user", content: "Reply with the single word OK." },
|
|
102
|
+
]);
|
|
103
|
+
|
|
104
|
+
for await (const chunk of stream) {
|
|
105
|
+
if (chunk.type === "done" && !chunk.success) {
|
|
106
|
+
throw new Error(chunk.error ?? "done chunk reported success=false");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
liveDescribe("live provider smoke test", () => {
|
|
112
|
+
it("reads configured providers from json and reports providers with failed responses", async () => {
|
|
113
|
+
const filePath = requireProvidersFilePath();
|
|
114
|
+
const targets = loadProviderTargets(filePath);
|
|
115
|
+
|
|
116
|
+
if (!targets.length) {
|
|
117
|
+
throw new Error(`No providers found in ${filePath}.`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const failures: string[] = [];
|
|
121
|
+
|
|
122
|
+
for (const target of targets) {
|
|
123
|
+
try {
|
|
124
|
+
await withTimeout(runPrompt(target), PROVIDER_TIMEOUT_MS, target.label);
|
|
125
|
+
} catch (error) {
|
|
126
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
127
|
+
failures.push(`${target.label}: ${message}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (failures.length > 0) {
|
|
132
|
+
throw new Error(
|
|
133
|
+
`Providers with error responses (${failures.length}):\n${failures.join("\n")}`,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
}, 300_000);
|
|
137
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { GENERATED_PROVIDER_MODELS } from "./generated";
|
|
2
|
+
import { sortModelsByReleaseDate } from "./models-dev-catalog";
|
|
3
|
+
import type { ModelInfo } from "./schemas/index";
|
|
4
|
+
|
|
5
|
+
let sortedGeneratedProviderModelsCache:
|
|
6
|
+
| Record<string, Record<string, ModelInfo>>
|
|
7
|
+
| undefined;
|
|
8
|
+
const sortedGeneratedModelsByProviderCache = new Map<
|
|
9
|
+
string,
|
|
10
|
+
Record<string, ModelInfo>
|
|
11
|
+
>();
|
|
12
|
+
|
|
13
|
+
export function getGeneratedProviderModels(): Record<
|
|
14
|
+
string,
|
|
15
|
+
Record<string, ModelInfo>
|
|
16
|
+
> {
|
|
17
|
+
sortedGeneratedProviderModelsCache ??= Object.fromEntries(
|
|
18
|
+
Object.entries(GENERATED_PROVIDER_MODELS.providers).map(
|
|
19
|
+
([providerId, models]) => [providerId, sortModelsByReleaseDate(models)],
|
|
20
|
+
),
|
|
21
|
+
);
|
|
22
|
+
return sortedGeneratedProviderModelsCache;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function getGeneratedModelsVersion(): number {
|
|
26
|
+
return GENERATED_PROVIDER_MODELS.version;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function getGeneratedModelsForProvider(
|
|
30
|
+
providerId: string,
|
|
31
|
+
): Record<string, ModelInfo> {
|
|
32
|
+
const cached = sortedGeneratedModelsByProviderCache.get(providerId);
|
|
33
|
+
if (cached) {
|
|
34
|
+
return cached;
|
|
35
|
+
}
|
|
36
|
+
const sorted = sortModelsByReleaseDate(
|
|
37
|
+
GENERATED_PROVIDER_MODELS.providers[providerId] ?? {},
|
|
38
|
+
);
|
|
39
|
+
sortedGeneratedModelsByProviderCache.set(providerId, sorted);
|
|
40
|
+
return sorted;
|
|
41
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generated provider loader registry.
|
|
3
|
+
*
|
|
4
|
+
* WARNING: DO NOT EDIT THIS FILE MANUALLY.
|
|
5
|
+
*
|
|
6
|
+
* Generated by: @clinebot/llms/scripts/generate-provider-loaders.ts
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { ModelCollection } from "./schemas/index";
|
|
10
|
+
|
|
11
|
+
export type GeneratedProviderLoaderEntry = readonly [
|
|
12
|
+
providerId: string,
|
|
13
|
+
load: () => Promise<ModelCollection>,
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
export const GENERATED_PROVIDER_LOADER_ENTRIES: GeneratedProviderLoaderEntry[] =
|
|
17
|
+
[
|
|
18
|
+
[
|
|
19
|
+
"aihubmix",
|
|
20
|
+
async () => (await import("./providers/aihubmix")).AIHUBMIX_PROVIDER,
|
|
21
|
+
],
|
|
22
|
+
[
|
|
23
|
+
"anthropic",
|
|
24
|
+
async () => (await import("./providers/anthropic")).ANTHROPIC_PROVIDER,
|
|
25
|
+
],
|
|
26
|
+
[
|
|
27
|
+
"asksage",
|
|
28
|
+
async () => (await import("./providers/asksage")).ASKSAGE_PROVIDER,
|
|
29
|
+
],
|
|
30
|
+
[
|
|
31
|
+
"baseten",
|
|
32
|
+
async () => (await import("./providers/baseten")).BASETEN_PROVIDER,
|
|
33
|
+
],
|
|
34
|
+
[
|
|
35
|
+
"bedrock",
|
|
36
|
+
async () => (await import("./providers/bedrock")).BEDROCK_PROVIDER,
|
|
37
|
+
],
|
|
38
|
+
[
|
|
39
|
+
"cerebras",
|
|
40
|
+
async () => (await import("./providers/cerebras")).CEREBRAS_PROVIDER,
|
|
41
|
+
],
|
|
42
|
+
[
|
|
43
|
+
"claude-code",
|
|
44
|
+
async () =>
|
|
45
|
+
(await import("./providers/claude-code")).CLAUDE_CODE_PROVIDER,
|
|
46
|
+
],
|
|
47
|
+
["cline", async () => (await import("./providers/cline")).CLINE_PROVIDER],
|
|
48
|
+
[
|
|
49
|
+
"deepseek",
|
|
50
|
+
async () => (await import("./providers/deepseek")).DEEPSEEK_PROVIDER,
|
|
51
|
+
],
|
|
52
|
+
["dify", async () => (await import("./providers/dify")).DIFY_PROVIDER],
|
|
53
|
+
[
|
|
54
|
+
"doubao",
|
|
55
|
+
async () => (await import("./providers/doubao")).DOUBAO_PROVIDER,
|
|
56
|
+
],
|
|
57
|
+
[
|
|
58
|
+
"fireworks",
|
|
59
|
+
async () => (await import("./providers/fireworks")).FIREWORKS_PROVIDER,
|
|
60
|
+
],
|
|
61
|
+
[
|
|
62
|
+
"gemini",
|
|
63
|
+
async () => (await import("./providers/gemini")).GEMINI_PROVIDER,
|
|
64
|
+
],
|
|
65
|
+
["groq", async () => (await import("./providers/groq")).GROQ_PROVIDER],
|
|
66
|
+
["hicap", async () => (await import("./providers/hicap")).HICAP_PROVIDER],
|
|
67
|
+
[
|
|
68
|
+
"huawei-cloud-maas",
|
|
69
|
+
async () =>
|
|
70
|
+
(await import("./providers/huawei-cloud-maas"))
|
|
71
|
+
.HUAWEI_CLOUD_MAAS_PROVIDER,
|
|
72
|
+
],
|
|
73
|
+
[
|
|
74
|
+
"huggingface",
|
|
75
|
+
async () =>
|
|
76
|
+
(await import("./providers/huggingface")).HUGGINGFACE_PROVIDER,
|
|
77
|
+
],
|
|
78
|
+
[
|
|
79
|
+
"litellm",
|
|
80
|
+
async () => (await import("./providers/litellm")).LITELLM_PROVIDER,
|
|
81
|
+
],
|
|
82
|
+
[
|
|
83
|
+
"lmstudio",
|
|
84
|
+
async () => (await import("./providers/lmstudio")).LMSTUDIO_PROVIDER,
|
|
85
|
+
],
|
|
86
|
+
[
|
|
87
|
+
"minimax",
|
|
88
|
+
async () => (await import("./providers/minimax")).MINIMAX_PROVIDER,
|
|
89
|
+
],
|
|
90
|
+
[
|
|
91
|
+
"mistral",
|
|
92
|
+
async () => (await import("./providers/mistral")).MISTRAL_PROVIDER,
|
|
93
|
+
],
|
|
94
|
+
[
|
|
95
|
+
"moonshot",
|
|
96
|
+
async () => (await import("./providers/moonshot")).MOONSHOT_PROVIDER,
|
|
97
|
+
],
|
|
98
|
+
[
|
|
99
|
+
"nebius",
|
|
100
|
+
async () => (await import("./providers/nebius")).NEBIUS_PROVIDER,
|
|
101
|
+
],
|
|
102
|
+
[
|
|
103
|
+
"nousResearch",
|
|
104
|
+
async () =>
|
|
105
|
+
(await import("./providers/nous-research")).NOUS_RESEARCH_PROVIDER,
|
|
106
|
+
],
|
|
107
|
+
["oca", async () => (await import("./providers/oca")).OCA_PROVIDER],
|
|
108
|
+
[
|
|
109
|
+
"ollama",
|
|
110
|
+
async () => (await import("./providers/ollama")).OLLAMA_PROVIDER,
|
|
111
|
+
],
|
|
112
|
+
[
|
|
113
|
+
"openai",
|
|
114
|
+
async () => (await import("./providers/openai")).OPENAI_PROVIDER,
|
|
115
|
+
],
|
|
116
|
+
[
|
|
117
|
+
"openai-codex",
|
|
118
|
+
async () =>
|
|
119
|
+
(await import("./providers/openai-codex")).OPENAI_CODEX_PROVIDER,
|
|
120
|
+
],
|
|
121
|
+
[
|
|
122
|
+
"openai-native",
|
|
123
|
+
async () => (await import("./providers/openai")).OPENAI_PROVIDER,
|
|
124
|
+
],
|
|
125
|
+
[
|
|
126
|
+
"opencode",
|
|
127
|
+
async () => (await import("./providers/opencode")).OPENCODE_PROVIDER,
|
|
128
|
+
],
|
|
129
|
+
[
|
|
130
|
+
"openrouter",
|
|
131
|
+
async () => (await import("./providers/openrouter")).OPENROUTER_PROVIDER,
|
|
132
|
+
],
|
|
133
|
+
["qwen", async () => (await import("./providers/qwen")).QWEN_PROVIDER],
|
|
134
|
+
[
|
|
135
|
+
"qwen-code",
|
|
136
|
+
async () => (await import("./providers/qwen-code")).QWEN_CODE_PROVIDER,
|
|
137
|
+
],
|
|
138
|
+
[
|
|
139
|
+
"requesty",
|
|
140
|
+
async () => (await import("./providers/requesty")).REQUESTY_PROVIDER,
|
|
141
|
+
],
|
|
142
|
+
[
|
|
143
|
+
"sambanova",
|
|
144
|
+
async () => (await import("./providers/sambanova")).SAMBANOVA_PROVIDER,
|
|
145
|
+
],
|
|
146
|
+
[
|
|
147
|
+
"sapaicore",
|
|
148
|
+
async () => (await import("./providers/sapaicore")).SAP_AI_CORE_PROVIDER,
|
|
149
|
+
],
|
|
150
|
+
[
|
|
151
|
+
"together",
|
|
152
|
+
async () => (await import("./providers/together")).TOGETHER_PROVIDER,
|
|
153
|
+
],
|
|
154
|
+
[
|
|
155
|
+
"vercel-ai-gateway",
|
|
156
|
+
async () =>
|
|
157
|
+
(await import("./providers/vercel-ai-gateway"))
|
|
158
|
+
.VERCEL_AI_GATEWAY_PROVIDER,
|
|
159
|
+
],
|
|
160
|
+
[
|
|
161
|
+
"vertex",
|
|
162
|
+
async () => (await import("./providers/vertex")).VERTEX_PROVIDER,
|
|
163
|
+
],
|
|
164
|
+
["xai", async () => (await import("./providers/xai")).XAI_PROVIDER],
|
|
165
|
+
["zai", async () => (await import("./providers/zai")).ZAI_PROVIDER],
|
|
166
|
+
];
|