@sentropic/llm-mesh 0.1.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 (63) hide show
  1. package/LICENSE +59 -0
  2. package/README.md +15 -0
  3. package/dist/adapter-auth.d.ts +6 -0
  4. package/dist/adapter-auth.d.ts.map +1 -0
  5. package/dist/adapter-auth.js +38 -0
  6. package/dist/adapter-auth.js.map +1 -0
  7. package/dist/adapter-core.d.ts +42 -0
  8. package/dist/adapter-core.d.ts.map +1 -0
  9. package/dist/adapter-core.js +51 -0
  10. package/dist/adapter-core.js.map +1 -0
  11. package/dist/adapters.d.ts +40 -0
  12. package/dist/adapters.d.ts.map +1 -0
  13. package/dist/adapters.js +39 -0
  14. package/dist/adapters.js.map +1 -0
  15. package/dist/auth.d.ts +92 -0
  16. package/dist/auth.d.ts.map +1 -0
  17. package/dist/auth.js +80 -0
  18. package/dist/auth.js.map +1 -0
  19. package/dist/capabilities.d.ts +60 -0
  20. package/dist/capabilities.d.ts.map +1 -0
  21. package/dist/capabilities.js +15 -0
  22. package/dist/capabilities.js.map +1 -0
  23. package/dist/catalog.d.ts +253 -0
  24. package/dist/catalog.d.ts.map +1 -0
  25. package/dist/catalog.js +261 -0
  26. package/dist/catalog.js.map +1 -0
  27. package/dist/errors.d.ts +22 -0
  28. package/dist/errors.d.ts.map +1 -0
  29. package/dist/errors.js +85 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/generation.d.ts +63 -0
  32. package/dist/generation.d.ts.map +1 -0
  33. package/dist/generation.js +2 -0
  34. package/dist/generation.js.map +1 -0
  35. package/dist/index.d.ts +13 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +13 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/mesh.d.ts +37 -0
  40. package/dist/mesh.d.ts.map +1 -0
  41. package/dist/mesh.js +109 -0
  42. package/dist/mesh.js.map +1 -0
  43. package/dist/messages.d.ts +38 -0
  44. package/dist/messages.d.ts.map +1 -0
  45. package/dist/messages.js +2 -0
  46. package/dist/messages.js.map +1 -0
  47. package/dist/providers.d.ts +25 -0
  48. package/dist/providers.d.ts.map +1 -0
  49. package/dist/providers.js +31 -0
  50. package/dist/providers.js.map +1 -0
  51. package/dist/registry.d.ts +37 -0
  52. package/dist/registry.d.ts.map +1 -0
  53. package/dist/registry.js +26 -0
  54. package/dist/registry.js.map +1 -0
  55. package/dist/streaming.d.ts +72 -0
  56. package/dist/streaming.d.ts.map +1 -0
  57. package/dist/streaming.js +11 -0
  58. package/dist/streaming.js.map +1 -0
  59. package/dist/tools.d.ts +112 -0
  60. package/dist/tools.d.ts.map +1 -0
  61. package/dist/tools.js +2 -0
  62. package/dist/tools.js.map +1 -0
  63. package/package.json +33 -0
