adonis-ai-kit 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +74 -0
- package/README.md +77 -5
- package/dist/src/acp/acp_agents.d.ts +25 -11
- package/dist/src/acp/acp_agents.d.ts.map +1 -1
- package/dist/src/acp/acp_agents.js +62 -38
- package/dist/src/acp/acp_agents.js.map +1 -1
- package/dist/src/acp/provider.d.ts +14 -4
- package/dist/src/acp/provider.d.ts.map +1 -1
- package/dist/src/acp/provider.js +23 -2
- package/dist/src/acp/provider.js.map +1 -1
- package/dist/src/acp/types.d.ts +21 -0
- package/dist/src/acp/types.d.ts.map +1 -1
- package/dist/src/agents/loader.d.ts +3 -3
- package/dist/src/agents/loader.d.ts.map +1 -1
- package/dist/src/agents/loader.js.map +1 -1
- package/dist/src/ai_manager.d.ts +12 -8
- package/dist/src/ai_manager.d.ts.map +1 -1
- package/dist/src/ai_manager.js +128 -15
- package/dist/src/ai_manager.js.map +1 -1
- package/dist/src/budget/types.d.ts +1 -6
- package/dist/src/budget/types.d.ts.map +1 -1
- package/dist/src/catalog/source.d.ts +18 -3
- package/dist/src/catalog/source.d.ts.map +1 -1
- package/dist/src/catalog/source.js +15 -5
- package/dist/src/catalog/source.js.map +1 -1
- package/dist/src/circuit_breaker.d.ts +21 -0
- package/dist/src/circuit_breaker.d.ts.map +1 -1
- package/dist/src/circuit_breaker.js +64 -19
- package/dist/src/circuit_breaker.js.map +1 -1
- package/dist/src/error_classifier.d.ts +34 -1
- package/dist/src/error_classifier.d.ts.map +1 -1
- package/dist/src/error_classifier.js +159 -33
- package/dist/src/error_classifier.js.map +1 -1
- package/dist/src/guard/registry.d.ts +6 -0
- package/dist/src/guard/registry.d.ts.map +1 -1
- package/dist/src/guard/registry.js +12 -2
- package/dist/src/guard/registry.js.map +1 -1
- package/dist/src/guard/types.d.ts +6 -7
- package/dist/src/guard/types.d.ts.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/logger.d.ts +7 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +2 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/models/catalog_resolver.d.ts +24 -0
- package/dist/src/models/catalog_resolver.d.ts.map +1 -0
- package/dist/src/models/catalog_resolver.js +66 -0
- package/dist/src/models/catalog_resolver.js.map +1 -0
- package/dist/src/models/index.d.ts +14 -0
- package/dist/src/models/index.d.ts.map +1 -0
- package/dist/src/models/index.js +8 -0
- package/dist/src/models/index.js.map +1 -0
- package/dist/src/models/keys.d.ts +9 -0
- package/dist/src/models/keys.d.ts.map +1 -0
- package/dist/src/models/keys.js +12 -0
- package/dist/src/models/keys.js.map +1 -0
- package/dist/src/models/language_model_factory.d.ts +44 -0
- package/dist/src/models/language_model_factory.d.ts.map +1 -0
- package/dist/src/models/language_model_factory.js +193 -0
- package/dist/src/models/language_model_factory.js.map +1 -0
- package/dist/src/models/model_chain.d.ts +58 -0
- package/dist/src/models/model_chain.d.ts.map +1 -0
- package/dist/src/models/model_chain.js +144 -0
- package/dist/src/models/model_chain.js.map +1 -0
- package/dist/src/models/model_ref.d.ts +12 -0
- package/dist/src/models/model_ref.d.ts.map +1 -0
- package/dist/src/models/model_ref.js +33 -0
- package/dist/src/models/model_ref.js.map +1 -0
- package/dist/src/models/protocols.d.ts +6 -0
- package/dist/src/models/protocols.d.ts.map +1 -0
- package/dist/src/models/protocols.js +33 -0
- package/dist/src/models/protocols.js.map +1 -0
- package/dist/src/models/provider_factories.d.ts +19 -0
- package/dist/src/models/provider_factories.d.ts.map +1 -0
- package/dist/src/models/provider_factories.js +70 -0
- package/dist/src/models/provider_factories.js.map +1 -0
- package/dist/src/models/types.d.ts +17 -0
- package/dist/src/models/types.d.ts.map +1 -0
- package/dist/src/models/types.js +2 -0
- package/dist/src/models/types.js.map +1 -0
- package/dist/src/types.d.ts +46 -3
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +70 -4
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { LanguageModel } from 'ai';
|
|
2
|
+
import type { AcpPermissionPolicy } from '../acp/types.js';
|
|
3
|
+
import type { ConfirmationService } from '../guard/confirmation.js';
|
|
4
|
+
import type { Logger } from '../logger.js';
|
|
5
|
+
import { ProviderFactoryRegistry } from './provider_factories.js';
|
|
6
|
+
import type { ResolvedModel } from './types.js';
|
|
7
|
+
export interface LanguageModelFactoryOptions {
|
|
8
|
+
factories?: ProviderFactoryRegistry;
|
|
9
|
+
/** Per-request fetch timeout. Default: 180_000 */
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
logger?: Logger;
|
|
12
|
+
acp?: {
|
|
13
|
+
permissionPolicy?: AcpPermissionPolicy;
|
|
14
|
+
confirmation?: ConfirmationService;
|
|
15
|
+
/** Pass the full server environment to agent processes. Default: false (allowlisted variables only). */
|
|
16
|
+
inheritEnv?: boolean;
|
|
17
|
+
/** Reuse one driver (and agent process) per command and cwd. Default: true. */
|
|
18
|
+
shareDriver?: boolean;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export declare class LanguageModelFactory {
|
|
22
|
+
private readonly factories;
|
|
23
|
+
private readonly timeoutMs;
|
|
24
|
+
private readonly logger?;
|
|
25
|
+
private readonly acp;
|
|
26
|
+
private readonly drivers;
|
|
27
|
+
/** Unshared drivers with a call in flight; tracked so `shutdown()` can stop them. Emptied as calls end. */
|
|
28
|
+
private readonly unsharedDrivers;
|
|
29
|
+
constructor(options?: LanguageModelFactoryOptions);
|
|
30
|
+
create(model: ResolvedModel): Promise<LanguageModel>;
|
|
31
|
+
/** Stops every ACP agent process started by this factory. */
|
|
32
|
+
shutdown(): Promise<void>;
|
|
33
|
+
private createAcp;
|
|
34
|
+
/**
|
|
35
|
+
* Wraps a per-call model so its driver is tracked only while a call is in flight (so shutdown()
|
|
36
|
+
* can stop it) and released when the last call ends (result, error, stream end or cancel). A model
|
|
37
|
+
* that is never called is not tracked, so it is collected together with its driver.
|
|
38
|
+
*/
|
|
39
|
+
private releaseWhenCallEnds;
|
|
40
|
+
/** Re-exposes a stream, calling `done` exactly once when it ends, errors or is cancelled. */
|
|
41
|
+
private endWith;
|
|
42
|
+
private createTimeoutFetch;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=language_model_factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language_model_factory.d.ts","sourceRoot":"","sources":["../../../src/models/language_model_factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAEvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAE1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,uBAAuB,CAAA;IACnC,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE;QACJ,gBAAgB,CAAC,EAAE,mBAAmB,CAAA;QACtC,YAAY,CAAC,EAAE,mBAAmB,CAAA;QAClC,wGAAwG;QACxG,UAAU,CAAC,EAAE,OAAO,CAAA;QACpB,+EAA+E;QAC/E,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB,CAAA;CACF;AAqBD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoC;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,2GAA2G;IAC3G,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuB;gBAE3C,OAAO,GAAE,2BAAgC;IAO/C,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAuB1D,6DAA6D;IACvD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAOjB,SAAS;IAiCvB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA8C3B,6FAA6F;IAC7F,OAAO,CAAC,OAAO;IAiCf,OAAO,CAAC,kBAAkB;CAqB3B"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { AcpDriver } from '../acp/provider.js';
|
|
2
|
+
import { ProviderConfigError } from '../errors.js';
|
|
3
|
+
import { ProviderFactoryRegistry } from './provider_factories.js';
|
|
4
|
+
const ACP_NPM = '@mcpc-tech/acp-ai-provider';
|
|
5
|
+
const DEFAULT_TIMEOUT_MS = 180_000;
|
|
6
|
+
function redactHeaders(headers) {
|
|
7
|
+
if (!headers)
|
|
8
|
+
return undefined;
|
|
9
|
+
return Object.fromEntries(Object.entries(headers).map(([key, value]) => {
|
|
10
|
+
const lower = key.toLowerCase();
|
|
11
|
+
const sensitive = lower.includes('authorization') || lower.includes('api-key') || lower.includes('x-api');
|
|
12
|
+
return [key, sensitive ? '***' : value];
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
function requestUrl(input) {
|
|
16
|
+
return typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
|
|
17
|
+
}
|
|
18
|
+
export class LanguageModelFactory {
|
|
19
|
+
factories;
|
|
20
|
+
timeoutMs;
|
|
21
|
+
logger;
|
|
22
|
+
acp;
|
|
23
|
+
drivers = new Map();
|
|
24
|
+
/** Unshared drivers with a call in flight; tracked so `shutdown()` can stop them. Emptied as calls end. */
|
|
25
|
+
unsharedDrivers = new Set();
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
this.factories = options.factories ?? new ProviderFactoryRegistry();
|
|
28
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
29
|
+
this.logger = options.logger;
|
|
30
|
+
this.acp = options.acp;
|
|
31
|
+
}
|
|
32
|
+
async create(model) {
|
|
33
|
+
if (model.npm === ACP_NPM)
|
|
34
|
+
return this.createAcp(model);
|
|
35
|
+
if (!model.npm) {
|
|
36
|
+
throw new ProviderConfigError(model.providerID, `Model "${model.modelID}" has no provider package`);
|
|
37
|
+
}
|
|
38
|
+
const factory = await this.factories.get(model.npm);
|
|
39
|
+
this.logger?.info(`[LLM Provider] Creating SDK for ${model.providerID}/${model.modelID} (npm=${model.npm})`);
|
|
40
|
+
this.logger?.info(`[LLM Provider] Base URL: ${model.apiUrl}`);
|
|
41
|
+
this.logger?.info(`[LLM Provider] Headers: ${JSON.stringify(redactHeaders(model.headers))}`);
|
|
42
|
+
return factory({
|
|
43
|
+
name: model.providerID,
|
|
44
|
+
apiKey: model.apiKey,
|
|
45
|
+
baseURL: model.apiUrl,
|
|
46
|
+
headers: model.headers,
|
|
47
|
+
fetch: this.createTimeoutFetch(),
|
|
48
|
+
}).languageModel(model.modelID);
|
|
49
|
+
}
|
|
50
|
+
/** Stops every ACP agent process started by this factory. */
|
|
51
|
+
async shutdown() {
|
|
52
|
+
const drivers = [...this.drivers.values(), ...this.unsharedDrivers];
|
|
53
|
+
this.drivers.clear();
|
|
54
|
+
this.unsharedDrivers.clear();
|
|
55
|
+
await Promise.all(drivers.map((driver) => driver.shutdown()));
|
|
56
|
+
}
|
|
57
|
+
async createAcp(model) {
|
|
58
|
+
const runtime = model.acpConfig;
|
|
59
|
+
if (!runtime) {
|
|
60
|
+
throw new ProviderConfigError(model.providerID, `ACP model "${model.modelID}" requires runtime config (resolve it with buildAcpRuntimeConfig)`);
|
|
61
|
+
}
|
|
62
|
+
const agentId = model.acpAgentId ?? model.modelID;
|
|
63
|
+
this.logger?.info(`[LLM Provider] Creating ACP agent for ${model.providerID}/${model.modelID}`);
|
|
64
|
+
this.logger?.info(`[LLM Provider] ACP command: ${runtime.command} (cwd: ${runtime.cwd})`);
|
|
65
|
+
const key = `${runtime.command}::${runtime.cwd}`;
|
|
66
|
+
const shared = this.acp?.shareDriver !== false;
|
|
67
|
+
let driver = shared ? this.drivers.get(key) : undefined;
|
|
68
|
+
if (!driver) {
|
|
69
|
+
driver = new AcpDriver(model.providerID, {
|
|
70
|
+
driver: 'acp',
|
|
71
|
+
agentId,
|
|
72
|
+
permissionPolicy: this.acp?.permissionPolicy ?? 'ask',
|
|
73
|
+
inheritEnv: this.acp?.inheritEnv ?? false,
|
|
74
|
+
}, { logger: this.logger, confirmation: this.acp?.confirmation, runtime });
|
|
75
|
+
if (shared)
|
|
76
|
+
this.drivers.set(key, driver);
|
|
77
|
+
}
|
|
78
|
+
const languageModel = await driver.getModel(agentId);
|
|
79
|
+
return shared ? languageModel : this.releaseWhenCallEnds(driver, languageModel);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Wraps a per-call model so its driver is tracked only while a call is in flight (so shutdown()
|
|
83
|
+
* can stop it) and released when the last call ends (result, error, stream end or cancel). A model
|
|
84
|
+
* that is never called is not tracked, so it is collected together with its driver.
|
|
85
|
+
*/
|
|
86
|
+
releaseWhenCallEnds(driver, model) {
|
|
87
|
+
if (typeof model !== 'object' || model === null)
|
|
88
|
+
return model;
|
|
89
|
+
let inFlight = 0;
|
|
90
|
+
const begin = () => {
|
|
91
|
+
inFlight++;
|
|
92
|
+
this.unsharedDrivers.add(driver);
|
|
93
|
+
};
|
|
94
|
+
// The ACP model cleans up its own agent process at the end of each turn. The driver is not shut
|
|
95
|
+
// down here: that would drop its provider, and a later step of the same call would then start a
|
|
96
|
+
// process that factory.shutdown() could no longer reach.
|
|
97
|
+
const end = () => {
|
|
98
|
+
if (--inFlight > 0)
|
|
99
|
+
return;
|
|
100
|
+
this.unsharedDrivers.delete(driver);
|
|
101
|
+
};
|
|
102
|
+
return new Proxy(model, {
|
|
103
|
+
get: (target, prop) => {
|
|
104
|
+
const value = Reflect.get(target, prop, target);
|
|
105
|
+
if (prop === 'doGenerate' && typeof value === 'function') {
|
|
106
|
+
return async (...args) => {
|
|
107
|
+
begin();
|
|
108
|
+
try {
|
|
109
|
+
return await value.apply(target, args);
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
end();
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (prop === 'doStream' && typeof value === 'function') {
|
|
117
|
+
return async (...args) => {
|
|
118
|
+
begin();
|
|
119
|
+
let result;
|
|
120
|
+
try {
|
|
121
|
+
result = await value.apply(target, args);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
end();
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
return { ...result, stream: this.endWith(result.stream, end) };
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/** Re-exposes a stream, calling `done` exactly once when it ends, errors or is cancelled. */
|
|
135
|
+
endWith(source, done) {
|
|
136
|
+
const reader = source.getReader();
|
|
137
|
+
let finished = false;
|
|
138
|
+
const finish = () => {
|
|
139
|
+
if (finished)
|
|
140
|
+
return;
|
|
141
|
+
finished = true;
|
|
142
|
+
done();
|
|
143
|
+
};
|
|
144
|
+
return new ReadableStream({
|
|
145
|
+
async pull(controller) {
|
|
146
|
+
try {
|
|
147
|
+
const chunk = await reader.read();
|
|
148
|
+
if (chunk.done) {
|
|
149
|
+
finish();
|
|
150
|
+
controller.close();
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
controller.enqueue(chunk.value);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
finish();
|
|
158
|
+
controller.error(err);
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
async cancel(reason) {
|
|
162
|
+
try {
|
|
163
|
+
await reader.cancel(reason);
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
finish();
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
createTimeoutFetch() {
|
|
172
|
+
const { timeoutMs, logger } = this;
|
|
173
|
+
return async (input, init) => {
|
|
174
|
+
const url = requestUrl(input).slice(0, 120);
|
|
175
|
+
const method = init?.method || 'POST';
|
|
176
|
+
const startMs = Date.now();
|
|
177
|
+
const timeout = AbortSignal.timeout(timeoutMs);
|
|
178
|
+
const signal = init?.signal ? AbortSignal.any([timeout, init.signal]) : timeout;
|
|
179
|
+
logger?.debug?.(`[LLM HTTP] ${method} ${url} | timeout=${timeoutMs}ms`);
|
|
180
|
+
try {
|
|
181
|
+
const response = await fetch(input, { ...init, signal });
|
|
182
|
+
logger?.debug?.(`[LLM HTTP] ${response.status} ${method} ${url} | ${Date.now() - startMs}ms`);
|
|
183
|
+
return response;
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
187
|
+
logger?.error(`[LLM HTTP] FAILED ${method} ${url} | ${Date.now() - startMs}ms | ${msg}`);
|
|
188
|
+
throw err;
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=language_model_factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language_model_factory.js","sourceRoot":"","sources":["../../../src/models/language_model_factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { CircuitBreaker } from '../circuit_breaker.js';
|
|
2
|
+
import { type ErrorClass } from '../error_classifier.js';
|
|
3
|
+
import type { Logger } from '../logger.js';
|
|
4
|
+
import type { ModelResolver } from './catalog_resolver.js';
|
|
5
|
+
import type { ResolvedModel } from './types.js';
|
|
6
|
+
export type ChainCandidate = {
|
|
7
|
+
kind: 'resolved';
|
|
8
|
+
model: ResolvedModel;
|
|
9
|
+
key: string;
|
|
10
|
+
} | {
|
|
11
|
+
kind: 'ref';
|
|
12
|
+
ref: string;
|
|
13
|
+
key: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Builds the ordered candidate list. A non-empty `chain` is authoritative: it already encodes the
|
|
17
|
+
* caller's chosen order, so `primary` and `defaults` are not appended (falling through to a model
|
|
18
|
+
* nobody picked would trade a visible failure for a silent one). An empty chain counts as absent.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildChainCandidates(input: {
|
|
21
|
+
chain?: ResolvedModel[];
|
|
22
|
+
primary?: ResolvedModel | string;
|
|
23
|
+
defaults?: string[];
|
|
24
|
+
}): ChainCandidate[];
|
|
25
|
+
export interface FallbackEvent {
|
|
26
|
+
fromModel: string;
|
|
27
|
+
toModel: string;
|
|
28
|
+
error: unknown;
|
|
29
|
+
errorClass: ErrorClass;
|
|
30
|
+
}
|
|
31
|
+
export interface ChainAttempt {
|
|
32
|
+
model: ResolvedModel;
|
|
33
|
+
key: string;
|
|
34
|
+
isFallback: boolean;
|
|
35
|
+
/** Call once a tool has run: the chain will not fall back after that, so side effects are not repeated. */
|
|
36
|
+
markToolsExecuted(): void;
|
|
37
|
+
}
|
|
38
|
+
export interface ModelChainOptions {
|
|
39
|
+
breaker?: CircuitBreaker;
|
|
40
|
+
/** Required when a candidate is a `ref`. */
|
|
41
|
+
resolver?: ModelResolver;
|
|
42
|
+
abortSignal?: AbortSignal;
|
|
43
|
+
/** Exceptions thrown or rejected by the handler are swallowed (logged as a warning); it is not awaited. */
|
|
44
|
+
onFallback?: (event: FallbackEvent) => unknown;
|
|
45
|
+
logger?: Logger;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Runs `attempt` against each candidate in order until one succeeds. Each candidate is guarded by a
|
|
49
|
+
* per-credential circuit breaker; a retryable failure, or a candidate that cannot be attempted (missing provider
|
|
50
|
+
* package, config error, open breaker), moves on to the next candidate; anything else, any failure after tools ran
|
|
51
|
+
* and any caller abort is thrown. An exhausted chain rethrows the last error.
|
|
52
|
+
*/
|
|
53
|
+
export declare function runModelChain<T>(candidates: ChainCandidate[], attempt: (a: ChainAttempt) => Promise<T>, options?: ModelChainOptions): Promise<{
|
|
54
|
+
result: T;
|
|
55
|
+
model: ResolvedModel;
|
|
56
|
+
key: string;
|
|
57
|
+
}>;
|
|
58
|
+
//# sourceMappingURL=model_chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model_chain.d.ts","sourceRoot":"","sources":["../../../src/models/model_chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7C;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB,GAAG,cAAc,EAAE,CAoCnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,OAAO,CAAA;IACnB,2GAA2G;IAC3G,iBAAiB,IAAI,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,2GAA2G;IAC3G,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAA;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,UAAU,EAAE,cAAc,EAAE,EAC5B,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,EACxC,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA4F3D"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { classifyError } from '../error_classifier.js';
|
|
2
|
+
import { ProviderConfigError, ProviderUnavailableError } from '../errors.js';
|
|
3
|
+
import { breakerKeyFor, modelKeyFor } from './keys.js';
|
|
4
|
+
/**
|
|
5
|
+
* Builds the ordered candidate list. A non-empty `chain` is authoritative: it already encodes the
|
|
6
|
+
* caller's chosen order, so `primary` and `defaults` are not appended (falling through to a model
|
|
7
|
+
* nobody picked would trade a visible failure for a silent one). An empty chain counts as absent.
|
|
8
|
+
*/
|
|
9
|
+
export function buildChainCandidates(input) {
|
|
10
|
+
const candidates = [];
|
|
11
|
+
if (input.chain && input.chain.length > 0) {
|
|
12
|
+
// De-duplicate on ENTRY identity, not breaker identity: one credential legitimately appears
|
|
13
|
+
// once per model it serves, and those entries share a breaker (the credential is the failure domain).
|
|
14
|
+
const seenEntries = new Set();
|
|
15
|
+
for (const model of input.chain) {
|
|
16
|
+
const key = breakerKeyFor(model);
|
|
17
|
+
const entryId = `${key}|${modelKeyFor(model)}`;
|
|
18
|
+
if (seenEntries.has(entryId))
|
|
19
|
+
continue;
|
|
20
|
+
seenEntries.add(entryId);
|
|
21
|
+
candidates.push({ kind: 'resolved', model, key });
|
|
22
|
+
}
|
|
23
|
+
return candidates;
|
|
24
|
+
}
|
|
25
|
+
const seenKeys = new Set();
|
|
26
|
+
if (typeof input.primary === 'string') {
|
|
27
|
+
if (input.primary) {
|
|
28
|
+
candidates.push({ kind: 'ref', ref: input.primary, key: input.primary });
|
|
29
|
+
seenKeys.add(input.primary);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else if (input.primary) {
|
|
33
|
+
const key = breakerKeyFor(input.primary);
|
|
34
|
+
candidates.push({ kind: 'resolved', model: input.primary, key });
|
|
35
|
+
seenKeys.add(key);
|
|
36
|
+
}
|
|
37
|
+
for (const ref of input.defaults ?? []) {
|
|
38
|
+
if (!ref || seenKeys.has(ref))
|
|
39
|
+
continue;
|
|
40
|
+
candidates.push({ kind: 'ref', ref, key: ref });
|
|
41
|
+
seenKeys.add(ref);
|
|
42
|
+
}
|
|
43
|
+
return candidates;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Runs `attempt` against each candidate in order until one succeeds. Each candidate is guarded by a
|
|
47
|
+
* per-credential circuit breaker; a retryable failure, or a candidate that cannot be attempted (missing provider
|
|
48
|
+
* package, config error, open breaker), moves on to the next candidate; anything else, any failure after tools ran
|
|
49
|
+
* and any caller abort is thrown. An exhausted chain rethrows the last error.
|
|
50
|
+
*/
|
|
51
|
+
export async function runModelChain(candidates, attempt, options = {}) {
|
|
52
|
+
const { breaker, resolver, abortSignal, logger } = options;
|
|
53
|
+
const unresolved = candidates.find((c) => c.kind === 'ref');
|
|
54
|
+
if (unresolved && !resolver) {
|
|
55
|
+
throw new ProviderConfigError('model-chain', `a resolver is required to resolve "${unresolved.ref}"`);
|
|
56
|
+
}
|
|
57
|
+
let lastError;
|
|
58
|
+
let hasError = false;
|
|
59
|
+
let attempted = 0;
|
|
60
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
61
|
+
const candidate = candidates[i];
|
|
62
|
+
// Acquired synchronously, before the first await of this attempt, so concurrent callers
|
|
63
|
+
// cannot both claim the same half-open probe slot.
|
|
64
|
+
let permit = null;
|
|
65
|
+
if (breaker) {
|
|
66
|
+
permit = breaker.acquire(candidate.key);
|
|
67
|
+
if (!permit) {
|
|
68
|
+
logger?.warn(`[model-chain] circuit breaker is not accepting calls for ${candidate.key}, skipping`);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
let model;
|
|
74
|
+
if (candidate.kind === 'resolved') {
|
|
75
|
+
model = candidate.model;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
model = await resolver.resolve(candidate.ref);
|
|
79
|
+
}
|
|
80
|
+
attempted++;
|
|
81
|
+
let toolsExecuted = false;
|
|
82
|
+
try {
|
|
83
|
+
const result = await attempt({
|
|
84
|
+
model,
|
|
85
|
+
key: candidate.key,
|
|
86
|
+
isFallback: attempted > 1,
|
|
87
|
+
markToolsExecuted: () => {
|
|
88
|
+
toolsExecuted = true;
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
permit?.success();
|
|
92
|
+
return { result, model, key: candidate.key };
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
lastError = error;
|
|
96
|
+
hasError = true;
|
|
97
|
+
const classification = classifyError(error, abortSignal);
|
|
98
|
+
if (classification.countsAsFailure)
|
|
99
|
+
permit?.failure(error);
|
|
100
|
+
else
|
|
101
|
+
permit?.release();
|
|
102
|
+
const next = nextAvailable(candidates, i + 1, breaker);
|
|
103
|
+
const canFallBack = classification.kind === 'retryable' || classification.kind === 'skip';
|
|
104
|
+
if (!canFallBack || toolsExecuted || !next) {
|
|
105
|
+
logger?.warn(`[model-chain] ${candidate.key} failed with ${classification.errorClass}; not falling back ` +
|
|
106
|
+
`(kind=${classification.kind}, toolsExecuted=${toolsExecuted}, hasNext=${Boolean(next)})`);
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
logger?.warn(`[model-chain] ${candidate.key} failed with ${classification.errorClass}; falling back to ${next.key}`);
|
|
110
|
+
try {
|
|
111
|
+
const pending = options.onFallback?.({
|
|
112
|
+
fromModel: candidate.key,
|
|
113
|
+
toModel: next.key,
|
|
114
|
+
error,
|
|
115
|
+
errorClass: classification.errorClass,
|
|
116
|
+
});
|
|
117
|
+
if (pending && typeof pending.then === 'function') {
|
|
118
|
+
Promise.resolve(pending).catch((handlerError) => {
|
|
119
|
+
logger?.warn(`[model-chain] onFallback handler rejected: ${String(handlerError)}`);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (handlerError) {
|
|
124
|
+
logger?.warn(`[model-chain] onFallback handler threw: ${String(handlerError)}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
// Safety net for every exit path; a no-op once the permit has been settled.
|
|
130
|
+
permit?.release();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (hasError)
|
|
134
|
+
throw lastError;
|
|
135
|
+
throw new ProviderUnavailableError('model-chain', 'no candidate model is available');
|
|
136
|
+
}
|
|
137
|
+
function nextAvailable(candidates, from, breaker) {
|
|
138
|
+
for (let i = from; i < candidates.length; i++) {
|
|
139
|
+
if (!breaker || breaker.isAvailable(candidates[i].key))
|
|
140
|
+
return candidates[i];
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=model_chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model_chain.js","sourceRoot":"","sources":["../../../src/models/model_chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ParseModelRefOptions {
|
|
2
|
+
modelRef?: string;
|
|
3
|
+
explicitProvider?: string;
|
|
4
|
+
knownProviderIds: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface ParsedModelRef {
|
|
7
|
+
providerId: string;
|
|
8
|
+
modelId: string;
|
|
9
|
+
wasProviderPrefixed: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseModelRef({ modelRef, explicitProvider, knownProviderIds, }: ParseModelRefOptions): ParsedModelRef;
|
|
12
|
+
//# sourceMappingURL=model_ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model_ref.d.ts","sourceRoot":"","sources":["../../../src/models/model_ref.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,mBAAmB,EAAE,OAAO,CAAA;CAC7B;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,GACjB,EAAE,oBAAoB,GAAG,cAAc,CAsCvC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export function parseModelRef({ modelRef, explicitProvider, knownProviderIds, }) {
|
|
2
|
+
const ref = modelRef?.trim();
|
|
3
|
+
const provider = explicitProvider?.trim();
|
|
4
|
+
if (provider) {
|
|
5
|
+
if (!knownProviderIds.includes(provider)) {
|
|
6
|
+
throw new Error(`Unknown provider: ${provider}`);
|
|
7
|
+
}
|
|
8
|
+
const providerPrefix = `${provider}/`;
|
|
9
|
+
if (ref?.startsWith(providerPrefix)) {
|
|
10
|
+
return {
|
|
11
|
+
providerId: provider,
|
|
12
|
+
modelId: ref.slice(providerPrefix.length),
|
|
13
|
+
wasProviderPrefixed: true,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (ref) {
|
|
17
|
+
return { providerId: provider, modelId: ref, wasProviderPrefixed: false };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (!ref) {
|
|
21
|
+
throw new Error('A model reference or an explicit provider is required');
|
|
22
|
+
}
|
|
23
|
+
const [candidateProvider, ...modelParts] = ref.split('/');
|
|
24
|
+
if (!candidateProvider || !knownProviderIds.includes(candidateProvider)) {
|
|
25
|
+
throw new Error(`Unknown provider: ${candidateProvider || ref}`);
|
|
26
|
+
}
|
|
27
|
+
const modelId = modelParts.join('/');
|
|
28
|
+
if (!modelId) {
|
|
29
|
+
throw new Error(`Model id is required for provider: ${candidateProvider}`);
|
|
30
|
+
}
|
|
31
|
+
return { providerId: candidateProvider, modelId, wasProviderPrefixed: true };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=model_ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model_ref.js","sourceRoot":"","sources":["../../../src/models/model_ref.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,GACK;IACrB,MAAM,GAAG,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC5B,MAAM,QAAQ,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAA;IAEzC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,cAAc,GAAG,GAAG,QAAQ,GAAG,CAAA;QACrC,IAAI,GAAG,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACpC,OAAO;gBACL,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;gBACzC,mBAAmB,EAAE,IAAI;aAC1B,CAAA;QACH,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAA;QAC3E,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,CAAC,iBAAiB,EAAE,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzD,IAAI,CAAC,iBAAiB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,qBAAqB,iBAAiB,IAAI,GAAG,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,iBAAiB,EAAE,CAAC,CAAA;IAC5E,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAA;AAC9E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocols.d.ts","sourceRoot":"","sources":["../../../src/models/protocols.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuB5D,CAAA;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,GAAG,MAAM,CAOT"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const PROTOCOL_TO_NPM = {
|
|
2
|
+
'openai': '@ai-sdk/openai',
|
|
3
|
+
'anthropic': '@ai-sdk/anthropic',
|
|
4
|
+
'openai-compatible': '@ai-sdk/openai-compatible',
|
|
5
|
+
'openrouter': '@openrouter/ai-sdk-provider',
|
|
6
|
+
'google': '@ai-sdk/google',
|
|
7
|
+
'vertex': '@ai-sdk/google-vertex',
|
|
8
|
+
'vertex-anthropic': '@ai-sdk/google-vertex/anthropic',
|
|
9
|
+
'azure': '@ai-sdk/azure',
|
|
10
|
+
'groq': '@ai-sdk/groq',
|
|
11
|
+
'mistral': '@ai-sdk/mistral',
|
|
12
|
+
'cerebras': '@ai-sdk/cerebras',
|
|
13
|
+
'deepinfra': '@ai-sdk/deepinfra',
|
|
14
|
+
'togetherai': '@ai-sdk/togetherai',
|
|
15
|
+
'cohere': '@ai-sdk/cohere',
|
|
16
|
+
'xai': '@ai-sdk/xai',
|
|
17
|
+
'perplexity': '@ai-sdk/perplexity',
|
|
18
|
+
'bedrock': '@ai-sdk/amazon-bedrock',
|
|
19
|
+
'gateway': '@ai-sdk/gateway',
|
|
20
|
+
'vercel': '@ai-sdk/vercel',
|
|
21
|
+
'gitlab': '@gitlab/gitlab-ai-provider',
|
|
22
|
+
'qwencode': '@ai-sdk/openai-compatible',
|
|
23
|
+
'acp': '@mcpc-tech/acp-ai-provider',
|
|
24
|
+
};
|
|
25
|
+
export function resolveProviderNpm(config) {
|
|
26
|
+
if (config.npmPackage)
|
|
27
|
+
return config.npmPackage;
|
|
28
|
+
const npm = config.protocol ? PROTOCOL_TO_NPM[config.protocol] : undefined;
|
|
29
|
+
if (npm)
|
|
30
|
+
return npm;
|
|
31
|
+
throw new Error(`Unsupported provider protocol: ${config.protocol || 'unknown'}`);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=protocols.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocols.js","sourceRoot":"","sources":["../../../src/models/protocols.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAqC;IAC/D,QAAQ,EAAE,gBAAgB;IAC1B,WAAW,EAAE,mBAAmB;IAChC,mBAAmB,EAAE,2BAA2B;IAChD,YAAY,EAAE,6BAA6B;IAC3C,QAAQ,EAAE,gBAAgB;IAC1B,QAAQ,EAAE,uBAAuB;IACjC,kBAAkB,EAAE,iCAAiC;IACrD,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,cAAc;IACtB,SAAS,EAAE,iBAAiB;IAC5B,UAAU,EAAE,kBAAkB;IAC9B,WAAW,EAAE,mBAAmB;IAChC,YAAY,EAAE,oBAAoB;IAClC,QAAQ,EAAE,gBAAgB;IAC1B,KAAK,EAAE,aAAa;IACpB,YAAY,EAAE,oBAAoB;IAClC,SAAS,EAAE,wBAAwB;IACnC,SAAS,EAAE,iBAAiB;IAC5B,QAAQ,EAAE,gBAAgB;IAC1B,QAAQ,EAAE,4BAA4B;IACtC,UAAU,EAAE,2BAA2B;IACvC,KAAK,EAAE,4BAA4B;CACpC,CAAA;AAED,MAAM,UAAU,kBAAkB,CAAC,MAGlC;IACC,IAAI,MAAM,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,UAAU,CAAA;IAE/C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1E,IAAI,GAAG;QAAE,OAAO,GAAG,CAAA;IAEnB,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAA;AACnF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LanguageModel } from 'ai';
|
|
2
|
+
export type ProviderFactory = (settings: {
|
|
3
|
+
name: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
baseURL?: string;
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
fetch?: typeof fetch;
|
|
8
|
+
}) => {
|
|
9
|
+
languageModel(modelId: string): LanguageModel;
|
|
10
|
+
};
|
|
11
|
+
/** npm package (or alias) → name of its provider-factory export. */
|
|
12
|
+
export declare const BUILTIN_PROVIDER_EXPORTS: Readonly<Record<string, string>>;
|
|
13
|
+
export declare class ProviderFactoryRegistry {
|
|
14
|
+
#private;
|
|
15
|
+
register(npm: string, factory: ProviderFactory): this;
|
|
16
|
+
has(npm: string): boolean;
|
|
17
|
+
get(npm: string): Promise<ProviderFactory>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=provider_factories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider_factories.d.ts","sourceRoot":"","sources":["../../../src/models/provider_factories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAGvC,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB,KAAK;IAAE,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,CAAA;AAEvD,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBrE,CAAA;AAOD,qBAAa,uBAAuB;;IAGlC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAKrD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAInB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAiCjD"}
|