@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.
- package/README.md +340 -0
- package/dist/config.d.ts +96 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +175 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/modelDiscovery.d.ts +31 -0
- package/dist/modelDiscovery.d.ts.map +1 -0
- package/dist/modelDiscovery.js +128 -0
- package/dist/modelDiscovery.js.map +1 -0
- package/dist/modelMetadata.d.ts +14 -0
- package/dist/modelMetadata.d.ts.map +1 -0
- package/dist/modelMetadata.js +140 -0
- package/dist/modelMetadata.js.map +1 -0
- package/dist/provider.d.ts +70 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +116 -0
- package/dist/provider.js.map +1 -0
- package/dist/types.d.ts +63 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +18 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +44 -0
- package/dist/utils.js.map +1 -0
- package/package.json +50 -0
|
@@ -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":"AAAA;;GAEG;AAGH,OAAO,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEjF,MAAM,OAAO,cAAc;IAMN;IACA;IACA;IACA;IARX,WAAW,GAA2B,IAAI,GAAG,EAAE,CAAC;IAChD,aAAa,GAAW,CAAC,CAAC;IACjB,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;IAE5D,YACmB,OAAe,EACf,MAAc,EACd,OAA+B,EAC/B,UAAwB,KAAK;QAH7B,YAAO,GAAP,OAAO,CAAQ;QACf,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAwB;QAC/B,YAAO,GAAP,OAAO,CAAsB;IAC7C,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,SAAS,CAAC;YACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;gBACvC,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;oBACtC,GAAG,IAAI,CAAC,OAAO;iBAChB;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC9F,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;YAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAE/B,8BAA8B;YAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,eAAe,GAAG,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;gBACzD,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;gBAC7D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAe;QACpC,oBAAoB;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,CAAC;QAED,6BAA6B;QAC7B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QAED,+BAA+B;QAC/B,OAAO,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,KAAU;QACzC,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAE5C,mDAAmD;QACnD,gBAAgB;QAChB,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,QAAQ,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QACjD,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,QAAQ,CAAC,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC;QAC9C,CAAC;QAED,8BAA8B;QAC9B,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC3B,QAAQ,CAAC,cAAc,GAAG,KAAK,CAAC,gBAAgB,CAAC;QACnD,CAAC;QACD,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,QAAQ,CAAC,eAAe,GAAG,KAAK,CAAC,iBAAiB,CAAC;QACrD,CAAC;QAED,2BAA2B;QAC3B,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAC7C,QAAQ,CAAC,mBAAmB,GAAG,KAAK,CAAC,aAAa,CAAC;QACrD,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,yBAAyB,KAAK,SAAS,EAAE,CAAC;YAChE,QAAQ,CAAC,mBAAmB,GAAG,KAAK,CAAC,yBAAyB,CAAC;QACjE,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACrD,QAAQ,CAAC,mBAAmB,GAAG,KAAK,CAAC,cAAc,CAAC;QACtD,CAAC;QAED,iBAAiB;QACjB,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAAC;QAC7C,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACtD,QAAQ,CAAC,kBAAkB,GAAG,KAAK,CAAC,eAAe,CAAC;QACtD,CAAC;aAAM,IAAI,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACrC,CAAC;aAAM,IAAI,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACrC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -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"}
|
package/dist/provider.js
ADDED
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/utils.d.ts
ADDED
|
@@ -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"}
|