@@ -0,0 +1,253 @@
1
+ import { type ModelCapabilities, type ProviderCapabilities } from './capabilities.js';
2
+ import { type KnownModelId, type ModelId, type ModelTaskHint, type ProviderFamily, type ProviderId, type ProviderStatus, type ReasoningTier } from './providers.js';
3
+ export interface ProviderDescriptor {
4
+ providerId: ProviderId;
5
+ family: ProviderFamily;
6
+ label: string;
7
+ status: ProviderStatus;
8
+ capabilities: ProviderCapabilities;
9
+ }
10
+ export interface ModelProfile {
11
+ providerId: ProviderId;
12
+ modelId: KnownModelId;
13
+ label: string;
14
+ reasoningTier: ReasoningTier;
15
+ defaultTaskHints: readonly ModelTaskHint[];
16
+ capabilities: ModelCapabilities;
17
+ }
18
+ export declare const providerProfiles: {
19
+ readonly openai: {
20
+ readonly providerId: "openai";
21
+ readonly family: "openai";
22
+ readonly label: "OpenAI";
23
+ readonly status: "planned";
24
+ readonly capabilities: ProviderCapabilities;
25
+ };
26
+ readonly gemini: {
27
+ readonly providerId: "gemini";
28
+ readonly family: "google";
29
+ readonly label: "Google Gemini";
30
+ readonly status: "planned";
31
+ readonly capabilities: ProviderCapabilities;
32
+ };
33
+ readonly anthropic: {
34
+ readonly providerId: "anthropic";
35
+ readonly family: "anthropic";
36
+ readonly label: "Anthropic Claude";
37
+ readonly status: "planned";
38
+ readonly capabilities: ProviderCapabilities;
39
+ };
40
+ readonly mistral: {
41
+ readonly providerId: "mistral";
42
+ readonly family: "mistral";
43
+ readonly label: "Mistral AI";
44
+ readonly status: "planned";
45
+ readonly capabilities: ProviderCapabilities;
46
+ };
47
+ readonly cohere: {
48
+ readonly providerId: "cohere";
49
+ readonly family: "cohere";
50
+ readonly label: "Cohere";
51
+ readonly status: "planned";
52
+ readonly capabilities: ProviderCapabilities;
53
+ };
54
+ };
55
+ export declare const modelProfiles: readonly [{
56
+ readonly providerId: "openai";
57
+ readonly modelId: "gpt-5.4";
58
+ readonly label: "GPT-5.4";
59
+ readonly reasoningTier: "advanced";
60
+ readonly defaultTaskHints: readonly ["chat", "structured", "summary"];
61
+ readonly capabilities: ModelCapabilities;
62
+ }, {
63
+ readonly providerId: "openai";
64
+ readonly modelId: "gpt-5.4-nano";
65
+ readonly label: "GPT-5.4 Nano";
66
+ readonly reasoningTier: "standard";
67
+ readonly defaultTaskHints: readonly ["chat"];
68
+ readonly capabilities: ModelCapabilities;
69
+ }, {
70
+ readonly providerId: "openai";
71
+ readonly modelId: "gpt-4.1-nano";
72
+ readonly label: "GPT-4.1 Nano";
73
+ readonly reasoningTier: "none";
74
+ readonly defaultTaskHints: readonly ["doc"];
75
+ readonly capabilities: ModelCapabilities;
76
+ }, {
77
+ readonly providerId: "gemini";
78
+ readonly modelId: "gemini-3.1-pro-preview-customtools";
79
+ readonly label: "Gemini 3.1 Pro";
80
+ readonly reasoningTier: "advanced";
81
+ readonly defaultTaskHints: readonly ["chat", "structured", "summary"];
82
+ readonly capabilities: ModelCapabilities;
83
+ }, {
84
+ readonly providerId: "gemini";
85
+ readonly modelId: "gemini-3.1-flash-lite-preview";
86
+ readonly label: "Gemini 3.1 Flash Lite";
87
+ readonly reasoningTier: "standard";
88
+ readonly defaultTaskHints: readonly ["chat"];
89
+ readonly capabilities: ModelCapabilities;
90
+ }, {
91
+ readonly providerId: "anthropic";
92
+ readonly modelId: "claude-sonnet-4-6";
93
+ readonly label: "Sonnet 4.6";
94
+ readonly reasoningTier: "standard";
95
+ readonly defaultTaskHints: readonly ["chat", "structured"];
96
+ readonly capabilities: ModelCapabilities;
97
+ }, {
98
+ readonly providerId: "anthropic";
99
+ readonly modelId: "claude-opus-4-6";
100
+ readonly label: "Opus 4.6";
101
+ readonly reasoningTier: "advanced";
102
+ readonly defaultTaskHints: readonly ["chat", "structured", "summary"];
103
+ readonly capabilities: ModelCapabilities;
104
+ }, {
105
+ readonly providerId: "mistral";
106
+ readonly modelId: "mistral-small-2603";
107
+ readonly label: "Mistral Small 4";
108
+ readonly reasoningTier: "standard";
109
+ readonly defaultTaskHints: readonly ["chat"];
110
+ readonly capabilities: ModelCapabilities;
111
+ }, {
112
+ readonly providerId: "mistral";
113
+ readonly modelId: "magistral-medium-2509";
114
+ readonly label: "Magistral Medium";
115
+ readonly reasoningTier: "advanced";
116
+ readonly defaultTaskHints: readonly ["chat", "structured", "summary"];
117
+ readonly capabilities: ModelCapabilities;
118
+ }, {
119
+ readonly providerId: "cohere";
120
+ readonly modelId: "command-a-03-2025";
121
+ readonly label: "Command A";
122
+ readonly reasoningTier: "standard";
123
+ readonly defaultTaskHints: readonly ["chat"];
124
+ readonly capabilities: ModelCapabilities;
125
+ }, {
126
+ readonly providerId: "cohere";
127
+ readonly modelId: "command-a-reasoning-08-2025";
128
+ readonly label: "Command A R.";
129
+ readonly reasoningTier: "advanced";
130
+ readonly defaultTaskHints: readonly ["chat", "structured", "summary"];
131
+ readonly capabilities: ModelCapabilities;
132
+ }];
133
+ export declare const providerCapabilityMatrix: {
134
+ readonly openai: {
135
+ readonly providerId: "openai";
136
+ readonly family: "openai";
137
+ readonly label: "OpenAI";
138
+ readonly status: "planned";
139
+ readonly capabilities: ProviderCapabilities;
140
+ };
141
+ readonly gemini: {
142
+ readonly providerId: "gemini";
143
+ readonly family: "google";
144
+ readonly label: "Google Gemini";
145
+ readonly status: "planned";
146
+ readonly capabilities: ProviderCapabilities;
147
+ };
148
+ readonly anthropic: {
149
+ readonly providerId: "anthropic";
150
+ readonly family: "anthropic";
151
+ readonly label: "Anthropic Claude";
152
+ readonly status: "planned";
153
+ readonly capabilities: ProviderCapabilities;
154
+ };
155
+ readonly mistral: {
156
+ readonly providerId: "mistral";
157
+ readonly family: "mistral";
158
+ readonly label: "Mistral AI";
159
+ readonly status: "planned";
160
+ readonly capabilities: ProviderCapabilities;
161
+ };
162
+ readonly cohere: {
163
+ readonly providerId: "cohere";
164
+ readonly family: "cohere";
165
+ readonly label: "Cohere";
166
+ readonly status: "planned";
167
+ readonly capabilities: ProviderCapabilities;
168
+ };
169
+ };
170
+ export declare const modelCapabilityMatrix: readonly [{
171
+ readonly providerId: "openai";
172
+ readonly modelId: "gpt-5.4";
173
+ readonly label: "GPT-5.4";
174
+ readonly reasoningTier: "advanced";
175
+ readonly defaultTaskHints: readonly ["chat", "structured", "summary"];
176
+ readonly capabilities: ModelCapabilities;
177
+ }, {
178
+ readonly providerId: "openai";
179
+ readonly modelId: "gpt-5.4-nano";
180
+ readonly label: "GPT-5.4 Nano";
181
+ readonly reasoningTier: "standard";
182
+ readonly defaultTaskHints: readonly ["chat"];
183
+ readonly capabilities: ModelCapabilities;
184
+ }, {
185
+ readonly providerId: "openai";
186
+ readonly modelId: "gpt-4.1-nano";
187
+ readonly label: "GPT-4.1 Nano";
188
+ readonly reasoningTier: "none";
189
+ readonly defaultTaskHints: readonly ["doc"];
190
+ readonly capabilities: ModelCapabilities;
191
+ }, {
192
+ readonly providerId: "gemini";
193
+ readonly modelId: "gemini-3.1-pro-preview-customtools";
194
+ readonly label: "Gemini 3.1 Pro";
195
+ readonly reasoningTier: "advanced";
196
+ readonly defaultTaskHints: readonly ["chat", "structured", "summary"];
197
+ readonly capabilities: ModelCapabilities;
198
+ }, {
199
+ readonly providerId: "gemini";
200
+ readonly modelId: "gemini-3.1-flash-lite-preview";
201
+ readonly label: "Gemini 3.1 Flash Lite";
202
+ readonly reasoningTier: "standard";
203
+ readonly defaultTaskHints: readonly ["chat"];
204
+ readonly capabilities: ModelCapabilities;
205
+ }, {
206
+ readonly providerId: "anthropic";
207
+ readonly modelId: "claude-sonnet-4-6";
208
+ readonly label: "Sonnet 4.6";
209
+ readonly reasoningTier: "standard";
210
+ readonly defaultTaskHints: readonly ["chat", "structured"];
211
+ readonly capabilities: ModelCapabilities;
212
+ }, {
213
+ readonly providerId: "anthropic";
214
+ readonly modelId: "claude-opus-4-6";
215
+ readonly label: "Opus 4.6";
216
+ readonly reasoningTier: "advanced";
217
+ readonly defaultTaskHints: readonly ["chat", "structured", "summary"];
218
+ readonly capabilities: ModelCapabilities;
219
+ }, {
220
+ readonly providerId: "mistral";
221
+ readonly modelId: "mistral-small-2603";
222
+ readonly label: "Mistral Small 4";
223
+ readonly reasoningTier: "standard";
224
+ readonly defaultTaskHints: readonly ["chat"];
225
+ readonly capabilities: ModelCapabilities;
226
+ }, {
227
+ readonly providerId: "mistral";
228
+ readonly modelId: "magistral-medium-2509";
229
+ readonly label: "Magistral Medium";
230
+ readonly reasoningTier: "advanced";
231
+ readonly defaultTaskHints: readonly ["chat", "structured", "summary"];
232
+ readonly capabilities: ModelCapabilities;
233
+ }, {
234
+ readonly providerId: "cohere";
235
+ readonly modelId: "command-a-03-2025";
236
+ readonly label: "Command A";
237
+ readonly reasoningTier: "standard";
238
+ readonly defaultTaskHints: readonly ["chat"];
239
+ readonly capabilities: ModelCapabilities;
240
+ }, {
241
+ readonly providerId: "cohere";
242
+ readonly modelId: "command-a-reasoning-08-2025";
243
+ readonly label: "Command A R.";
244
+ readonly reasoningTier: "advanced";
245
+ readonly defaultTaskHints: readonly ["chat", "structured", "summary"];
246
+ readonly capabilities: ModelCapabilities;
247
+ }];
248
+ export declare const listProviderProfiles: () => readonly ProviderDescriptor[];
249
+ export declare const listModelProfiles: () => readonly ModelProfile[];
250
+ export declare const listModelProfilesByProvider: (providerId: ProviderId) => readonly ModelProfile[];
251
+ export declare const getProviderProfile: (providerId: ProviderId) => ProviderDescriptor;
252
+ export declare const getModelProfile: (providerId: ProviderId, modelId: ModelId) => ModelProfile | null;
253
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,EAAE,oBAAoB,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,YAAY,EAAE,iBAAiB,CAAC;CACjC;AA6FD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsD8B,CAAC;AAsC5D,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyFkB,CAAC;AAE7C,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAmB,CAAC;AAEzD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAgB,CAAC;AAEnD,eAAO,MAAM,oBAAoB,QAAO,SAAS,kBAAkB,EAElE,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAO,SAAS,YAAY,EAEzD,CAAC;AAEF,eAAO,MAAM,2BAA2B,eAC1B,UAAU,KACrB,SAAS,YAAY,EAEvB,CAAC;AAEF,eAAO,MAAM,kBAAkB,eACjB,UAAU,KACrB,kBAEF,CAAC;AAEF,eAAO,MAAM,eAAe,eACd,UAAU,WACb,OAAO,KACf,YAAY,GAAG,IAMjB,CAAC"}
@@ -0,0 +1,261 @@
1
+ import { geminiUnsupportedJsonSchemaKeywords, } from './capabilities.js';
2
+ import { providerIds, } from './providers.js';
3
+ const tokenSources = [
4
+ 'direct-token',
5
+ 'user-token',
6
+ 'workspace-token',
7
+ 'environment-token',
8
+ ];
9
+ const toolChoice = ['auto', 'required', 'none'];
10
+ const textModalities = {
11
+ input: ['text'],
12
+ output: ['text', 'json', 'tool-call'],
13
+ };
14
+ const auth = (accountTransports = []) => ({
15
+ tokenSources,
16
+ accountTransports,
17
+ });
18
+ const capabilities = (input) => ({
19
+ tools: {
20
+ support: 'unknown',
21
+ parallelCalls: 'unknown',
22
+ streamedArgumentDeltas: input.streamedArgumentDeltas ?? 'unknown',
23
+ resultContinuation: 'unknown',
24
+ toolChoice,
25
+ },
26
+ streaming: {
27
+ support: 'unknown',
28
+ nativeProviderChunks: 'unknown',
29
+ },
30
+ structuredOutput: {
31
+ support: input.structuredOutputLevel === 'none'
32
+ ? 'unsupported'
33
+ : input.structuredOutputLevel === 'json-schema'
34
+ ? 'supported'
35
+ : 'partial',
36
+ strategies: ['json-object', 'json-schema', 'tool-call'],
37
+ jsonSchema: {
38
+ support: input.structuredOutputLevel === 'none'
39
+ ? 'unsupported'
40
+ : input.structuredOutputLevel === 'json-schema'
41
+ ? 'supported'
42
+ : 'partial',
43
+ level: input.structuredOutputLevel,
44
+ strict: input.structuredOutputLevel === 'json-schema',
45
+ ...(input.unsupportedKeywords ? { unsupportedKeywords: input.unsupportedKeywords } : {}),
46
+ ...(typeof input.stringEnumsOnly === 'boolean'
47
+ ? { stringEnumsOnly: input.stringEnumsOnly }
48
+ : {}),
49
+ },
50
+ },
51
+ reasoning: {
52
+ support: input.supportsReasoning === false || input.reasoningTier === 'none'
53
+ ? 'unsupported'
54
+ : 'unknown',
55
+ tier: input.reasoningTier,
56
+ controls: input.supportsReasoning === false || input.reasoningTier === 'none'
57
+ ? 'unsupported'
58
+ : 'unknown',
59
+ visibleSummaries: input.supportsReasoning === false || input.reasoningTier === 'none'
60
+ ? 'unsupported'
61
+ : 'unknown',
62
+ hiddenSignatures: input.supportsReasoning === false || input.reasoningTier === 'none'
63
+ ? 'unsupported'
64
+ : 'unknown',
65
+ tokenUsageAccounting: input.supportsReasoning === false || input.reasoningTier === 'none'
66
+ ? 'unsupported'
67
+ : 'unknown',
68
+ },
69
+ modalities: textModalities,
70
+ auth: auth(input.accountTransports),
71
+ });
72
+ export const providerProfiles = {
73
+ openai: {
74
+ providerId: 'openai',
75
+ family: 'openai',
76
+ label: 'OpenAI',
77
+ status: 'planned',
78
+ capabilities: capabilities({
79
+ reasoningTier: 'advanced',
80
+ structuredOutputLevel: 'json-schema',
81
+ accountTransports: ['codex'],
82
+ }),
83
+ },
84
+ gemini: {
85
+ providerId: 'gemini',
86
+ family: 'google',
87
+ label: 'Google Gemini',
88
+ status: 'planned',
89
+ capabilities: capabilities({
90
+ reasoningTier: 'advanced',
91
+ structuredOutputLevel: 'json-schema-subset',
92
+ unsupportedKeywords: geminiUnsupportedJsonSchemaKeywords,
93
+ stringEnumsOnly: true,
94
+ }),
95
+ },
96
+ anthropic: {
97
+ providerId: 'anthropic',
98
+ family: 'anthropic',
99
+ label: 'Anthropic Claude',
100
+ status: 'planned',
101
+ capabilities: capabilities({
102
+ reasoningTier: 'advanced',
103
+ structuredOutputLevel: 'tool-input-schema',
104
+ }),
105
+ },
106
+ mistral: {
107
+ providerId: 'mistral',
108
+ family: 'mistral',
109
+ label: 'Mistral AI',
110
+ status: 'planned',
111
+ capabilities: capabilities({
112
+ reasoningTier: 'advanced',
113
+ structuredOutputLevel: 'json-schema',
114
+ }),
115
+ },
116
+ cohere: {
117
+ providerId: 'cohere',
118
+ family: 'cohere',
119
+ label: 'Cohere',
120
+ status: 'planned',
121
+ capabilities: capabilities({
122
+ reasoningTier: 'advanced',
123
+ structuredOutputLevel: 'tool-input-schema',
124
+ }),
125
+ },
126
+ };
127
+ const modelCapabilities = (providerId, reasoningTier) => ({
128
+ ...providerProfiles[providerId].capabilities,
129
+ reasoning: {
130
+ ...providerProfiles[providerId].capabilities.reasoning,
131
+ support: providerProfiles[providerId].capabilities.reasoning.support === 'unsupported' ||
132
+ reasoningTier === 'none'
133
+ ? 'unsupported'
134
+ : providerProfiles[providerId].capabilities.reasoning.support,
135
+ tier: reasoningTier,
136
+ controls: providerProfiles[providerId].capabilities.reasoning.support === 'unsupported' ||
137
+ reasoningTier === 'none'
138
+ ? 'unsupported'
139
+ : 'unknown',
140
+ visibleSummaries: providerProfiles[providerId].capabilities.reasoning.support === 'unsupported' ||
141
+ reasoningTier === 'none'
142
+ ? 'unsupported'
143
+ : 'unknown',
144
+ hiddenSignatures: providerProfiles[providerId].capabilities.reasoning.support === 'unsupported' ||
145
+ reasoningTier === 'none'
146
+ ? 'unsupported'
147
+ : 'unknown',
148
+ tokenUsageAccounting: providerProfiles[providerId].capabilities.reasoning.support === 'unsupported' ||
149
+ reasoningTier === 'none'
150
+ ? 'unsupported'
151
+ : 'unknown',
152
+ },
153
+ });
154
+ export const modelProfiles = [
155
+ {
156
+ providerId: 'openai',
157
+ modelId: 'gpt-5.4',
158
+ label: 'GPT-5.4',
159
+ reasoningTier: 'advanced',
160
+ defaultTaskHints: ['chat', 'structured', 'summary'],
161
+ capabilities: modelCapabilities('openai', 'advanced'),
162
+ },
163
+ {
164
+ providerId: 'openai',
165
+ modelId: 'gpt-5.4-nano',
166
+ label: 'GPT-5.4 Nano',
167
+ reasoningTier: 'standard',
168
+ defaultTaskHints: ['chat'],
169
+ capabilities: modelCapabilities('openai', 'standard'),
170
+ },
171
+ {
172
+ providerId: 'openai',
173
+ modelId: 'gpt-4.1-nano',
174
+ label: 'GPT-4.1 Nano',
175
+ reasoningTier: 'none',
176
+ defaultTaskHints: ['doc'],
177
+ capabilities: modelCapabilities('openai', 'none'),
178
+ },
179
+ {
180
+ providerId: 'gemini',
181
+ modelId: 'gemini-3.1-pro-preview-customtools',
182
+ label: 'Gemini 3.1 Pro',
183
+ reasoningTier: 'advanced',
184
+ defaultTaskHints: ['chat', 'structured', 'summary'],
185
+ capabilities: modelCapabilities('gemini', 'advanced'),
186
+ },
187
+ {
188
+ providerId: 'gemini',
189
+ modelId: 'gemini-3.1-flash-lite-preview',
190
+ label: 'Gemini 3.1 Flash Lite',
191
+ reasoningTier: 'standard',
192
+ defaultTaskHints: ['chat'],
193
+ capabilities: modelCapabilities('gemini', 'standard'),
194
+ },
195
+ {
196
+ providerId: 'anthropic',
197
+ modelId: 'claude-sonnet-4-6',
198
+ label: 'Sonnet 4.6',
199
+ reasoningTier: 'standard',
200
+ defaultTaskHints: ['chat', 'structured'],
201
+ capabilities: modelCapabilities('anthropic', 'standard'),
202
+ },
203
+ {
204
+ providerId: 'anthropic',
205
+ modelId: 'claude-opus-4-6',
206
+ label: 'Opus 4.6',
207
+ reasoningTier: 'advanced',
208
+ defaultTaskHints: ['chat', 'structured', 'summary'],
209
+ capabilities: modelCapabilities('anthropic', 'advanced'),
210
+ },
211
+ {
212
+ providerId: 'mistral',
213
+ modelId: 'mistral-small-2603',
214
+ label: 'Mistral Small 4',
215
+ reasoningTier: 'standard',
216
+ defaultTaskHints: ['chat'],
217
+ capabilities: modelCapabilities('mistral', 'standard'),
218
+ },
219
+ {
220
+ providerId: 'mistral',
221
+ modelId: 'magistral-medium-2509',
222
+ label: 'Magistral Medium',
223
+ reasoningTier: 'advanced',
224
+ defaultTaskHints: ['chat', 'structured', 'summary'],
225
+ capabilities: modelCapabilities('mistral', 'advanced'),
226
+ },
227
+ {
228
+ providerId: 'cohere',
229
+ modelId: 'command-a-03-2025',
230
+ label: 'Command A',
231
+ reasoningTier: 'standard',
232
+ defaultTaskHints: ['chat'],
233
+ capabilities: modelCapabilities('cohere', 'standard'),
234
+ },
235
+ {
236
+ providerId: 'cohere',
237
+ modelId: 'command-a-reasoning-08-2025',
238
+ label: 'Command A R.',
239
+ reasoningTier: 'advanced',
240
+ defaultTaskHints: ['chat', 'structured', 'summary'],
241
+ capabilities: modelCapabilities('cohere', 'advanced'),
242
+ },
243
+ ];
244
+ export const providerCapabilityMatrix = providerProfiles;
245
+ export const modelCapabilityMatrix = modelProfiles;
246
+ export const listProviderProfiles = () => {
247
+ return providerIds.map((providerId) => providerProfiles[providerId]);
248
+ };
249
+ export const listModelProfiles = () => {
250
+ return modelProfiles;
251
+ };
252
+ export const listModelProfilesByProvider = (providerId) => {
253
+ return modelProfiles.filter((model) => model.providerId === providerId);
254
+ };
255
+ export const getProviderProfile = (providerId) => {
256
+ return providerProfiles[providerId];
257
+ };
258
+ export const getModelProfile = (providerId, modelId) => {
259
+ return (modelProfiles.find((model) => model.providerId === providerId && model.modelId === modelId) ?? null);
260
+ };
261
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ProviderId } from './providers.js';
2
+ export type ProviderErrorRetryReason = 'rate_limit' | 'timeout' | 'server_error' | 'network' | 'overloaded' | 'unknown';
3
+ export interface NormalizedProviderError {
4
+ providerId: ProviderId;
5
+ message: string;
6
+ code?: string;
7
+ retryable: boolean;
8
+ retryReason?: ProviderErrorRetryReason;
9
+ retryAfterMs?: number;
10
+ statusCode?: number;
11
+ cause?: unknown;
12
+ metadata?: Record<string, unknown>;
13
+ }
14
+ export interface ProviderErrorNormalizationOptions {
15
+ defaultMessage?: string;
16
+ retryableCodes?: readonly string[];
17
+ nonRetryableCodes?: readonly string[];
18
+ retryableStatusCodes?: readonly number[];
19
+ }
20
+ export declare const isRetryableProviderError: (statusCode: number | undefined, code: string | undefined, options?: ProviderErrorNormalizationOptions) => boolean;
21
+ export declare const normalizeProviderError: (providerId: ProviderId, error: unknown, options?: ProviderErrorNormalizationOptions) => NormalizedProviderError;
22
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,MAAM,wBAAwB,GAChC,YAAY,GACZ,SAAS,GACT,cAAc,GACd,SAAS,GACT,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,wBAAwB,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iCAAiC;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AA6CD,eAAO,MAAM,wBAAwB,eACvB,MAAM,GAAG,SAAS,QACxB,MAAM,GAAG,SAAS,YACf,iCAAiC,KACzC,OAYF,CAAC;AAEF,eAAO,MAAM,sBAAsB,eACrB,UAAU,SACf,OAAO,YACL,iCAAiC,KACzC,uBAsCF,CAAC"}
package/dist/errors.js ADDED
@@ -0,0 +1,85 @@
1
+ const defaultRetryableStatusCodes = [408, 409, 425, 429, 500, 502, 503, 504];
2
+ const defaultRetryableCodes = [
3
+ 'rate_limit',
4
+ 'rate_limit_exceeded',
5
+ 'timeout',
6
+ 'server_error',
7
+ 'overloaded',
8
+ 'temporarily_unavailable',
9
+ ];
10
+ const asRecord = (value) => {
11
+ return value && typeof value === 'object' ? value : null;
12
+ };
13
+ const readString = (record, key) => {
14
+ const value = record?.[key];
15
+ return typeof value === 'string' && value.trim() ? value : undefined;
16
+ };
17
+ const readNumber = (record, key) => {
18
+ const value = record?.[key];
19
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
20
+ };
21
+ const nestedErrorRecord = (record) => {
22
+ return asRecord(record?.error) || asRecord(record?.response);
23
+ };
24
+ const inferRetryReason = (statusCode, code) => {
25
+ const normalizedCode = code?.toLowerCase();
26
+ if (statusCode === 429 || normalizedCode?.includes('rate'))
27
+ return 'rate_limit';
28
+ if (statusCode === 408 || normalizedCode?.includes('timeout'))
29
+ return 'timeout';
30
+ if (statusCode === 409 || statusCode === 425 || normalizedCode?.includes('overload')) {
31
+ return 'overloaded';
32
+ }
33
+ if (typeof statusCode === 'number' && statusCode >= 500)
34
+ return 'server_error';
35
+ if (normalizedCode?.includes('network') || normalizedCode === 'fetch_error')
36
+ return 'network';
37
+ return undefined;
38
+ };
39
+ export const isRetryableProviderError = (statusCode, code, options = {}) => {
40
+ const retryableStatusCodes = options.retryableStatusCodes ?? defaultRetryableStatusCodes;
41
+ const retryableCodes = options.retryableCodes ?? defaultRetryableCodes;
42
+ const nonRetryableCodes = options.nonRetryableCodes ?? [];
43
+ if (code && nonRetryableCodes.includes(code))
44
+ return false;
45
+ if (typeof statusCode === 'number' && retryableStatusCodes.includes(statusCode))
46
+ return true;
47
+ if (!code)
48
+ return false;
49
+ const normalizedCode = code.toLowerCase();
50
+ return retryableCodes.some((retryableCode) => normalizedCode.includes(retryableCode));
51
+ };
52
+ export const normalizeProviderError = (providerId, error, options = {}) => {
53
+ const record = asRecord(error);
54
+ const nested = nestedErrorRecord(record);
55
+ const statusCode = readNumber(record, 'statusCode') ||
56
+ readNumber(record, 'status') ||
57
+ readNumber(nested, 'statusCode') ||
58
+ readNumber(nested, 'status');
59
+ const code = readString(record, 'code') ||
60
+ readString(record, 'type') ||
61
+ readString(nested, 'code') ||
62
+ readString(nested, 'status');
63
+ const message = readString(record, 'message') ||
64
+ readString(nested, 'message') ||
65
+ (error instanceof Error && error.message) ||
66
+ options.defaultMessage ||
67
+ `${providerId} request failed`;
68
+ const retryAfterSeconds = readNumber(record, 'retryAfter') || readNumber(nested, 'retryAfter');
69
+ const retryAfterMs = readNumber(record, 'retryAfterMs') ||
70
+ readNumber(nested, 'retryAfterMs') ||
71
+ (typeof retryAfterSeconds === 'number' ? retryAfterSeconds * 1000 : undefined);
72
+ const retryable = isRetryableProviderError(statusCode, code, options);
73
+ const retryReason = retryable ? inferRetryReason(statusCode, code) ?? 'unknown' : undefined;
74
+ return {
75
+ providerId,
76
+ message,
77
+ retryable,
78
+ ...(code ? { code } : {}),
79
+ ...(retryReason ? { retryReason } : {}),
80
+ ...(retryAfterMs ? { retryAfterMs } : {}),
81
+ ...(typeof statusCode === 'number' ? { statusCode } : {}),
82
+ ...(error instanceof Error || record ? { cause: error } : {}),
83
+ };
84
+ };
85
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AA6BA,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AACtF,MAAM,qBAAqB,GAAG;IAC5B,YAAY;IACZ,qBAAqB;IACrB,SAAS;IACT,cAAc;IACd,YAAY;IACZ,yBAAyB;CACjB,CAAC;AAEX,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAkC,EAAE;IAClE,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxF,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAsC,EAAE,GAAW,EAAsB,EAAE;IAC7F,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAsC,EAAE,GAAW,EAAsB,EAAE;IAC7F,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,MAAsC,EAAkC,EAAE;IACnG,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CACvB,UAA8B,EAC9B,IAAwB,EACc,EAAE;IACxC,MAAM,cAAc,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC;IAC3C,IAAI,UAAU,KAAK,GAAG,IAAI,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,YAAY,CAAC;IAChF,IAAI,UAAU,KAAK,GAAG,IAAI,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAChF,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACrF,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,cAAc,CAAC;IAC/E,IAAI,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,cAAc,KAAK,aAAa;QAAE,OAAO,SAAS,CAAC;IAC9F,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,UAA8B,EAC9B,IAAwB,EACxB,UAA6C,EAAE,EACtC,EAAE;IACX,MAAM,oBAAoB,GACxB,OAAO,CAAC,oBAAoB,IAAI,2BAA2B,CAAC;IAC9D,MAAM,cAAc,GAAsB,OAAO,CAAC,cAAc,IAAI,qBAAqB,CAAC;IAC1F,MAAM,iBAAiB,GAAsB,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAE7E,IAAI,IAAI,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7F,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC1C,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;AACxF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,UAAsB,EACtB,KAAc,EACd,UAA6C,EAAE,EACtB,EAAE;IAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,UAAU,GACd,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;QAChC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC5B,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;QAChC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,MAAM,IAAI,GACR,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,MAAM,OAAO,GACX,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC;QAC7B,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC;QAC7B,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;QACzC,OAAO,CAAC,cAAc;QACtB,GAAG,UAAU,iBAAiB,CAAC;IACjC,MAAM,iBAAiB,GACrB,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,YAAY,GAChB,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC;QAClC,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC;QAClC,CAAC,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,wBAAwB,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5F,OAAO;QACL,UAAU;QACV,OAAO;QACP,SAAS;QACT,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC,CAAC"}