@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.
Files changed (219) hide show
  1. package/README.md +198 -0
  2. package/dist/config-browser.d.ts +3 -0
  3. package/dist/config.d.ts +3 -0
  4. package/dist/index.browser.d.ts +4 -0
  5. package/dist/index.browser.js +1 -0
  6. package/dist/index.d.ts +5 -0
  7. package/dist/index.js +7 -0
  8. package/dist/models/generated-access.d.ts +4 -0
  9. package/dist/models/generated-provider-loaders.d.ts +13 -0
  10. package/dist/models/generated.d.ts +14 -0
  11. package/dist/models/index.d.ts +43 -0
  12. package/dist/models/models-dev-catalog.d.ts +32 -0
  13. package/dist/models/providers/aihubmix.d.ts +5 -0
  14. package/dist/models/providers/anthropic.d.ts +53 -0
  15. package/dist/models/providers/asksage.d.ts +5 -0
  16. package/dist/models/providers/baseten.d.ts +5 -0
  17. package/dist/models/providers/bedrock.d.ts +7 -0
  18. package/dist/models/providers/cerebras.d.ts +7 -0
  19. package/dist/models/providers/claude-code.d.ts +4 -0
  20. package/dist/models/providers/cline.d.ts +34 -0
  21. package/dist/models/providers/deepseek.d.ts +8 -0
  22. package/dist/models/providers/dify.d.ts +5 -0
  23. package/dist/models/providers/doubao.d.ts +7 -0
  24. package/dist/models/providers/fireworks.d.ts +8 -0
  25. package/dist/models/providers/gemini.d.ts +9 -0
  26. package/dist/models/providers/groq.d.ts +8 -0
  27. package/dist/models/providers/hicap.d.ts +5 -0
  28. package/dist/models/providers/huawei-cloud-maas.d.ts +5 -0
  29. package/dist/models/providers/huggingface.d.ts +6 -0
  30. package/dist/models/providers/index.d.ts +45 -0
  31. package/dist/models/providers/litellm.d.ts +5 -0
  32. package/dist/models/providers/lmstudio.d.ts +5 -0
  33. package/dist/models/providers/minimax.d.ts +7 -0
  34. package/dist/models/providers/mistral.d.ts +5 -0
  35. package/dist/models/providers/moonshot.d.ts +7 -0
  36. package/dist/models/providers/nebius.d.ts +7 -0
  37. package/dist/models/providers/nous-research.d.ts +7 -0
  38. package/dist/models/providers/oca.d.ts +9 -0
  39. package/dist/models/providers/ollama.d.ts +5 -0
  40. package/dist/models/providers/openai-codex.d.ts +10 -0
  41. package/dist/models/providers/openai.d.ts +9 -0
  42. package/dist/models/providers/opencode.d.ts +10 -0
  43. package/dist/models/providers/openrouter.d.ts +7 -0
  44. package/dist/models/providers/qwen-code.d.ts +7 -0
  45. package/dist/models/providers/qwen.d.ts +7 -0
  46. package/dist/models/providers/requesty.d.ts +6 -0
  47. package/dist/models/providers/sambanova.d.ts +7 -0
  48. package/dist/models/providers/sapaicore.d.ts +7 -0
  49. package/dist/models/providers/together.d.ts +8 -0
  50. package/dist/models/providers/vercel-ai-gateway.d.ts +5 -0
  51. package/dist/models/providers/vertex.d.ts +7 -0
  52. package/dist/models/providers/xai.d.ts +8 -0
  53. package/dist/models/providers/zai.d.ts +7 -0
  54. package/dist/models/query.d.ts +181 -0
  55. package/dist/models/registry.d.ts +123 -0
  56. package/dist/models/schemas/index.d.ts +7 -0
  57. package/dist/models/schemas/model.d.ts +340 -0
  58. package/dist/models/schemas/query.d.ts +191 -0
  59. package/dist/providers/handlers/ai-sdk-community.d.ts +46 -0
  60. package/dist/providers/handlers/ai-sdk-provider-base.d.ts +32 -0
  61. package/dist/providers/handlers/anthropic-base.d.ts +26 -0
  62. package/dist/providers/handlers/asksage.d.ts +12 -0
  63. package/dist/providers/handlers/auth.d.ts +5 -0
  64. package/dist/providers/handlers/base.d.ts +55 -0
  65. package/dist/providers/handlers/bedrock-base.d.ts +23 -0
  66. package/dist/providers/handlers/bedrock-client.d.ts +4 -0
  67. package/dist/providers/handlers/community-sdk.d.ts +97 -0
  68. package/dist/providers/handlers/fetch-base.d.ts +18 -0
  69. package/dist/providers/handlers/gemini-base.d.ts +25 -0
  70. package/dist/providers/handlers/index.d.ts +19 -0
  71. package/dist/providers/handlers/openai-base.d.ts +54 -0
  72. package/dist/providers/handlers/openai-responses.d.ts +64 -0
  73. package/dist/providers/handlers/providers.d.ts +43 -0
  74. package/dist/providers/handlers/r1-base.d.ts +62 -0
  75. package/dist/providers/handlers/registry.d.ts +106 -0
  76. package/dist/providers/handlers/vertex.d.ts +32 -0
  77. package/dist/providers/index.d.ts +100 -0
  78. package/dist/providers/public.browser.d.ts +2 -0
  79. package/dist/providers/public.d.ts +3 -0
  80. package/dist/providers/shared/openai-compatible.d.ts +10 -0
  81. package/dist/providers/transform/ai-sdk-community-format.d.ts +9 -0
  82. package/dist/providers/transform/anthropic-format.d.ts +24 -0
  83. package/dist/providers/transform/content-format.d.ts +3 -0
  84. package/dist/providers/transform/gemini-format.d.ts +19 -0
  85. package/dist/providers/transform/index.d.ts +10 -0
  86. package/dist/providers/transform/openai-format.d.ts +36 -0
  87. package/dist/providers/transform/r1-format.d.ts +26 -0
  88. package/dist/providers/types/config.d.ts +261 -0
  89. package/dist/providers/types/handler.d.ts +71 -0
  90. package/dist/providers/types/index.d.ts +11 -0
  91. package/dist/providers/types/messages.d.ts +139 -0
  92. package/dist/providers/types/model-info.d.ts +32 -0
  93. package/dist/providers/types/provider-ids.d.ts +63 -0
  94. package/dist/providers/types/settings.d.ts +308 -0
  95. package/dist/providers/types/stream.d.ts +106 -0
  96. package/dist/providers/utils/index.d.ts +7 -0
  97. package/dist/providers/utils/retry.d.ts +38 -0
  98. package/dist/providers/utils/stream-processor.d.ts +110 -0
  99. package/dist/providers/utils/tool-processor.d.ts +34 -0
  100. package/dist/sdk.d.ts +18 -0
  101. package/dist/types.d.ts +60 -0
  102. package/package.json +66 -0
  103. package/src/catalog.ts +20 -0
  104. package/src/config-browser.ts +11 -0
  105. package/src/config.ts +49 -0
  106. package/src/index.browser.ts +9 -0
  107. package/src/index.ts +10 -0
  108. package/src/live-providers.test.ts +137 -0
  109. package/src/models/generated-access.ts +41 -0
  110. package/src/models/generated-provider-loaders.ts +166 -0
  111. package/src/models/generated.ts +11997 -0
  112. package/src/models/index.ts +271 -0
  113. package/src/models/models-dev-catalog.test.ts +161 -0
  114. package/src/models/models-dev-catalog.ts +161 -0
  115. package/src/models/providers/aihubmix.ts +19 -0
  116. package/src/models/providers/anthropic.ts +60 -0
  117. package/src/models/providers/asksage.ts +19 -0
  118. package/src/models/providers/baseten.ts +21 -0
  119. package/src/models/providers/bedrock.ts +30 -0
  120. package/src/models/providers/cerebras.ts +24 -0
  121. package/src/models/providers/claude-code.ts +51 -0
  122. package/src/models/providers/cline.ts +25 -0
  123. package/src/models/providers/deepseek.ts +33 -0
  124. package/src/models/providers/dify.ts +17 -0
  125. package/src/models/providers/doubao.ts +33 -0
  126. package/src/models/providers/fireworks.ts +34 -0
  127. package/src/models/providers/gemini.ts +43 -0
  128. package/src/models/providers/groq.ts +33 -0
  129. package/src/models/providers/hicap.ts +18 -0
  130. package/src/models/providers/huawei-cloud-maas.ts +18 -0
  131. package/src/models/providers/huggingface.ts +22 -0
  132. package/src/models/providers/index.ts +162 -0
  133. package/src/models/providers/litellm.ts +19 -0
  134. package/src/models/providers/lmstudio.ts +22 -0
  135. package/src/models/providers/minimax.ts +34 -0
  136. package/src/models/providers/mistral.ts +19 -0
  137. package/src/models/providers/moonshot.ts +34 -0
  138. package/src/models/providers/nebius.ts +24 -0
  139. package/src/models/providers/nous-research.ts +21 -0
  140. package/src/models/providers/oca.ts +30 -0
  141. package/src/models/providers/ollama.ts +18 -0
  142. package/src/models/providers/openai-codex.ts +30 -0
  143. package/src/models/providers/openai.ts +43 -0
  144. package/src/models/providers/opencode.ts +28 -0
  145. package/src/models/providers/openrouter.ts +24 -0
  146. package/src/models/providers/qwen-code.ts +33 -0
  147. package/src/models/providers/qwen.ts +34 -0
  148. package/src/models/providers/requesty.ts +23 -0
  149. package/src/models/providers/sambanova.ts +23 -0
  150. package/src/models/providers/sapaicore.ts +34 -0
  151. package/src/models/providers/together.ts +35 -0
  152. package/src/models/providers/vercel-ai-gateway.ts +23 -0
  153. package/src/models/providers/vertex.ts +36 -0
  154. package/src/models/providers/xai.ts +34 -0
  155. package/src/models/providers/zai.ts +25 -0
  156. package/src/models/query.ts +407 -0
  157. package/src/models/registry.ts +511 -0
  158. package/src/models/schemas/index.ts +62 -0
  159. package/src/models/schemas/model.ts +308 -0
  160. package/src/models/schemas/query.ts +336 -0
  161. package/src/providers/browser.ts +4 -0
  162. package/src/providers/handlers/ai-sdk-community.ts +226 -0
  163. package/src/providers/handlers/ai-sdk-provider-base.ts +193 -0
  164. package/src/providers/handlers/anthropic-base.ts +372 -0
  165. package/src/providers/handlers/asksage.test.ts +103 -0
  166. package/src/providers/handlers/asksage.ts +138 -0
  167. package/src/providers/handlers/auth.test.ts +19 -0
  168. package/src/providers/handlers/auth.ts +121 -0
  169. package/src/providers/handlers/base.test.ts +46 -0
  170. package/src/providers/handlers/base.ts +160 -0
  171. package/src/providers/handlers/bedrock-base.ts +390 -0
  172. package/src/providers/handlers/bedrock-client.ts +100 -0
  173. package/src/providers/handlers/codex.test.ts +123 -0
  174. package/src/providers/handlers/community-sdk.test.ts +288 -0
  175. package/src/providers/handlers/community-sdk.ts +392 -0
  176. package/src/providers/handlers/fetch-base.ts +68 -0
  177. package/src/providers/handlers/gemini-base.ts +302 -0
  178. package/src/providers/handlers/index.ts +67 -0
  179. package/src/providers/handlers/openai-base.ts +277 -0
  180. package/src/providers/handlers/openai-responses.ts +598 -0
  181. package/src/providers/handlers/providers.test.ts +120 -0
  182. package/src/providers/handlers/providers.ts +563 -0
  183. package/src/providers/handlers/r1-base.ts +280 -0
  184. package/src/providers/handlers/registry.ts +185 -0
  185. package/src/providers/handlers/vertex.test.ts +124 -0
  186. package/src/providers/handlers/vertex.ts +292 -0
  187. package/src/providers/index.ts +534 -0
  188. package/src/providers/public.browser.ts +20 -0
  189. package/src/providers/public.ts +51 -0
  190. package/src/providers/shared/openai-compatible.ts +63 -0
  191. package/src/providers/transform/ai-sdk-community-format.test.ts +73 -0
  192. package/src/providers/transform/ai-sdk-community-format.ts +115 -0
  193. package/src/providers/transform/anthropic-format.ts +218 -0
  194. package/src/providers/transform/content-format.ts +34 -0
  195. package/src/providers/transform/format-conversion.test.ts +310 -0
  196. package/src/providers/transform/gemini-format.ts +167 -0
  197. package/src/providers/transform/index.ts +22 -0
  198. package/src/providers/transform/openai-format.ts +247 -0
  199. package/src/providers/transform/r1-format.ts +287 -0
  200. package/src/providers/types/config.ts +388 -0
  201. package/src/providers/types/handler.ts +87 -0
  202. package/src/providers/types/index.ts +120 -0
  203. package/src/providers/types/messages.ts +158 -0
  204. package/src/providers/types/model-info.test.ts +57 -0
  205. package/src/providers/types/model-info.ts +65 -0
  206. package/src/providers/types/provider-ids.test.ts +12 -0
  207. package/src/providers/types/provider-ids.ts +89 -0
  208. package/src/providers/types/settings.test.ts +49 -0
  209. package/src/providers/types/settings.ts +533 -0
  210. package/src/providers/types/stream.ts +117 -0
  211. package/src/providers/utils/index.ts +27 -0
  212. package/src/providers/utils/retry.test.ts +140 -0
  213. package/src/providers/utils/retry.ts +188 -0
  214. package/src/providers/utils/stream-processor.test.ts +232 -0
  215. package/src/providers/utils/stream-processor.ts +472 -0
  216. package/src/providers/utils/tool-processor.test.ts +34 -0
  217. package/src/providers/utils/tool-processor.ts +111 -0
  218. package/src/sdk.ts +264 -0
  219. package/src/types.ts +79 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * OpenAI Responses API Handler
