@oai2lmapi/opencode-provider 0.1.0-prerelease.20260115130629.e7d4f72

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.
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Model discovery: fetch and cache models from API
3
+ */
4
+ import { getModelMetadataFromPatterns, mergeMetadata } from './modelMetadata.js';
5
+ export class ModelDiscovery {
6
+ baseURL;
7
+ apiKey;
8
+ headers;
9
+ fetchFn;
10
+ modelsCache = new Map();
11
+ lastFetchTime = 0;
12
+ cacheDuration = 5 * 60 * 1000; // 5 minutes
13
+ constructor(baseURL, apiKey, headers, fetchFn = fetch) {
14
+ this.baseURL = baseURL;
15
+ this.apiKey = apiKey;
16
+ this.headers = headers;
17
+ this.fetchFn = fetchFn;
18
+ }
19
+ /**
20
+ * Fetch models from API /models endpoint
21
+ */
22
+ async fetchModels() {
23
+ const now = Date.now();
24
+ if (this.modelsCache.size > 0 && now - this.lastFetchTime < this.cacheDuration) {
25
+ return Array.from(this.modelsCache.values());
26
+ }
27
+ try {
28
+ const url = `${this.baseURL}/models`;
29
+ const response = await this.fetchFn(url, {
30
+ method: 'GET',
31
+ headers: {
32
+ Authorization: `Bearer ${this.apiKey}`,
33
+ ...this.headers,
34
+ },
35
+ });
36
+ if (!response.ok) {
37
+ console.warn(`Failed to fetch models from ${url}: ${response.status} ${response.statusText}`);
38
+ return [];
39
+ }
40
+ const data = (await response.json());
41
+ const models = data.data || [];
42
+ // Enrich models with metadata
43
+ for (const model of models) {
44
+ const patternMetadata = getModelMetadataFromPatterns(model.id);
45
+ const apiMetadata = this.extractMetadataFromModel(model);
46
+ model.metadata = mergeMetadata(apiMetadata, patternMetadata);
47
+ this.modelsCache.set(model.id, model);
48
+ }
49
+ this.lastFetchTime = now;
50
+ return models;
51
+ }
52
+ catch (error) {
53
+ console.error('Error fetching models:', error);
54
+ return [];
55
+ }
56
+ }
57
+ /**
58
+ * Get metadata for a specific model
59
+ */
60
+ async getModelMetadata(modelId) {
61
+ // Check cache first
62
+ const cached = this.modelsCache.get(modelId);
63
+ if (cached?.metadata) {
64
+ return cached.metadata;
65
+ }
66
+ // Fetch models if not cached
67
+ await this.fetchModels();
68
+ const model = this.modelsCache.get(modelId);
69
+ if (model?.metadata) {
70
+ return model.metadata;
71
+ }
72
+ // Fallback to pattern matching
73
+ return getModelMetadataFromPatterns(modelId);
74
+ }
75
+ /**
76
+ * Extract metadata from model object returned by API
77
+ */
78
+ extractMetadataFromModel(model) {
79
+ const metadata = {};
80
+ // Try to extract from various API response formats
81
+ // OpenAI format
82
+ if (model.context_length) {
83
+ metadata.maxInputTokens = model.context_length;
84
+ }
85
+ if (model.max_tokens) {
86
+ metadata.maxOutputTokens = model.max_tokens;
87
+ }
88
+ // Anthropic/OpenRouter format
89
+ if (model.max_input_tokens) {
90
+ metadata.maxInputTokens = model.max_input_tokens;
91
+ }
92
+ if (model.max_output_tokens) {
93
+ metadata.maxOutputTokens = model.max_output_tokens;
94
+ }
95
+ // Function calling support
96
+ if (typeof model.function_call === 'boolean') {
97
+ metadata.supportsToolCalling = model.function_call;
98
+ }
99
+ else if (typeof model.supports_function_calling === 'boolean') {
100
+ metadata.supportsToolCalling = model.supports_function_calling;
101
+ }
102
+ else if (typeof model.supports_tools === 'boolean') {
103
+ metadata.supportsToolCalling = model.supports_tools;
104
+ }
105
+ // Vision support
106
+ if (typeof model.vision === 'boolean') {
107
+ metadata.supportsImageInput = model.vision;
108
+ }
109
+ else if (typeof model.supports_vision === 'boolean') {
110
+ metadata.supportsImageInput = model.supports_vision;
111
+ }
112
+ else if (model.modalities?.includes('vision')) {
113
+ metadata.supportsImageInput = true;
114
+ }
115
+ else if (model.modalities?.includes('image')) {
116
+ metadata.supportsImageInput = true;
117
+ }
118
+ return metadata;
119
+ }
120
+ /**
121
+ * Clear cache
122
+ */
123
+ clearCache() {
124
+ this.modelsCache.clear();
125
+ this.lastFetchTime = 0;
126
+ }
127
+ }
128
+ //# sourceMappingURL=modelDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelDiscovery.js","sourceRoot":"","sources":["../src/modelDiscovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Model metadata registry for fallback when API doesn't provide complete info
3
+ */
4
+ import { ModelMetadata } from './types.js';
5
+ export declare const DEFAULT_MODEL_METADATA: ModelMetadata;
6
+ /**
7
+ * Get metadata for a model by matching against known patterns
8
+ */
9
+ export declare function getModelMetadataFromPatterns(modelId: string): ModelMetadata;
10
+ /**
11
+ * Merge API metadata with pattern-based metadata
12
+ */
13
+ export declare function mergeMetadata(apiMetadata: Partial<ModelMetadata> | undefined, patternMetadata: ModelMetadata): ModelMetadata;
14
+ //# sourceMappingURL=modelMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelMetadata.d.ts","sourceRoot":"","sources":["../src/modelMetadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,sBAAsB,EAAE,aAKpC,CAAC;AA6GF;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAe3E;AASD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,EAC/C,eAAe,EAAE,aAAa,GAC7B,aAAa,CAOf"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Model metadata registry for fallback when API doesn't provide complete info
3
+ */
4
+ export const DEFAULT_MODEL_METADATA = {
5
+ maxInputTokens: 8192,
6
+ maxOutputTokens: 4096,
7
+ supportsToolCalling: false,
8
+ supportsImageInput: false,
9
+ };
10
+ const md = (maxInputTokens, maxOutputTokens, supportsToolCalling, supportsImageInput) => ({
11
+ maxInputTokens,
12
+ maxOutputTokens,
13
+ supportsToolCalling,
14
+ supportsImageInput,
15
+ });
16
+ /**
17
+ * Hierarchical model patterns for capability detection
18
+ * Based on known model families and their characteristics
19
+ */
20
+ const MODEL_PATTERNS = [
21
+ // OpenAI GPT-5
22
+ {
23
+ pattern: /gpt-5/i,
24
+ metadata: md(400000, 128000, true, true),
25
+ subPatterns: [
26
+ { pattern: /gpt-5-nano/i, metadata: md(262144, 65536, true, false) },
27
+ { pattern: /gpt-5-mini/i, metadata: md(262144, 65536, true, true) },
28
+ { pattern: /gpt-5-pro/i, metadata: md(400000, 128000, true, true) },
29
+ ],
30
+ },
31
+ // OpenAI GPT-4
32
+ {
33
+ pattern: /gpt-4/i,
34
+ metadata: md(128000, 16384, true, true),
35
+ subPatterns: [
36
+ { pattern: /gpt-4o/i, metadata: md(128000, 16384, true, true) },
37
+ { pattern: /gpt-4-turbo/i, metadata: md(128000, 4096, true, true) },
38
+ { pattern: /gpt-4-vision/i, metadata: md(128000, 4096, true, true) },
39
+ ],
40
+ },
41
+ // OpenAI o-series (reasoning models)
42
+ {
43
+ pattern: /^o[1-4]/i,
44
+ metadata: md(200000, 100000, true, false),
45
+ subPatterns: [
46
+ { pattern: /o3-mini/i, metadata: md(200000, 100000, true, false) },
47
+ { pattern: /o1/i, metadata: md(200000, 100000, true, false) },
48
+ ],
49
+ },
50
+ // Claude
51
+ {
52
+ pattern: /claude/i,
53
+ metadata: md(200000, 8192, true, true),
54
+ subPatterns: [
55
+ { pattern: /claude-3\.7-sonnet/i, metadata: md(200000, 64000, true, true) },
56
+ { pattern: /claude-3\.5-sonnet/i, metadata: md(200000, 8192, true, true) },
57
+ { pattern: /claude-3-opus/i, metadata: md(200000, 4096, true, true) },
58
+ ],
59
+ },
60
+ // Gemini
61
+ {
62
+ pattern: /gemini/i,
63
+ metadata: md(1000000, 8192, true, true),
64
+ subPatterns: [
65
+ { pattern: /gemini-2\.0-flash-thinking/i, metadata: md(1000000, 65536, true, true) },
66
+ { pattern: /gemini-2\.0-flash/i, metadata: md(1000000, 8192, true, true) },
67
+ { pattern: /gemini-exp/i, metadata: md(2097152, 8192, true, true) },
68
+ ],
69
+ },
70
+ // DeepSeek
71
+ {
72
+ pattern: /deepseek/i,
73
+ metadata: md(64000, 8192, false, false),
74
+ subPatterns: [
75
+ { pattern: /deepseek-v3/i, metadata: md(64000, 8192, false, false) },
76
+ { pattern: /deepseek-r1/i, metadata: md(64000, 8192, false, false) },
77
+ ],
78
+ },
79
+ // Qwen
80
+ {
81
+ pattern: /qwen/i,
82
+ metadata: md(128000, 8192, true, true),
83
+ subPatterns: [
84
+ { pattern: /qwq/i, metadata: md(32768, 32768, false, false) },
85
+ { pattern: /qwen-3/i, metadata: md(1000000, 131072, true, true) },
86
+ { pattern: /qwen-2\.5/i, metadata: md(128000, 8192, true, true) },
87
+ ],
88
+ },
89
+ // Llama
90
+ {
91
+ pattern: /llama/i,
92
+ metadata: md(128000, 8192, true, false),
93
+ subPatterns: [
94
+ { pattern: /llama-3\.3/i, metadata: md(128000, 8192, true, false) },
95
+ { pattern: /llama-3\.2-vision/i, metadata: md(128000, 8192, true, true) },
96
+ ],
97
+ },
98
+ // GLM (Zhipu)
99
+ {
100
+ pattern: /glm/i,
101
+ metadata: md(128000, 8192, true, true),
102
+ },
103
+ ];
104
+ /**
105
+ * Get metadata for a model by matching against known patterns
106
+ */
107
+ export function getModelMetadataFromPatterns(modelId) {
108
+ for (const family of MODEL_PATTERNS) {
109
+ if (matchesPattern(modelId, family.pattern)) {
110
+ // Check sub-patterns first (more specific)
111
+ if (family.subPatterns) {
112
+ for (const sub of family.subPatterns) {
113
+ if (matchesPattern(modelId, sub.pattern)) {
114
+ return sub.metadata;
115
+ }
116
+ }
117
+ }
118
+ return family.metadata;
119
+ }
120
+ }
121
+ return DEFAULT_MODEL_METADATA;
122
+ }
123
+ function matchesPattern(modelId, pattern) {
124
+ if (typeof pattern === 'string') {
125
+ return modelId.toLowerCase().includes(pattern.toLowerCase());
126
+ }
127
+ return pattern.test(modelId);
128
+ }
129
+ /**
130
+ * Merge API metadata with pattern-based metadata
131
+ */
132
+ export function mergeMetadata(apiMetadata, patternMetadata) {
133
+ return {
134
+ maxInputTokens: apiMetadata?.maxInputTokens ?? patternMetadata.maxInputTokens,
135
+ maxOutputTokens: apiMetadata?.maxOutputTokens ?? patternMetadata.maxOutputTokens,
136
+ supportsToolCalling: apiMetadata?.supportsToolCalling ?? patternMetadata.supportsToolCalling,
137
+ supportsImageInput: apiMetadata?.supportsImageInput ?? patternMetadata.supportsImageInput,
138
+ };
139
+ }
140
+ //# sourceMappingURL=modelMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelMetadata.js","sourceRoot":"","sources":["../src/modelMetadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Main provider implementation using @ai-sdk/openai-compatible as base
3
+ */
4
+ import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
5
+ import { OAI2LMProviderSettings, ModelOverride, ModelMetadata } from './types.js';
6
+ export declare class OAI2LMProvider {
7
+ private baseProvider;
8
+ private modelDiscovery;
9
+ private modelOverrides;
10
+ private providerName;
11
+ private fetchFn;
12
+ constructor(settings: OAI2LMProviderSettings);
13
+ /**
14
+ * Create a provider from config file (oai2lm.json)
15
+ *
16
+ * This factory method:
17
+ * 1. Loads config from ~/.local/share/opencode/oai2lm.json or ~/.config/opencode/oai2lm.json
18
+ * 2. Applies explicit overrides on top of config
19
+ * 3. Creates and returns a configured provider
20
+ *
21
+ * @param overrides - Optional settings to override config file values
22
+ * @throws Error if API key is not found in env, config, or overrides
23
+ */
24
+ static fromConfig(overrides?: Partial<OAI2LMProviderSettings>): OAI2LMProvider;
25
+ /**
26
+ * Create a language model instance
27
+ */
28
+ languageModel(modelId: string): ReturnType<ReturnType<typeof createOpenAICompatible>['languageModel']>;
29
+ /**
30
+ * Alias for languageModel (matches AI SDK convention)
31
+ */
32
+ chatModel(modelId: string): ReturnType<ReturnType<typeof createOpenAICompatible>['languageModel']>;
33
+ /**
34
+ * Call operator: provider('model-id')
35
+ */
36
+ call(modelId: string): ReturnType<ReturnType<typeof createOpenAICompatible>['languageModel']>;
37
+ /**
38
+ * Discover available models from API
39
+ */
40
+ discoverModels(): Promise<import("./types.js").ModelInfo[]>;
41
+ /**
42
+ * Get metadata for a specific model
43
+ */
44
+ getModelMetadata(modelId: string): Promise<ModelMetadata | undefined>;
45
+ /**
46
+ * Clear model cache
47
+ */
48
+ clearModelCache(): void;
49
+ /**
50
+ * Get the best matching override for a model
51
+ */
52
+ getModelOverride(modelId: string): ModelOverride | undefined;
53
+ }
54
+ /**
55
+ * Factory function to create a provider
56
+ */
57
+ export declare function createOAI2LMProvider(settings: OAI2LMProviderSettings): OAI2LMProvider;
58
+ /**
59
+ * Factory function to create a provider from config file
60
+ *
61
+ * This is a convenience function that:
62
+ * 1. Loads config from ~/.local/share/opencode/oai2lm.json
63
+ * 2. Falls back to ~/.config/opencode/oai2lm.json
64
+ * 3. Applies explicit overrides on top
65
+ *
66
+ * @param overrides - Optional settings to override config file values
67
+ * @throws Error if API key is not found
68
+ */
69
+ export declare function createOAI2LMProviderFromConfig(overrides?: Partial<OAI2LMProviderSettings>): OAI2LMProvider;
70
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKlF,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAe;gBAElB,QAAQ,EAAE,sBAAsB;IA8B5C;;;;;;;;;;OAUG;IACH,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,cAAc;IAK9E;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,eAAe,CAAC,CAAC;IAKtG;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,eAAe,CAAC,CAAC;IAIlG;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,eAAe,CAAC,CAAC;IAI7F;;OAEG;IACG,cAAc;IAIpB;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAI3E;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;CAK7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,cAAc,CAErF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAC1C,cAAc,CAEhB"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Main provider implementation using @ai-sdk/openai-compatible as base
3
+ */
4
+ import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
5
+ import { ModelDiscovery } from './modelDiscovery.js';
6
+ import { findBestMatch } from './utils.js';
7
+ import { createSettingsFromConfig } from './config.js';
8
+ export class OAI2LMProvider {
9
+ baseProvider;
10
+ modelDiscovery;
11
+ modelOverrides;
12
+ providerName;
13
+ fetchFn;
14
+ constructor(settings) {
15
+ this.providerName = settings.name || 'oai2lm';
16
+ this.modelOverrides = settings.modelOverrides || {};
17
+ this.fetchFn = settings.fetch || fetch;
18
+ // Create base provider using openai-compatible
19
+ this.baseProvider = createOpenAICompatible({
20
+ baseURL: settings.baseURL,
21
+ name: this.providerName,
22
+ apiKey: settings.apiKey,
23
+ headers: settings.headers,
24
+ fetch: this.fetchFn,
25
+ });
26
+ // Initialize model discovery
27
+ this.modelDiscovery = new ModelDiscovery(settings.baseURL, settings.apiKey, settings.headers || {}, this.fetchFn);
28
+ // Auto-discover models if enabled
29
+ if (settings.autoDiscoverModels !== false) {
30
+ this.discoverModels().catch((err) => {
31
+ console.warn('Failed to auto-discover models:', err);
32
+ });
33
+ }
34
+ }
35
+ /**
36
+ * Create a provider from config file (oai2lm.json)
37
+ *
38
+ * This factory method:
39
+ * 1. Loads config from ~/.local/share/opencode/oai2lm.json or ~/.config/opencode/oai2lm.json
40
+ * 2. Applies explicit overrides on top of config
41
+ * 3. Creates and returns a configured provider
42
+ *
43
+ * @param overrides - Optional settings to override config file values
44
+ * @throws Error if API key is not found in env, config, or overrides
45
+ */
46
+ static fromConfig(overrides) {
47
+ const settings = createSettingsFromConfig(overrides);
48
+ return new OAI2LMProvider(settings);
49
+ }
50
+ /**
51
+ * Create a language model instance
52
+ */
53
+ languageModel(modelId) {
54
+ // Return the base model
55
+ return this.baseProvider.languageModel(modelId);
56
+ }
57
+ /**
58
+ * Alias for languageModel (matches AI SDK convention)
59
+ */
60
+ chatModel(modelId) {
61
+ return this.languageModel(modelId);
62
+ }
63
+ /**
64
+ * Call operator: provider('model-id')
65
+ */
66
+ call(modelId) {
67
+ return this.languageModel(modelId);
68
+ }
69
+ /**
70
+ * Discover available models from API
71
+ */
72
+ async discoverModels() {
73
+ return await this.modelDiscovery.fetchModels();
74
+ }
75
+ /**
76
+ * Get metadata for a specific model
77
+ */
78
+ async getModelMetadata(modelId) {
79
+ return await this.modelDiscovery.getModelMetadata(modelId);
80
+ }
81
+ /**
82
+ * Clear model cache
83
+ */
84
+ clearModelCache() {
85
+ this.modelDiscovery.clearCache();
86
+ }
87
+ /**
88
+ * Get the best matching override for a model
89
+ */
90
+ getModelOverride(modelId) {
91
+ const patterns = Object.keys(this.modelOverrides);
92
+ const bestMatch = findBestMatch(modelId, patterns);
93
+ return bestMatch ? this.modelOverrides[bestMatch] : undefined;
94
+ }
95
+ }
96
+ /**
97
+ * Factory function to create a provider
98
+ */
99
+ export function createOAI2LMProvider(settings) {
100
+ return new OAI2LMProvider(settings);
101
+ }
102
+ /**
103
+ * Factory function to create a provider from config file
104
+ *
105
+ * This is a convenience function that:
106
+ * 1. Loads config from ~/.local/share/opencode/oai2lm.json
107
+ * 2. Falls back to ~/.config/opencode/oai2lm.json
108
+ * 3. Applies explicit overrides on top
109
+ *
110
+ * @param overrides - Optional settings to override config file values
111
+ * @throws Error if API key is not found
112
+ */
113
+ export function createOAI2LMProviderFromConfig(overrides) {
114
+ return OAI2LMProvider.fromConfig(overrides);
115
+ }
116
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Types for the OpenAI-compatible provider
3
+ */
4
+ export interface ModelMetadata {
5
+ /** Maximum input tokens the model can accept */
6
+ maxInputTokens: number;
7
+ /** Maximum output tokens the model can generate */
8
+ maxOutputTokens: number;
9
+ /** Whether the model supports tool/function calling */
10
+ supportsToolCalling: boolean;
11
+ /** Whether the model supports image/vision input */
12
+ supportsImageInput: boolean;
13
+ }
14
+ export interface ModelOverride {
15
+ /** Max input tokens */
16
+ maxInputTokens?: number;
17
+ /** Max output tokens */
18
+ maxOutputTokens?: number;
19
+ /** Supports native tool/function calling */
20
+ supportsToolCalling?: boolean;
21
+ /** Supports image inputs */
22
+ supportsImageInput?: boolean;
23
+ /** Default temperature */
24
+ temperature?: number;
25
+ /** Use XML-based prompt engineering for tools instead of native function calling */
26
+ usePromptBasedToolCalling?: boolean;
27
+ /** Strip <think>...</think> blocks from output */
28
+ suppressChainOfThought?: boolean;
29
+ /** Capture reasoning content separately */
30
+ captureReasoning?: boolean;
31
+ /** Thinking level: token budget or preset */
32
+ thinkingLevel?: number | 'low' | 'medium' | 'high' | 'auto' | 'none';
33
+ /** Trim XML tool parameter whitespace */
34
+ trimXmlToolParameterWhitespace?: boolean;
35
+ }
36
+ export interface OAI2LMProviderSettings {
37
+ /** API key for authentication */
38
+ apiKey: string;
39
+ /** Base URL for API calls (e.g., 'https://api.example.com/v1') */
40
+ baseURL: string;
41
+ /** Provider name (defaults to 'oai2lm') */
42
+ name?: string;
43
+ /** Custom headers */
44
+ headers?: Record<string, string>;
45
+ /** Auto-discover models on initialization (default: true) */
46
+ autoDiscoverModels?: boolean;
47
+ /** Per-model configuration overrides (supports wildcards) */
48
+ modelOverrides?: Record<string, ModelOverride>;
49
+ /** Custom fetch implementation */
50
+ fetch?: typeof fetch;
51
+ }
52
+ export interface ModelInfo {
53
+ id: string;
54
+ object: string;
55
+ created?: number;
56
+ owned_by?: string;
57
+ metadata?: ModelMetadata;
58
+ }
59
+ export interface ModelsListResponse {
60
+ object: string;
61
+ data: ModelInfo[];
62
+ }
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oDAAoD;IACpD,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,4BAA4B;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,kDAAkD;IAClD,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACrE,yCAAyC;IACzC,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/C,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,EAAE,CAAC;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Types for the OpenAI-compatible provider
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Utility to match model IDs against wildcard patterns
3
+ */
4
+ /**
5
+ * Convert a wildcard pattern to a RegExp
6
+ * Supports: * (any characters), ? (single character)
7
+ */
8
+ export declare function wildcardToRegex(pattern: string): RegExp;
9
+ /**
10
+ * Check if a model ID matches a wildcard pattern
11
+ */
12
+ export declare function matchesWildcard(modelId: string, pattern: string): boolean;
13
+ /**
14
+ * Find the most specific matching pattern for a model ID
15
+ * More specific = longer literal prefix before wildcard
16
+ */
17
+ export declare function findBestMatch(modelId: string, patterns: string[]): string | undefined;
18
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGzE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB,MAAM,GAAG,SAAS,CAoBpB"}
package/dist/utils.js ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Utility to match model IDs against wildcard patterns
3
+ */
4
+ /**
5
+ * Convert a wildcard pattern to a RegExp
6
+ * Supports: * (any characters), ? (single character)
7
+ */
8
+ export function wildcardToRegex(pattern) {
9
+ // Escape special regex characters except * and ?
10
+ const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
11
+ // Convert * to .* and ? to .
12
+ const regex = escaped.replace(/\*/g, '.*').replace(/\?/g, '.');
13
+ return new RegExp(`^${regex}$`, 'i');
14
+ }
15
+ /**
16
+ * Check if a model ID matches a wildcard pattern
17
+ */
18
+ export function matchesWildcard(modelId, pattern) {
19
+ const regex = wildcardToRegex(pattern);
20
+ return regex.test(modelId);
21
+ }
22
+ /**
23
+ * Find the most specific matching pattern for a model ID
24
+ * More specific = longer literal prefix before wildcard
25
+ */
26
+ export function findBestMatch(modelId, patterns) {
27
+ const matches = patterns.filter((p) => matchesWildcard(modelId, p));
28
+ if (matches.length === 0) {
29
+ return undefined;
30
+ }
31
+ // Sort by specificity: longer patterns are more specific
32
+ // Also prioritize patterns without wildcards
33
+ matches.sort((a, b) => {
34
+ const aHasWildcard = a.includes('*') || a.includes('?');
35
+ const bHasWildcard = b.includes('*') || b.includes('?');
36
+ if (!aHasWildcard && bHasWildcard)
37
+ return -1;
38
+ if (aHasWildcard && !bHasWildcard)
39
+ return 1;
40
+ return b.length - a.length;
41
+ });
42
+ return matches[0];
43
+ }
44
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,iDAAiD;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC7D,6BAA6B;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/D,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,OAAe;IAC9D,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,QAAkB;IAElB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAEpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,yDAAyD;IACzD,6CAA6C;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,YAAY,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAExD,IAAI,CAAC,YAAY,IAAI,YAAY;YAAE,OAAO,CAAC,CAAC,CAAC;QAC7C,IAAI,YAAY,IAAI,CAAC,YAAY;YAAE,OAAO,CAAC,CAAC;QAE5C,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}