@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/src/sdk.ts
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import {
|
|
2
|
+
hasProvider,
|
|
3
|
+
registerModel as registerModelInCatalog,
|
|
4
|
+
registerProvider as registerProviderInCatalog,
|
|
5
|
+
} from "./models/index";
|
|
6
|
+
import {
|
|
7
|
+
type ApiHandler,
|
|
8
|
+
createHandler as createProviderHandler,
|
|
9
|
+
createHandlerAsync as createProviderHandlerAsync,
|
|
10
|
+
registerAsyncHandler,
|
|
11
|
+
registerHandler,
|
|
12
|
+
} from "./providers/index";
|
|
13
|
+
import type {
|
|
14
|
+
CreateHandlerInput,
|
|
15
|
+
LlmsConfig,
|
|
16
|
+
LlmsSdk,
|
|
17
|
+
ProviderConfigDefaults,
|
|
18
|
+
RegisteredProviderSummary,
|
|
19
|
+
RegisterModelInput,
|
|
20
|
+
RegisterProviderInput,
|
|
21
|
+
} from "./types";
|
|
22
|
+
|
|
23
|
+
interface InternalProviderConfig {
|
|
24
|
+
id: string;
|
|
25
|
+
models: Set<string>;
|
|
26
|
+
defaultModel: string;
|
|
27
|
+
defaults: ProviderConfigDefaults;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function cloneDefaults(
|
|
31
|
+
defaults: ProviderConfigDefaults | undefined,
|
|
32
|
+
): ProviderConfigDefaults {
|
|
33
|
+
return defaults ? { ...defaults } : {};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function resolveApiKey(
|
|
37
|
+
apiKey?: string,
|
|
38
|
+
apiKeyEnv?: string,
|
|
39
|
+
): string | undefined {
|
|
40
|
+
if (apiKey) {
|
|
41
|
+
return apiKey;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (!apiKeyEnv) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const runtimeProcess = globalThis.process;
|
|
49
|
+
if (!runtimeProcess?.env) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return runtimeProcess.env[apiKeyEnv];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function assertNonEmptyModels(providerId: string, models: string[]): void {
|
|
57
|
+
if (!models.length) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
`Provider "${providerId}" must include at least one model.`,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export class DefaultLlmsSdk implements LlmsSdk {
|
|
65
|
+
private readonly providerConfigs = new Map<string, InternalProviderConfig>();
|
|
66
|
+
|
|
67
|
+
constructor(config: LlmsConfig) {
|
|
68
|
+
this.applyConfig(config);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
createHandler(input: CreateHandlerInput): ApiHandler {
|
|
72
|
+
return createProviderHandler(this.toProviderHandlerConfig(input));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async createHandlerAsync(input: CreateHandlerInput): Promise<ApiHandler> {
|
|
76
|
+
return createProviderHandlerAsync(this.toProviderHandlerConfig(input));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private toProviderHandlerConfig(input: CreateHandlerInput) {
|
|
80
|
+
const providerConfig = this.requireConfiguredProvider(input.providerId);
|
|
81
|
+
const modelId = input.modelId ?? providerConfig.defaultModel;
|
|
82
|
+
|
|
83
|
+
if (!providerConfig.models.has(modelId)) {
|
|
84
|
+
throw new Error(
|
|
85
|
+
`Model "${modelId}" is not configured for provider "${input.providerId}".`,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
providerId: input.providerId,
|
|
91
|
+
modelId,
|
|
92
|
+
...providerConfig.defaults,
|
|
93
|
+
...input.overrides,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
registerProvider(input: RegisterProviderInput): void {
|
|
98
|
+
registerProviderInCatalog(input.collection);
|
|
99
|
+
|
|
100
|
+
if (input.handlerFactory && input.asyncHandlerFactory) {
|
|
101
|
+
throw new Error(
|
|
102
|
+
`Provider "${input.collection.provider.id}" cannot register both sync and async handlers.`,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (input.handlerFactory) {
|
|
107
|
+
registerHandler(input.collection.provider.id, input.handlerFactory);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (input.asyncHandlerFactory) {
|
|
111
|
+
registerAsyncHandler(
|
|
112
|
+
input.collection.provider.id,
|
|
113
|
+
input.asyncHandlerFactory,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const exposedModels =
|
|
118
|
+
input.exposeModels ?? Object.keys(input.collection.models);
|
|
119
|
+
assertNonEmptyModels(input.collection.provider.id, exposedModels);
|
|
120
|
+
|
|
121
|
+
const existing = this.providerConfigs.get(input.collection.provider.id);
|
|
122
|
+
const defaultModel =
|
|
123
|
+
input.defaultModel ??
|
|
124
|
+
input.collection.provider.defaultModelId ??
|
|
125
|
+
exposedModels[0];
|
|
126
|
+
|
|
127
|
+
if (!defaultModel) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
`Provider "${input.collection.provider.id}" must define a default model.`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (!exposedModels.includes(defaultModel)) {
|
|
134
|
+
throw new Error(
|
|
135
|
+
`Default model "${defaultModel}" is not included in configured models for "${input.collection.provider.id}".`,
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const mergedModels = new Set<string>([
|
|
140
|
+
...(existing?.models ?? []),
|
|
141
|
+
...exposedModels,
|
|
142
|
+
]);
|
|
143
|
+
const mergedDefaults = {
|
|
144
|
+
...(existing?.defaults ?? {}),
|
|
145
|
+
...cloneDefaults(input.defaults),
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
this.providerConfigs.set(input.collection.provider.id, {
|
|
149
|
+
id: input.collection.provider.id,
|
|
150
|
+
models: mergedModels,
|
|
151
|
+
defaultModel,
|
|
152
|
+
defaults: mergedDefaults,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
registerModel(input: RegisterModelInput): void {
|
|
157
|
+
registerModelInCatalog(input.providerId, input.modelId, input.info);
|
|
158
|
+
|
|
159
|
+
const existing = this.providerConfigs.get(input.providerId);
|
|
160
|
+
if (!existing) {
|
|
161
|
+
this.providerConfigs.set(input.providerId, {
|
|
162
|
+
id: input.providerId,
|
|
163
|
+
models: new Set([input.modelId]),
|
|
164
|
+
defaultModel: input.modelId,
|
|
165
|
+
defaults: {},
|
|
166
|
+
});
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
existing.models.add(input.modelId);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
getProviders(): RegisteredProviderSummary[] {
|
|
174
|
+
return Array.from(this.providerConfigs.values()).map((provider) => ({
|
|
175
|
+
id: provider.id,
|
|
176
|
+
models: Array.from(provider.models),
|
|
177
|
+
defaultModel: provider.defaultModel,
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
getModels(providerId: string): string[] {
|
|
182
|
+
return Array.from(this.requireConfiguredProvider(providerId).models);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
isProviderConfigured(providerId: string): boolean {
|
|
186
|
+
return this.providerConfigs.has(providerId);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
isModelConfigured(providerId: string, modelId: string): boolean {
|
|
190
|
+
return this.providerConfigs.get(providerId)?.models.has(modelId) ?? false;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private applyConfig(config: LlmsConfig): void {
|
|
194
|
+
for (const provider of config.providers) {
|
|
195
|
+
assertNonEmptyModels(provider.id, provider.models);
|
|
196
|
+
|
|
197
|
+
if (
|
|
198
|
+
provider.defaultModel &&
|
|
199
|
+
!provider.models.includes(provider.defaultModel)
|
|
200
|
+
) {
|
|
201
|
+
throw new Error(
|
|
202
|
+
`Default model "${provider.defaultModel}" is not included in configured models for "${provider.id}".`,
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const defaultModel = provider.defaultModel ?? provider.models[0];
|
|
207
|
+
if (!defaultModel) {
|
|
208
|
+
throw new Error(
|
|
209
|
+
`Provider "${provider.id}" must define a default model.`,
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const apiKey = resolveApiKey(provider.apiKey, provider.apiKeyEnv);
|
|
214
|
+
|
|
215
|
+
this.providerConfigs.set(provider.id, {
|
|
216
|
+
id: provider.id,
|
|
217
|
+
models: new Set(provider.models),
|
|
218
|
+
defaultModel,
|
|
219
|
+
defaults: {
|
|
220
|
+
apiKey,
|
|
221
|
+
baseUrl: provider.baseUrl,
|
|
222
|
+
headers: provider.headers,
|
|
223
|
+
timeoutMs: provider.timeoutMs,
|
|
224
|
+
capabilities: provider.capabilities,
|
|
225
|
+
...cloneDefaults(provider.settings),
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
for (const model of config.models ?? []) {
|
|
231
|
+
this.registerModel(model);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
for (const provider of config.customProviders ?? []) {
|
|
235
|
+
this.registerProvider(provider);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
for (const providerConfig of this.providerConfigs.values()) {
|
|
239
|
+
const providerExists = hasProvider(providerConfig.id);
|
|
240
|
+
if (!providerExists) {
|
|
241
|
+
throw new Error(
|
|
242
|
+
`Provider "${providerConfig.id}" is not known. Register it through customProviders/registerProvider or use a built-in provider ID.`,
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
private requireConfiguredProvider(
|
|
249
|
+
providerId: string,
|
|
250
|
+
): InternalProviderConfig {
|
|
251
|
+
const providerConfig = this.providerConfigs.get(providerId);
|
|
252
|
+
if (!providerConfig) {
|
|
253
|
+
throw new Error(
|
|
254
|
+
`Provider "${providerId}" is not configured in this SDK instance.`,
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return providerConfig;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export function createLlmsSdk(config: LlmsConfig): LlmsSdk {
|
|
263
|
+
return new DefaultLlmsSdk(config);
|
|
264
|
+
}
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { ModelCollection, ModelInfo } from "./models/index";
|
|
2
|
+
import type {
|
|
3
|
+
ApiHandler,
|
|
4
|
+
HandlerFactory,
|
|
5
|
+
LazyHandlerFactory,
|
|
6
|
+
ProviderCapability,
|
|
7
|
+
ProviderConfig,
|
|
8
|
+
} from "./providers/index";
|
|
9
|
+
|
|
10
|
+
export type ProviderConfigDefaults = Omit<
|
|
11
|
+
ProviderConfig,
|
|
12
|
+
"providerId" | "modelId"
|
|
13
|
+
>;
|
|
14
|
+
|
|
15
|
+
export interface ProviderSelectionConfig {
|
|
16
|
+
id: string;
|
|
17
|
+
models: string[];
|
|
18
|
+
defaultModel?: string;
|
|
19
|
+
apiKey?: string;
|
|
20
|
+
apiKeyEnv?: string;
|
|
21
|
+
baseUrl?: string;
|
|
22
|
+
headers?: Record<string, string>;
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
capabilities?: ProviderCapability[];
|
|
25
|
+
settings?: ProviderConfigDefaults;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface AdditionalModelConfig {
|
|
29
|
+
providerId: string;
|
|
30
|
+
modelId: string;
|
|
31
|
+
info: ModelInfo;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface CustomProviderConfig {
|
|
35
|
+
collection: ModelCollection;
|
|
36
|
+
defaults?: ProviderConfigDefaults;
|
|
37
|
+
handlerFactory?: HandlerFactory;
|
|
38
|
+
asyncHandlerFactory?: LazyHandlerFactory;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface LlmsConfig {
|
|
42
|
+
providers: ProviderSelectionConfig[];
|
|
43
|
+
models?: AdditionalModelConfig[];
|
|
44
|
+
customProviders?: CustomProviderConfig[];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface CreateHandlerInput {
|
|
48
|
+
providerId: string;
|
|
49
|
+
modelId?: string;
|
|
50
|
+
overrides?: ProviderConfigDefaults;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface RegisteredProviderSummary {
|
|
54
|
+
id: string;
|
|
55
|
+
models: string[];
|
|
56
|
+
defaultModel: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface RegisterProviderInput extends CustomProviderConfig {
|
|
60
|
+
exposeModels?: string[];
|
|
61
|
+
defaultModel?: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface RegisterModelInput {
|
|
65
|
+
providerId: string;
|
|
66
|
+
modelId: string;
|
|
67
|
+
info: ModelInfo;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface LlmsSdk {
|
|
71
|
+
createHandler(input: CreateHandlerInput): ApiHandler;
|
|
72
|
+
createHandlerAsync(input: CreateHandlerInput): Promise<ApiHandler>;
|
|
73
|
+
registerProvider(input: RegisterProviderInput): void;
|
|
74
|
+
registerModel(input: RegisterModelInput): void;
|
|
75
|
+
getProviders(): RegisteredProviderSummary[];
|
|
76
|
+
getModels(providerId: string): string[];
|
|
77
|
+
isProviderConfigured(providerId: string): boolean;
|
|
78
|
+
isModelConfigured(providerId: string, modelId: string): boolean;
|
|
79
|
+
}
|