3
+ *
4
+ * Handler for OpenAI's Responses API format, which is used by newer models
5
+ * that require native tool calling (e.g., GPT-5, o3, codex).
6
+ *
7
+ * The Responses API has a different structure than Chat Completions:
8
+ * - Uses `instructions` instead of system messages
9
+ * - Uses `input` instead of messages array
10
+ * - Has different streaming event types (response.*, not choices.delta)
11
+ * - Supports reasoning with encrypted content
12
+ */
13
+ import OpenAI from "openai";
14
+ import type { ApiStream, HandlerModelInfo, ModelInfo, ProviderConfig } from "../types";
15
+ import type { Message, ToolDefinition } from "../types/messages";
16
+ import { BaseHandler } from "./base";
17
+ /**
18
+ * Convert messages to Responses API input format
19
+ */
20
+ declare function convertToResponsesInput(messages: Message[]): {
21
+ type: "message";
22
+ role: "user" | "assistant";
23
+ content: string | Array<{
24
+ type: "input_text" | "output_text";
25
+ text: string;
26
+ }>;
27
+ }[];
28
+ /**
29
+ * Handler for OpenAI Responses API
30
+ *
31
+ * Uses ProviderConfig fields:
32
+ * - baseUrl: Base URL for the API
33
+ * - modelId: Model ID
34
+ * - knownModels: Known models with their info
35
+ * - headers: Custom headers
36
+ */
37
+ export declare class OpenAIResponsesHandler extends BaseHandler {
38
+ protected client: OpenAI | undefined;
39
+ /**
40
+ * Ensure the OpenAI client is initialized
41
+ */
42
+ protected ensureClient(): OpenAI;
43
+ /**
44
+ * Get model info, falling back to provider defaults
45
+ */
46
+ getModel(): HandlerModelInfo;
47
+ protected getDefaultModelInfo(): ModelInfo;
48
+ getMessages(_systemPrompt: string, messages: Message[]): ReturnType<typeof convertToResponsesInput>;
49
+ /**
50
+ * Create a streaming message using the Responses API
51
+ */
52
+ createMessage(systemPrompt: string, messages: Message[], tools?: ToolDefinition[]): ApiStream;
53
+ private createMessageInternal;
54
+ /**
55
+ * Process a single chunk from the Responses API stream
56
+ */
57
+ protected processResponseChunk(chunk: any, _modelInfo: ModelInfo, responseId: string): Generator<import("../types").ApiStreamChunk>;
58
+ private getApiResponseId;
59
+ }
60
+ /**
61
+ * Create an OpenAI Responses API handler
62
+ */
63
+ export declare function createOpenAIResponsesHandler(config: ProviderConfig): OpenAIResponsesHandler;
64
+ export {};
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Provider Configurations
3
+ *
4
+ * Pre-configured settings for all supported OpenAI-compatible providers.
5
+ * Model data is sourced from @clinebot/models (the single registry).
6
+ */
7
+ /** biome-ignore-all lint/style/noNonNullAssertion: static */
8
+ import type { ModelCatalogConfig, ModelInfo, ProviderCapability, ProviderConfig } from "../types/index";
9
+ /**
10
+ * Provider defaults for OpenAI-compatible providers
11
+ */
12
+ export interface ProviderDefaults {
13
+ /** Base URL for the API */
14
+ baseUrl: string;
15
+ /** Default model ID */
16
+ modelId: string;
17
+ /** Known models with their info */
18
+ knownModels?: Record<string, ModelInfo>;
19
+ /** Capabilities this provider supports */
20
+ capabilities?: ProviderCapability[];
21
+ }
22
+ export declare const DEFAULT_MODELS_CATALOG_URL = "https://models.dev/api.json";
23
+ export declare function getLiveModelsCatalog(options?: Pick<ModelCatalogConfig, "url" | "cacheTtlMs">): Promise<Record<string, Record<string, ModelInfo>>>;
24
+ export declare function clearLiveModelsCatalogCache(url?: string): void;
25
+ export declare function clearPrivateModelsCatalogCache(): void;
26
+ /**
27
+ * All OpenAI-compatible provider configurations
28
+ *
29
+ * Model data is sourced from @clinebot/models to maintain a single source of truth.
30
+ */
31
+ export declare const OPENAI_COMPATIBLE_PROVIDERS: Record<string, ProviderDefaults>;
32
+ /**
33
+ * Get provider configuration by ID
34
+ */
35
+ export declare function getProviderConfig(providerId: string): ProviderDefaults | undefined;
36
+ /**
37
+ * Resolve provider configuration and optionally merge live catalog metadata
38
+ */
39
+ export declare function resolveProviderConfig(providerId: string, modelCatalog?: ModelCatalogConfig, config?: ProviderConfig): Promise<ProviderDefaults | undefined>;
40
+ /**
41
+ * Check if a provider is OpenAI-compatible
42
+ */
43
+ export declare function isOpenAICompatibleProvider(providerId: string): boolean;
@@ -0,0 +1,62 @@
1
+ /**
2
+ * R1 Base Handler
3
+ *
4
+ * Handler for R1-based reasoning models (DeepSeek Reasoner, etc.)
5
+ * These models have special requirements:
6
+ * 1. Consecutive messages with the same role must be merged
7
+ * 2. reasoning_content field for tool calling continuations
8
+ * 3. No temperature parameter
9
+ * 4. Response includes reasoning_content in the delta
10
+ */
11
+ import OpenAI from "openai";
12
+ import type { ChatCompletionChunk } from "openai/resources/chat/completions";
13
+ import type { ApiStream, ApiStreamChunk, HandlerModelInfo, ModelInfo, ProviderConfig } from "../types";
14
+ import type { Message, ToolDefinition } from "../types/messages";
15
+ import { ToolCallProcessor } from "../utils/tool-processor";
16
+ import { BaseHandler } from "./base";
17
+ /**
18
+ * Base handler for R1-based reasoning models
19
+ *
20
+ * Uses ProviderConfig fields:
21
+ * - baseUrl: Base URL for the API
22
+ * - modelId: Model ID
23
+ * - knownModels: Known models with their info
24
+ * - headers: Custom headers
25
+ */
26
+ export declare class R1BaseHandler extends BaseHandler {
27
+ protected client: OpenAI | undefined;
28
+ /**
29
+ * Ensure the OpenAI client is initialized
30
+ */
31
+ protected ensureClient(): OpenAI;
32
+ /**
33
+ * Get model info, falling back to provider defaults
34
+ */
35
+ getModel(): HandlerModelInfo;
36
+ protected getDefaultModelInfo(): ModelInfo;
37
+ /**
38
+ * Check if this model is a reasoner model (no temperature allowed)
39
+ */
40
+ protected isReasonerModel(modelId: string): boolean;
41
+ getMessages(systemPrompt: string, messages: Message[]): OpenAI.Chat.ChatCompletionMessageParam[];
42
+ /**
43
+ * Create a streaming message
44
+ */
45
+ createMessage(systemPrompt: string, messages: Message[], tools?: ToolDefinition[]): ApiStream;
46
+ private createMessageInternal;
47
+ /**
48
+ * Process a single chunk from the stream
49
+ */
50
+ protected processChunk(chunk: ChatCompletionChunk, toolCallProcessor: ToolCallProcessor, modelInfo: ModelInfo, responseId: string): Generator<ApiStreamChunk>;
51
+ /**
52
+ * Process usage information with R1-specific cache handling
53
+ *
54
+ * DeepSeek reports total input AND cache reads/writes,
55
+ * where the input tokens is the sum of the cache hits/misses.
56
+ */
57
+ protected processUsage(usage: OpenAI.CompletionUsage, _modelInfo: ModelInfo, responseId: string): Generator<ApiStreamChunk>;
58
+ }
59
+ /**
60
+ * Create an R1-compatible handler
61
+ */
62
+ export declare function createR1Handler(config: ProviderConfig): R1BaseHandler;
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Custom Handler Registry
3
+ *
4
+ * Allows users to register their own custom handlers that extend BaseHandler.
5
+ * This is useful for providers that require dependencies not included in this package
6
+ * (e.g., VSCode LM handler that requires the vscode package).
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { registerHandler, BaseHandler, type ProviderConfig, type ApiStream, type Message } from "@clinebot/providers"
11
+ * import * as vscode from "vscode"
12
+ *
13
+ * class VSCodeLmHandler extends BaseHandler {
14
+ * async *createMessage(systemPrompt: string, messages: Message[]): ApiStream {
15
+ * // Implementation using vscode.lm API
16
+ * }
17
+ * }
18
+ *
19
+ * // Register the handler
20
+ * registerHandler("vscode-lm", (config) => new VSCodeLmHandler(config))
21
+ *
22
+ * // Now createHandler will use your custom handler for "vscode-lm"
23
+ * const handler = createHandler({ providerId: "vscode-lm", modelId: "copilot" })
24
+ * ```
25
+ */
26
+ import type { ApiHandler, HandlerFactory, LazyHandlerFactory, ProviderConfig } from "../types";
27
+ /**
28
+ * Register a custom handler factory for a provider ID
29
+ *
30
+ * Use this to add handlers for providers that require external dependencies
31
+ * not bundled with this package, or to override built-in handlers.
32
+ *
33
+ * @param providerId - The provider ID to register (can be existing or new)
34
+ * @param factory - Factory function that creates the handler
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * // Simple registration
39
+ * registerHandler("my-provider", (config) => new MyHandler(config))
40
+ *
41
+ * // Override built-in handler
42
+ * registerHandler("anthropic", (config) => new MyCustomAnthropicHandler(config))
43
+ * ```
44
+ */
45
+ export declare function registerHandler(providerId: string, factory: HandlerFactory<ProviderConfig>): void;
46
+ /**
47
+ * Register an async handler factory for lazy loading
48
+ *
49
+ * Use this when your handler has heavy dependencies that should be
50
+ * loaded only when needed.
51
+ *
52
+ * @param providerId - The provider ID to register
53
+ * @param factory - Async factory function that creates the handler
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * registerAsyncHandler("heavy-provider", async (config) => {
58
+ * const { HeavyHandler } = await import("./heavy-handler")
59
+ * return new HeavyHandler(config)
60
+ * })
61
+ * ```
62
+ */
63
+ export declare function registerAsyncHandler(providerId: string, factory: LazyHandlerFactory<ProviderConfig>): void;
64
+ /**
65
+ * Unregister a custom handler
66
+ *
67
+ * @param providerId - The provider ID to unregister
68
+ * @returns true if a handler was removed, false if none existed
69
+ */
70
+ export declare function unregisterHandler(providerId: string): boolean;
71
+ /**
72
+ * Check if a custom handler is registered for a provider ID
73
+ *
74
+ * @param providerId - The provider ID to check
75
+ */
76
+ export declare function hasRegisteredHandler(providerId: string): boolean;
77
+ /**
78
+ * Get a registered handler (internal use)
79
+ *
80
+ * @param providerId - The provider ID to get
81
+ * @param config - The config to pass to the factory
82
+ * @returns The handler instance, or undefined if not registered
83
+ */
84
+ export declare function getRegisteredHandler(providerId: string, config: ProviderConfig): ApiHandler | undefined;
85
+ /**
86
+ * Get a registered handler asynchronously (internal use)
87
+ *
88
+ * @param providerId - The provider ID to get
89
+ * @param config - The config to pass to the factory
90
+ * @returns The handler instance, or undefined if not registered
91
+ */
92
+ export declare function getRegisteredHandlerAsync(providerId: string, config: ProviderConfig): Promise<ApiHandler | undefined>;
93
+ /**
94
+ * Check if a registered handler is async
95
+ *
96
+ * @param providerId - The provider ID to check
97
+ */
98
+ export declare function isRegisteredHandlerAsync(providerId: string): boolean;
99
+ /**
100
+ * Get all registered provider IDs
101
+ */
102
+ export declare function getRegisteredProviderIds(): string[];
103
+ /**
104
+ * Clear all registered handlers (mainly for testing)
105
+ */
106
+ export declare function clearRegistry(): void;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Vertex Handler
3
+ *
4
+ * Routes Vertex models by family:
5
+ * - Gemini models -> Google GenAI Vertex path via GeminiHandler
6
+ * - Claude models -> AI SDK Google Vertex Anthropic provider
7
+ */
8
+ import { type ApiStream, type HandlerModelInfo, type ProviderConfig } from "../types";
9
+ import type { Message, ToolDefinition } from "../types/messages";
10
+ import { BaseHandler } from "./base";
11
+ /**
12
+ * Handler for Vertex AI that supports both Gemini and Claude models.
13
+ */
14
+ export declare class VertexHandler extends BaseHandler {
15
+ private geminiHandler;
16
+ private vertexAnthropicModelFactory;
17
+ private vertexAnthropicModelFactoryPromise;
18
+ private getProjectId;
19
+ private getConfiguredRegion;
20
+ private getRequiredClaudeRegion;
21
+ private getGeminiRegion;
22
+ private ensureGeminiHandler;
23
+ private ensureVertexAnthropicModelFactory;
24
+ getModel(): HandlerModelInfo;
25
+ getMessages(systemPrompt: string, messages: Message[]): unknown;
26
+ createMessage(systemPrompt: string, messages: Message[], tools?: ToolDefinition[]): ApiStream;
27
+ private createMessageInternal;
28
+ }
29
+ /**
30
+ * Create a Vertex handler
31
+ */
32
+ export declare function createVertexHandler(config: ProviderConfig): VertexHandler;
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @clinebot/providers
3
+ *
4
+ * SDK-like package for creating and managing LLM provider handlers.
5
+ *
6
+ * This package provides a unified interface for interacting with various LLM providers.
7
+ * It standardizes configuration, message formats, and streaming responses.
8
+ *
9
+ * ## Quick Start
10
+ *
11
+ * ```typescript
12
+ * import { createHandler, type ProviderConfig } from "@clinebot/providers"
13
+ *
14
+ * const config: ProviderConfig = {
15
+ * providerId: "anthropic",
16
+ * apiKey: process.env.ANTHROPIC_API_KEY,
17
+ * modelId: "claude-sonnet-4-20250514",
18
+ * }
19
+ *
20
+ * const handler = createHandler(config)
21
+ * const stream = handler.createMessage("You are a helpful assistant.", messages)
22
+ *
23
+ * for await (const chunk of stream) {
24
+ * if (chunk.type === "text") {
25
+ * process.stdout.write(chunk.text)
26
+ * }
27
+ * }
28
+ * ```
29
+ *
30
+ * ## Supported Providers
31
+ *
32
+ * - **anthropic**: Anthropic's Claude models
33
+ * - **claude-code**: Claude Code local subscription provider
34
+ * - **gemini**: Google's Gemini models (including Vertex AI)
35
+ * - **openai**: OpenAI's GPT models
36
+ * - **openai-compat**: Any OpenAI-compatible API (DeepSeek, xAI, Together, etc.)
37
+ *
38
+ * @module
39
+ */
40
+ export { ApiFormat, type ApiHandler, type ApiStream, type ApiStreamChunk, type ApiStreamReasoningChunk, type ApiStreamTextChunk, type ApiStreamToolCall, type ApiStreamToolCallsChunk, type ApiStreamUsageChunk, type AuthConfig, type AuthSettings, AuthSettingsSchema, type AwsConfig, type AwsSettings, AwsSettingsSchema, type AzureConfig, type AzureSettings, AzureSettingsSchema, type BuiltInProviderId, type CloudConfig, type ContentBlock, createConfig, createProviderConfig, type EndpointConfig, type FileContent, type GcpConfig, type GcpSettings, GcpSettingsSchema, getModelPricing, type HandlerFactory, type HandlerModelInfo, hasCapability, hasModelCapability, type ImageContent, type LazyHandlerFactory, type Message, type MessageRole, type MessageWithMetadata, type ModelCapability, type ModelCatalogConfig, type ModelCatalogSettings, ModelCatalogSettingsSchema, type ModelConfig, type ModelInfo, type ModelPricing, type ModelWithId, type OcaConfig, type OcaSettings, OcaSettingsSchema, type OpenAICompatibleModelInfo, type ProviderCapability, type ProviderCategory, type ProviderConfig, type ProviderDefaultsConfig, type ProviderId, ProviderIdSchema, type ProviderOptions, type ProviderSettings, ProviderSettingsSchema, type ProviderSpecificConfig, parseSettings, type ReasoningConfig, type ReasoningSettings, ReasoningSettingsSchema, type RedactedThinkingContent, type RegionConfig, type SapConfig, type SapSettings, SapSettingsSchema, type SimpleProviderConfig, type SingleCompletionHandler, safeCreateProviderConfig, safeParseSettings, supportsPromptCache, supportsReasoning, type TextContent, type ThinkingConfig, type ThinkingContent, type TokenConfig, type ToolDefinition, type ToolResultContent, type ToolUseContent, toProviderConfig, } from "./types";
41
+ export { AnthropicHandler, AskSageHandler, BaseHandler, ClaudeCodeHandler, CodexHandler, clearLiveModelsCatalogCache, clearPrivateModelsCatalogCache, clearRegistry, createAnthropicHandler, createAskSageHandler, createClaudeCodeHandler, createCodexHandler, createDifyHandler, createGeminiHandler, createMistralHandler, createOpenAIHandler, createOpenAIResponsesHandler, createOpenCodeHandler, createR1Handler, createSapAiCoreHandler, createVertexHandler, DEFAULT_MODELS_CATALOG_URL, DifyHandler, GeminiHandler, getLiveModelsCatalog, getMissingApiKeyError, getProviderConfig, getRegisteredHandler, getRegisteredHandlerAsync, getRegisteredProviderIds, hasRegisteredHandler, isOpenAICompatibleProvider, isRegisteredHandlerAsync, MistralHandler, normalizeProviderId, OPENAI_COMPATIBLE_PROVIDERS, OpenAIBaseHandler, OpenAIResponsesHandler, OpenCodeHandler, R1BaseHandler, registerAsyncHandler, registerHandler, resolveProviderConfig, SapAiCoreHandler, unregisterHandler, VertexHandler, } from "./handlers";
42
+ export { convertToAnthropicMessages, convertToGeminiMessages, convertToOpenAIMessages, convertToolsToAnthropic, convertToolsToGemini, convertToolsToOpenAI, convertToR1Messages, getOpenAIToolParams, type R1Message, } from "./transform";
43
+ export { type AssistantContentBlock, type AssistantRedactedThinkingBlock, type AssistantTextBlock, type AssistantThinkingBlock, type AssistantToolUseBlock, calculateRetryDelay, isRetriableError, type ProcessedResponse, type ReasoningDetailParam, RetriableError, type RetryOptions, retryAsync, retryStream, StreamResponseProcessor, sleep, ToolCallProcessor, type UsageInfo, } from "./utils";
44
+ import { type ApiHandler, type ProviderConfig, type ProviderId } from "./types";
45
+ /**
46
+ * Create an API handler for the specified provider
47
+ *
48
+ * This is the main entry point for creating handlers. It automatically
49
+ * selects the appropriate handler class based on the provider ID.
50
+ *
51
+ * Custom handlers registered via `registerHandler()` take precedence over
52
+ * built-in handlers.
53
+ *
54
+ * @param config - Provider configuration
55
+ * @returns An API handler instance
56
+ * @throws Error if the provider has an async handler - use `createHandlerAsync()` instead
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * const handler = createHandler({
61
+ * providerId: "anthropic",
62
+ * apiKey: "sk-...",
63
+ * modelId: "claude-sonnet-4-20250514",
64
+ * })
65
+ * ```
66
+ */
67
+ export declare function createHandler(config: ProviderConfig): ApiHandler;
68
+ /**
69
+ * Create an API handler asynchronously
70
+ *
71
+ * Use this when you have handlers registered with `registerAsyncHandler()`.
72
+ * This function works with both sync and async registered handlers.
73
+ *
74
+ * @param config - Provider configuration
75
+ * @returns Promise resolving to an API handler instance
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * // Register an async handler for lazy loading
80
+ * registerAsyncHandler("my-provider", async (config) => {
81
+ * const { MyHandler } = await import("./my-handler")
82
+ * return new MyHandler(config)
83
+ * })
84
+ *
85
+ * // Use createHandlerAsync to get the handler
86
+ * const handler = await createHandlerAsync({
87
+ * providerId: "my-provider",
88
+ * modelId: "my-model",
89
+ * })
90
+ * ```
91
+ */
92
+ export declare function createHandlerAsync(config: ProviderConfig): Promise<ApiHandler>;
93
+ /**
94
+ * List of all built-in provider IDs
95
+ */
96
+ export declare const BUILT_IN_PROVIDERS: ProviderId[];
97
+ /**
98
+ * Check if a provider ID is supported (built-in or registered)
99
+ */
100
+ export declare function isProviderSupported(providerId: string): boolean;
@@ -0,0 +1,2 @@
1
+ export { OPENAI_COMPATIBLE_PROVIDERS, type ProviderDefaults, } from "./handlers/providers";
2
+ export { getModelPricing, hasModelCapability, type ModelCapability, type ModelInfo, type ModelPricing, normalizeProviderId, type ProviderCapability, type ProviderId, type ProviderSettings, ProviderSettingsSchema, parseSettings, supportsModelThinking, toProviderConfig, } from "./types/index";
@@ -0,0 +1,3 @@
1
+ export { OPENAI_COMPATIBLE_PROVIDERS, type ProviderDefaults, resolveProviderConfig, } from "./handlers/providers";
2
+ export { BUILT_IN_PROVIDERS, createHandler, createHandlerAsync, isProviderSupported, } from "./index";
3
+ export { type ApiHandler, type ApiStream, type ApiStreamChunk, type ApiStreamReasoningChunk, type ApiStreamTextChunk, type ApiStreamToolCall, type ApiStreamToolCallsChunk, type ApiStreamUsageChunk, type ContentBlock, type FileContent, getModelPricing, type HandlerFactory, type HandlerModelInfo, hasModelCapability, type ImageContent, type LazyHandlerFactory, type Message, type MessageRole, type MessageWithMetadata, type ModelCapability, type ModelInfo, type ModelPricing, normalizeProviderId, type ProviderCapability, type ProviderConfig, type ProviderId, type ProviderSettings, ProviderSettingsSchema, parseSettings, type RedactedThinkingContent, supportsModelThinking, type TextContent, type ThinkingContent, type ToolDefinition, type ToolResultContent, type ToolUseContent, toProviderConfig, } from "./types/index";
@@ -0,0 +1,10 @@
1
+ import type { ModelInfo, ProviderCapability } from "../../models/schemas/index";
2
+ export interface OpenAICompatibleProviderDefaults {
3
+ baseUrl: string;
4
+ modelId: string;
5
+ knownModels?: Record<string, ModelInfo>;
6
+ capabilities?: ProviderCapability[];
7
+ }
8
+ export declare function buildOpenAICompatibleProviderDefaults(options?: {
9
+ includeKnownModels?: boolean;
10
+ }): Record<string, OpenAICompatibleProviderDefaults>;
@@ -0,0 +1,9 @@
1
+ import type { Message } from "../types/messages";
2
+ export type AiSdkMessagePart = Record<string, unknown>;
3
+ export type AiSdkMessage = {
4
+ role: "system" | "user" | "assistant" | "tool";
5
+ content: string | AiSdkMessagePart[];
6
+ };
7
+ export declare function toAiSdkMessages(systemContent: string | AiSdkMessagePart[], messages: Message[], options?: {
8
+ assistantToolCallArgKey?: "args" | "input";
9
+ }): AiSdkMessage[];
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Anthropic Message Format Converter
3
+ *
4
+ * Converts our unified Message format to Anthropic's MessageParam format.
5
+ */
6
+ import type { Anthropic } from "@anthropic-ai/sdk";
7
+ import type { Message } from "../types/messages";
8
+ type AnthropicMessage = Anthropic.MessageParam;
9
+ /**
10
+ * Convert messages to Anthropic format
11
+ *
12
+ * @param messages - Messages to convert
13
+ * @param enableCaching - Whether to add cache control markers
14
+ */
15
+ export declare function convertToAnthropicMessages(messages: Message[], enableCaching?: boolean): AnthropicMessage[];
16
+ /**
17
+ * Convert tool definitions to Anthropic format
18
+ */
19
+ export declare function convertToolsToAnthropic(tools: Array<{
20
+ name: string;
21
+ description: string;
22
+ inputSchema: unknown;
23
+ }>): Anthropic.Tool[];
24
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { FileContent, ImageContent, TextContent } from "../types/messages";
2
+ export declare function normalizeToolUseInput(input: Record<string, unknown>): Record<string, unknown>;
3
+ export declare function serializeToolResultContent(content: string | Array<TextContent | ImageContent | FileContent>): string;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Gemini Message Format Converter
3
+ *
4
+ * Converts our unified Message format to Google Gemini's Content format.
5
+ */
6
+ import type { Content, FunctionDeclaration } from "@google/genai";
7
+ import type { Message } from "../types/messages";
8
+ /**
9
+ * Convert messages to Gemini format
10
+ */
11
+ export declare function convertToGeminiMessages(messages: Message[]): Content[];
12
+ /**
13
+ * Convert tool definitions to Gemini format
14
+ */
15
+ export declare function convertToolsToGemini(tools: Array<{
16
+ name: string;
17
+ description: string;
18
+ inputSchema: unknown;
19
+ }>): FunctionDeclaration[];
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Transform Module Index
3
+ *
4
+ * Re-exports all message format converters.
5
+ */
6
+ export { type AiSdkMessage, type AiSdkMessagePart, toAiSdkMessages, } from "./ai-sdk-community-format";
7
+ export { convertToAnthropicMessages, convertToolsToAnthropic, } from "./anthropic-format";
8
+ export { convertToGeminiMessages, convertToolsToGemini } from "./gemini-format";
9
+ export { convertToOpenAIMessages, convertToolsToOpenAI, getOpenAIToolParams, } from "./openai-format";
10
+ export { convertToR1Messages, type R1Message } from "./r1-format";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * OpenAI Message Format Converter
3
+ *
4
+ * Converts our unified Message format to OpenAI's ChatCompletionMessageParam format.
5
+ */
6
+ import type OpenAI from "openai";
7
+ import type { Message } from "../types/messages";
8
+ type OpenAIMessage = OpenAI.Chat.ChatCompletionMessageParam;
9
+ /**
10
+ * Convert messages to OpenAI format
11
+ */
12
+ export declare function convertToOpenAIMessages(messages: Message[]): OpenAIMessage[];
13
+ /**
14
+ * Convert tool definitions to OpenAI format
15
+ */
16
+ export declare function convertToolsToOpenAI(tools: Array<{
17
+ name: string;
18
+ description: string;
19
+ inputSchema: unknown;
20
+ }>, options?: {
21
+ strict?: boolean;
22
+ }): OpenAI.Chat.ChatCompletionTool[];
23
+ /**
24
+ * Build tool params for OpenAI request
25
+ */
26
+ export declare function getOpenAIToolParams(tools?: Array<{
27
+ name: string;
28
+ description: string;
29
+ inputSchema: unknown;
30
+ }>, options?: {
31
+ strict?: boolean;
32
+ }): {
33
+ tools?: OpenAI.Chat.ChatCompletionTool[];
34
+ tool_choice?: OpenAI.Chat.ChatCompletionToolChoiceOption;
35
+ };
36
+ export {};
@@ -0,0 +1,26 @@
1
+ /**
2
+ * R1 Message Format Converter
3
+ *
4
+ * Handles the special message format required by DeepSeek Reasoner and other R1-based models.
5
+ * Key requirements:
6
+ * 1. Consecutive messages with the same role must be merged
7
+ * 2. reasoning_content should be passed back during tool calling in the same turn
8
+ * 3. No temperature parameter for reasoner models
9
+ */
10
+ import type OpenAI from "openai";
11
+ import type { Message } from "../types/messages";
12
+ /**
13
+ * DeepSeek Reasoner message format with reasoning_content support
14
+ */
15
+ export type R1Message = OpenAI.Chat.ChatCompletionMessageParam & {
16
+ reasoning_content?: string;
17
+ };
18
+ /**
19
+ * Convert messages to R1 format
20
+ *
21
+ * This handles:
22
+ * 1. Converting content blocks to OpenAI format
23
+ * 2. Merging consecutive messages with the same role
24
+ * 3. Adding reasoning_content for tool calling continuations
25
+ */
26
+ export declare function convertToR1Messages(messages: Message[]): R1Message[];