@stackbilt/llm-providers 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +261 -0
- package/dist/errors.d.ts +79 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +183 -0
- package/dist/errors.js.map +1 -0
- package/dist/factory.d.ts +95 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +418 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +137 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +263 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +38 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +378 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +107 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +230 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/cerebras.d.ts +30 -0
- package/dist/providers/cerebras.d.ts.map +1 -0
- package/dist/providers/cerebras.js +292 -0
- package/dist/providers/cerebras.js.map +1 -0
- package/dist/providers/cloudflare.d.ts +47 -0
- package/dist/providers/cloudflare.d.ts.map +1 -0
- package/dist/providers/cloudflare.js +544 -0
- package/dist/providers/cloudflare.js.map +1 -0
- package/dist/providers/groq.d.ts +30 -0
- package/dist/providers/groq.d.ts.map +1 -0
- package/dist/providers/groq.js +222 -0
- package/dist/providers/groq.js.map +1 -0
- package/dist/providers/openai.d.ts +36 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +331 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/types.d.ts +238 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +111 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +365 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/cost-tracker.d.ts +130 -0
- package/dist/utils/cost-tracker.d.ts.map +1 -0
- package/dist/utils/cost-tracker.js +272 -0
- package/dist/utils/cost-tracker.js.map +1 -0
- package/dist/utils/credit-ledger.d.ts +161 -0
- package/dist/utils/credit-ledger.d.ts.map +1 -0
- package/dist/utils/credit-ledger.js +463 -0
- package/dist/utils/credit-ledger.js.map +1 -0
- package/dist/utils/retry.d.ts +46 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +125 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Provider
|
|
3
|
+
* Abstract base class for all LLM providers with common functionality
|
|
4
|
+
*/
|
|
5
|
+
import { RetryManager } from '../utils/retry';
|
|
6
|
+
import { CircuitBreaker, defaultCircuitBreakerManager } from '../utils/circuit-breaker';
|
|
7
|
+
import { CostTracker } from '../utils/cost-tracker';
|
|
8
|
+
import { ConfigurationError, TimeoutError } from '../errors';
|
|
9
|
+
export class BaseProvider {
|
|
10
|
+
config;
|
|
11
|
+
retryManager;
|
|
12
|
+
circuitBreaker;
|
|
13
|
+
costTracker;
|
|
14
|
+
metrics;
|
|
15
|
+
constructor(config = {}) {
|
|
16
|
+
this.config = {
|
|
17
|
+
timeout: config.timeout ?? 30000,
|
|
18
|
+
maxRetries: config.maxRetries ?? 3,
|
|
19
|
+
retryDelay: config.retryDelay ?? 1000,
|
|
20
|
+
...config
|
|
21
|
+
};
|
|
22
|
+
this.retryManager = new RetryManager({
|
|
23
|
+
maxRetries: this.config.maxRetries,
|
|
24
|
+
initialDelay: this.config.retryDelay
|
|
25
|
+
});
|
|
26
|
+
// Note: this.name is set by the subclass after super() returns.
|
|
27
|
+
// The circuit breaker name is updated lazily on first use.
|
|
28
|
+
this.circuitBreaker = new CircuitBreaker('pending');
|
|
29
|
+
this.costTracker = new CostTracker();
|
|
30
|
+
this.metrics = {
|
|
31
|
+
requestCount: 0,
|
|
32
|
+
successCount: 0,
|
|
33
|
+
errorCount: 0,
|
|
34
|
+
averageLatency: 0,
|
|
35
|
+
totalCost: 0,
|
|
36
|
+
rateLimitHits: 0,
|
|
37
|
+
lastUsed: 0
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Common HTTP request method with timeout and error handling
|
|
42
|
+
*/
|
|
43
|
+
async makeRequest(url, options = {}, timeoutMs) {
|
|
44
|
+
const timeout = timeoutMs || this.config.timeout || 30000;
|
|
45
|
+
const controller = new AbortController();
|
|
46
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
47
|
+
try {
|
|
48
|
+
const response = await fetch(url, {
|
|
49
|
+
...options,
|
|
50
|
+
signal: controller.signal,
|
|
51
|
+
headers: {
|
|
52
|
+
'Content-Type': 'application/json',
|
|
53
|
+
'User-Agent': 'ai-platform/llm-providers',
|
|
54
|
+
...options.headers
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
clearTimeout(timeoutId);
|
|
58
|
+
return response;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
clearTimeout(timeoutId);
|
|
62
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
63
|
+
throw new TimeoutError(this.name, `Request timeout after ${timeout}ms`);
|
|
64
|
+
}
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Execute request with circuit breaker and retry logic
|
|
70
|
+
*/
|
|
71
|
+
async executeWithResiliency(operation) {
|
|
72
|
+
return this.getCircuitBreaker().execute(() => this.retryManager.execute(operation));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Update metrics after request
|
|
76
|
+
*/
|
|
77
|
+
updateMetrics(responseTime, success, cost = 0) {
|
|
78
|
+
const measuredLatency = Math.max(responseTime, 1);
|
|
79
|
+
this.metrics.requestCount++;
|
|
80
|
+
this.metrics.lastUsed = Date.now();
|
|
81
|
+
if (success) {
|
|
82
|
+
this.metrics.successCount++;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.metrics.errorCount++;
|
|
86
|
+
}
|
|
87
|
+
// Update average latency
|
|
88
|
+
const totalLatency = this.metrics.averageLatency * (this.metrics.requestCount - 1);
|
|
89
|
+
this.metrics.averageLatency = (totalLatency + measuredLatency) / this.metrics.requestCount;
|
|
90
|
+
this.metrics.totalCost += cost;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get provider metrics
|
|
94
|
+
*/
|
|
95
|
+
getMetrics() {
|
|
96
|
+
return { ...this.metrics };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Reset metrics
|
|
100
|
+
*/
|
|
101
|
+
resetMetrics() {
|
|
102
|
+
this.metrics = {
|
|
103
|
+
requestCount: 0,
|
|
104
|
+
successCount: 0,
|
|
105
|
+
errorCount: 0,
|
|
106
|
+
averageLatency: 0,
|
|
107
|
+
totalCost: 0,
|
|
108
|
+
rateLimitHits: 0,
|
|
109
|
+
lastUsed: 0
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get provider health status
|
|
114
|
+
*/
|
|
115
|
+
getHealth() {
|
|
116
|
+
const circuitState = this.getCircuitBreaker().getState();
|
|
117
|
+
const successRate = this.metrics.requestCount > 0
|
|
118
|
+
? this.metrics.successCount / this.metrics.requestCount
|
|
119
|
+
: 1;
|
|
120
|
+
return {
|
|
121
|
+
healthy: circuitState.state === 'CLOSED' && successRate > 0.8,
|
|
122
|
+
circuitBreakerState: circuitState.state,
|
|
123
|
+
metrics: this.getMetrics(),
|
|
124
|
+
lastError: circuitState.lastFailure
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Update provider configuration
|
|
129
|
+
*/
|
|
130
|
+
updateConfig(config) {
|
|
131
|
+
this.config = { ...this.config, ...config };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get current configuration (without sensitive data)
|
|
135
|
+
*/
|
|
136
|
+
getConfig() {
|
|
137
|
+
const { apiKey, ...safeConfig } = this.config;
|
|
138
|
+
return safeConfig;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Providers share the named singleton breaker so factory-level routing and
|
|
142
|
+
* per-provider execution observe the same failure history.
|
|
143
|
+
*/
|
|
144
|
+
getCircuitBreaker() {
|
|
145
|
+
if (this.circuitBreaker.name !== this.name) {
|
|
146
|
+
this.circuitBreaker = defaultCircuitBreakerManager.getBreaker(this.name);
|
|
147
|
+
}
|
|
148
|
+
return this.circuitBreaker;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Common model capability definitions
|
|
152
|
+
*/
|
|
153
|
+
getModelCapabilities() {
|
|
154
|
+
// Override in subclasses to provide model-specific capabilities
|
|
155
|
+
return {};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Validate request before processing
|
|
159
|
+
*/
|
|
160
|
+
validateRequest(request) {
|
|
161
|
+
if (!request.messages || request.messages.length === 0) {
|
|
162
|
+
throw new ConfigurationError(this.name, 'Request must contain at least one message');
|
|
163
|
+
}
|
|
164
|
+
if (request.maxTokens && request.maxTokens < 1) {
|
|
165
|
+
throw new ConfigurationError(this.name, 'maxTokens must be greater than 0');
|
|
166
|
+
}
|
|
167
|
+
if (request.temperature && (request.temperature < 0 || request.temperature > 2)) {
|
|
168
|
+
throw new ConfigurationError(this.name, 'temperature must be between 0 and 2');
|
|
169
|
+
}
|
|
170
|
+
// Validate model if specified
|
|
171
|
+
if (request.model && !this.models.includes(request.model)) {
|
|
172
|
+
throw new ConfigurationError(this.name, `Model '${request.model}' not supported. Available models: ${this.models.join(', ')}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Calculate token usage cost
|
|
177
|
+
*/
|
|
178
|
+
calculateCost(inputTokens, outputTokens, model) {
|
|
179
|
+
const capabilities = this.getModelCapabilities()[model];
|
|
180
|
+
if (!capabilities)
|
|
181
|
+
return 0;
|
|
182
|
+
const inputCost = (inputTokens / 1000) * capabilities.inputTokenCost;
|
|
183
|
+
const outputCost = (outputTokens / 1000) * capabilities.outputTokenCost;
|
|
184
|
+
return inputCost + outputCost;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Common response formatting
|
|
188
|
+
*/
|
|
189
|
+
buildResponse(content, usage, model, responseTime, metadata) {
|
|
190
|
+
const cost = this.calculateCost(usage.inputTokens, usage.outputTokens, model);
|
|
191
|
+
return {
|
|
192
|
+
message: content,
|
|
193
|
+
content,
|
|
194
|
+
usage: {
|
|
195
|
+
inputTokens: usage.inputTokens,
|
|
196
|
+
outputTokens: usage.outputTokens,
|
|
197
|
+
totalTokens: usage.inputTokens + usage.outputTokens,
|
|
198
|
+
cost
|
|
199
|
+
},
|
|
200
|
+
model,
|
|
201
|
+
provider: this.name,
|
|
202
|
+
responseTime,
|
|
203
|
+
finishReason: 'stop',
|
|
204
|
+
metadata
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Log request/response for debugging
|
|
209
|
+
*/
|
|
210
|
+
logRequest(request, response, error) {
|
|
211
|
+
const logData = {
|
|
212
|
+
provider: this.name,
|
|
213
|
+
model: request.model,
|
|
214
|
+
messageCount: request.messages.length,
|
|
215
|
+
requestId: request.requestId,
|
|
216
|
+
tenantId: request.tenantId,
|
|
217
|
+
success: !error,
|
|
218
|
+
responseTime: response?.responseTime,
|
|
219
|
+
usage: response?.usage,
|
|
220
|
+
error: error?.message
|
|
221
|
+
};
|
|
222
|
+
if (error) {
|
|
223
|
+
console.error(`[${this.name}] Request failed:`, logData);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
console.log(`[${this.name}] Request completed:`, logData);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cerebras Provider
|
|
3
|
+
* Implementation for Cerebras fast inference models (OpenAI-compatible API)
|
|
4
|
+
*/
|
|
5
|
+
import type { LLMRequest, LLMResponse, CerebrasConfig, ModelCapabilities } from '../types';
|
|
6
|
+
import { BaseProvider } from './base';
|
|
7
|
+
export declare class CerebrasProvider extends BaseProvider {
|
|
8
|
+
name: string;
|
|
9
|
+
models: string[];
|
|
10
|
+
supportsStreaming: boolean;
|
|
11
|
+
supportsTools: boolean;
|
|
12
|
+
supportsBatching: boolean;
|
|
13
|
+
private apiKey;
|
|
14
|
+
private baseUrl;
|
|
15
|
+
constructor(config: CerebrasConfig);
|
|
16
|
+
generateResponse(request: LLMRequest): Promise<LLMResponse>;
|
|
17
|
+
validateConfig(): boolean;
|
|
18
|
+
getModels(): string[];
|
|
19
|
+
estimateCost(request: LLMRequest): number;
|
|
20
|
+
healthCheck(): Promise<boolean>;
|
|
21
|
+
protected getModelCapabilities(): Record<string, ModelCapabilities>;
|
|
22
|
+
/**
|
|
23
|
+
* Stream response support (OpenAI-compatible SSE format)
|
|
24
|
+
*/
|
|
25
|
+
streamResponse(request: LLMRequest): Promise<ReadableStream<string>>;
|
|
26
|
+
private makeCerebrasRequest;
|
|
27
|
+
private formatRequest;
|
|
28
|
+
private formatResponse;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=cerebras.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cerebras.d.ts","sourceRoot":"","sources":["../../src/providers/cerebras.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAY,MAAM,UAAU,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAgEtC,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,IAAI,SAAc;IAClB,MAAM,WAKJ;IACF,iBAAiB,UAAQ;IACzB,aAAa,UAAQ;IACrB,gBAAgB,UAAS;IAEzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,cAAc;IAW5B,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA8BjE,cAAc,IAAI,OAAO;IAIzB,SAAS,IAAI,MAAM,EAAE;IAIrB,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAcnC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC,SAAS,CAAC,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAyCnE;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YA8D5D,mBAAmB;IAsBjC,OAAO,CAAC,aAAa;IAyErB,OAAO,CAAC,cAAc;CA+CvB"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cerebras Provider
|
|
3
|
+
* Implementation for Cerebras fast inference models (OpenAI-compatible API)
|
|
4
|
+
*/
|
|
5
|
+
import { BaseProvider } from './base';
|
|
6
|
+
import { LLMErrorFactory, AuthenticationError } from '../errors';
|
|
7
|
+
// Models that support tool calling
|
|
8
|
+
const TOOL_CAPABLE_MODELS = new Set([
|
|
9
|
+
'zai-glm-4.7',
|
|
10
|
+
'qwen-3-235b-a22b-instruct-2507',
|
|
11
|
+
]);
|
|
12
|
+
export class CerebrasProvider extends BaseProvider {
|
|
13
|
+
name = 'cerebras';
|
|
14
|
+
models = [
|
|
15
|
+
'llama-3.1-8b',
|
|
16
|
+
'llama-3.3-70b',
|
|
17
|
+
'zai-glm-4.7',
|
|
18
|
+
'qwen-3-235b-a22b-instruct-2507',
|
|
19
|
+
];
|
|
20
|
+
supportsStreaming = true;
|
|
21
|
+
supportsTools = true;
|
|
22
|
+
supportsBatching = false;
|
|
23
|
+
apiKey;
|
|
24
|
+
baseUrl;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
super(config);
|
|
27
|
+
if (!config.apiKey) {
|
|
28
|
+
throw new AuthenticationError('cerebras', 'Cerebras API key is required');
|
|
29
|
+
}
|
|
30
|
+
this.apiKey = config.apiKey;
|
|
31
|
+
this.baseUrl = config.baseUrl || 'https://api.cerebras.ai/v1';
|
|
32
|
+
}
|
|
33
|
+
async generateResponse(request) {
|
|
34
|
+
this.validateRequest(request);
|
|
35
|
+
const startTime = Date.now();
|
|
36
|
+
try {
|
|
37
|
+
const response = await this.executeWithResiliency(async () => {
|
|
38
|
+
const cerebrasRequest = this.formatRequest(request);
|
|
39
|
+
const httpResponse = await this.makeCerebrasRequest('/chat/completions', cerebrasRequest);
|
|
40
|
+
if (!httpResponse.ok) {
|
|
41
|
+
throw await LLMErrorFactory.fromFetchResponse('cerebras', httpResponse);
|
|
42
|
+
}
|
|
43
|
+
const data = await httpResponse.json();
|
|
44
|
+
return this.formatResponse(data, Date.now() - startTime);
|
|
45
|
+
});
|
|
46
|
+
this.updateMetrics(response.responseTime, true, response.usage.cost);
|
|
47
|
+
this.logRequest(request, response);
|
|
48
|
+
return response;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const responseTime = Date.now() - startTime;
|
|
52
|
+
this.updateMetrics(responseTime, false);
|
|
53
|
+
this.logRequest(request, undefined, error);
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
validateConfig() {
|
|
58
|
+
return !!(this.apiKey && this.baseUrl);
|
|
59
|
+
}
|
|
60
|
+
getModels() {
|
|
61
|
+
return [...this.models];
|
|
62
|
+
}
|
|
63
|
+
estimateCost(request) {
|
|
64
|
+
const model = request.model || 'llama-3.1-8b';
|
|
65
|
+
const capabilities = this.getModelCapabilities()[model];
|
|
66
|
+
if (!capabilities)
|
|
67
|
+
return 0;
|
|
68
|
+
const inputTokens = request.messages.reduce((sum, msg) => sum + Math.ceil(msg.content.length / 4), 0);
|
|
69
|
+
const outputTokens = request.maxTokens || 1000;
|
|
70
|
+
return this.calculateCost(inputTokens, outputTokens, model);
|
|
71
|
+
}
|
|
72
|
+
async healthCheck() {
|
|
73
|
+
try {
|
|
74
|
+
const response = await this.makeCerebrasRequest('/models', null, 'GET');
|
|
75
|
+
return response.ok;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
getModelCapabilities() {
|
|
82
|
+
return {
|
|
83
|
+
'llama-3.1-8b': {
|
|
84
|
+
maxContextLength: 128000,
|
|
85
|
+
supportsStreaming: true,
|
|
86
|
+
supportsTools: false,
|
|
87
|
+
supportsBatching: false,
|
|
88
|
+
inputTokenCost: 0.0001, // $0.10 per 1M tokens
|
|
89
|
+
outputTokenCost: 0.0001, // $0.10 per 1M tokens
|
|
90
|
+
description: 'Llama 3.1 8B - Fast inference on Cerebras'
|
|
91
|
+
},
|
|
92
|
+
'llama-3.3-70b': {
|
|
93
|
+
maxContextLength: 128000,
|
|
94
|
+
supportsStreaming: true,
|
|
95
|
+
supportsTools: false,
|
|
96
|
+
supportsBatching: false,
|
|
97
|
+
inputTokenCost: 0.0006, // $0.60 per 1M tokens
|
|
98
|
+
outputTokenCost: 0.0006, // $0.60 per 1M tokens
|
|
99
|
+
description: 'Llama 3.3 70B - High-quality fast inference on Cerebras'
|
|
100
|
+
},
|
|
101
|
+
'zai-glm-4.7': {
|
|
102
|
+
maxContextLength: 131000,
|
|
103
|
+
supportsStreaming: true,
|
|
104
|
+
supportsTools: true,
|
|
105
|
+
supportsBatching: false,
|
|
106
|
+
inputTokenCost: 0.00225, // $2.25 per 1M tokens
|
|
107
|
+
outputTokenCost: 0.00275, // $2.75 per 1M tokens
|
|
108
|
+
description: 'ZAI-GLM 4.7 355B - Reasoning mode, tool calling, structured outputs (Preview)'
|
|
109
|
+
},
|
|
110
|
+
'qwen-3-235b-a22b-instruct-2507': {
|
|
111
|
+
maxContextLength: 131000,
|
|
112
|
+
supportsStreaming: true,
|
|
113
|
+
supportsTools: true,
|
|
114
|
+
supportsBatching: false,
|
|
115
|
+
inputTokenCost: 0.0006, // $0.60 per 1M tokens
|
|
116
|
+
outputTokenCost: 0.0012, // $1.20 per 1M tokens
|
|
117
|
+
description: 'Qwen 3 235B MoE (22B active) - Tool calling, structured outputs (Preview)'
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Stream response support (OpenAI-compatible SSE format)
|
|
123
|
+
*/
|
|
124
|
+
async streamResponse(request) {
|
|
125
|
+
this.validateRequest(request);
|
|
126
|
+
const cerebrasRequest = { ...this.formatRequest(request), stream: true };
|
|
127
|
+
return new ReadableStream({
|
|
128
|
+
start: async (controller) => {
|
|
129
|
+
try {
|
|
130
|
+
const response = await this.makeCerebrasRequest('/chat/completions', cerebrasRequest);
|
|
131
|
+
if (!response.ok) {
|
|
132
|
+
throw await LLMErrorFactory.fromFetchResponse('cerebras', response);
|
|
133
|
+
}
|
|
134
|
+
const reader = response.body?.getReader();
|
|
135
|
+
if (!reader) {
|
|
136
|
+
throw new Error('No response body');
|
|
137
|
+
}
|
|
138
|
+
const decoder = new TextDecoder();
|
|
139
|
+
let buffer = '';
|
|
140
|
+
while (true) {
|
|
141
|
+
const { done, value } = await reader.read();
|
|
142
|
+
if (done)
|
|
143
|
+
break;
|
|
144
|
+
buffer += decoder.decode(value, { stream: true });
|
|
145
|
+
const lines = buffer.split('\n');
|
|
146
|
+
buffer = lines.pop() || '';
|
|
147
|
+
for (const line of lines) {
|
|
148
|
+
if (line.startsWith('data: ')) {
|
|
149
|
+
const data = line.slice(6);
|
|
150
|
+
if (data === '[DONE]') {
|
|
151
|
+
controller.close();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
const parsed = JSON.parse(data);
|
|
156
|
+
const content = parsed.choices?.[0]?.delta?.content;
|
|
157
|
+
if (content) {
|
|
158
|
+
controller.enqueue(content);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.warn('Failed to parse SSE data:', error);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
controller.close();
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
controller.error(error);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
async makeCerebrasRequest(endpoint, body, method = 'POST') {
|
|
176
|
+
const headers = {
|
|
177
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
178
|
+
'Content-Type': 'application/json'
|
|
179
|
+
};
|
|
180
|
+
const options = {
|
|
181
|
+
method,
|
|
182
|
+
headers
|
|
183
|
+
};
|
|
184
|
+
if (body && method !== 'GET') {
|
|
185
|
+
options.body = JSON.stringify(body);
|
|
186
|
+
}
|
|
187
|
+
return this.makeRequest(`${this.baseUrl}${endpoint}`, options);
|
|
188
|
+
}
|
|
189
|
+
formatRequest(request) {
|
|
190
|
+
const messages = [];
|
|
191
|
+
const model = request.model || 'llama-3.1-8b';
|
|
192
|
+
const jsonMode = request.response_format?.type === 'json_object';
|
|
193
|
+
const jsonInstruction = '\n\nYou must respond with valid JSON only. No markdown fences, no commentary, no text outside the JSON.';
|
|
194
|
+
if (request.systemPrompt) {
|
|
195
|
+
messages.push({
|
|
196
|
+
role: 'system',
|
|
197
|
+
content: jsonMode ? request.systemPrompt + jsonInstruction : request.systemPrompt
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
else if (jsonMode) {
|
|
201
|
+
messages.push({
|
|
202
|
+
role: 'system',
|
|
203
|
+
content: jsonInstruction.trimStart()
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
for (const message of request.messages) {
|
|
207
|
+
if (message.role === 'system' && request.systemPrompt) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
const msg = {
|
|
211
|
+
role: message.role,
|
|
212
|
+
content: message.content
|
|
213
|
+
};
|
|
214
|
+
// Carry tool calls/results for multi-turn tool conversations
|
|
215
|
+
if (message.toolCalls) {
|
|
216
|
+
msg.tool_calls = message.toolCalls.map(tc => ({
|
|
217
|
+
id: tc.id,
|
|
218
|
+
type: 'function',
|
|
219
|
+
function: { name: tc.function.name, arguments: tc.function.arguments }
|
|
220
|
+
}));
|
|
221
|
+
}
|
|
222
|
+
if (message.toolResults) {
|
|
223
|
+
// Tool results come as separate messages in OpenAI format
|
|
224
|
+
for (const tr of message.toolResults) {
|
|
225
|
+
messages.push({ role: 'tool', content: tr.output, tool_call_id: tr.id });
|
|
226
|
+
}
|
|
227
|
+
continue; // Don't push the original message — tool results replace it
|
|
228
|
+
}
|
|
229
|
+
messages.push(msg);
|
|
230
|
+
}
|
|
231
|
+
const result = {
|
|
232
|
+
model,
|
|
233
|
+
messages,
|
|
234
|
+
temperature: request.temperature,
|
|
235
|
+
max_tokens: request.maxTokens,
|
|
236
|
+
stream: request.stream
|
|
237
|
+
};
|
|
238
|
+
// Add tools if the model supports them and tools are provided
|
|
239
|
+
if (request.tools && request.tools.length > 0 && TOOL_CAPABLE_MODELS.has(model)) {
|
|
240
|
+
result.tools = request.tools.map(t => ({
|
|
241
|
+
type: 'function',
|
|
242
|
+
function: {
|
|
243
|
+
name: t.function.name,
|
|
244
|
+
description: t.function.description,
|
|
245
|
+
parameters: t.function.parameters,
|
|
246
|
+
}
|
|
247
|
+
}));
|
|
248
|
+
if (request.toolChoice) {
|
|
249
|
+
result.tool_choice = request.toolChoice;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
formatResponse(data, responseTime) {
|
|
255
|
+
const choice = data.choices[0];
|
|
256
|
+
if (!choice) {
|
|
257
|
+
throw new Error('No choices returned from Cerebras');
|
|
258
|
+
}
|
|
259
|
+
const content = choice.message.content || '';
|
|
260
|
+
const usage = {
|
|
261
|
+
inputTokens: data.usage.prompt_tokens,
|
|
262
|
+
outputTokens: data.usage.completion_tokens,
|
|
263
|
+
totalTokens: data.usage.total_tokens,
|
|
264
|
+
cost: this.calculateCost(data.usage.prompt_tokens, data.usage.completion_tokens, data.model)
|
|
265
|
+
};
|
|
266
|
+
// Extract tool calls if present
|
|
267
|
+
let toolCalls;
|
|
268
|
+
if (choice.message.tool_calls && choice.message.tool_calls.length > 0) {
|
|
269
|
+
toolCalls = choice.message.tool_calls.map(tc => ({
|
|
270
|
+
id: tc.id,
|
|
271
|
+
type: 'function',
|
|
272
|
+
function: { name: tc.function.name, arguments: tc.function.arguments }
|
|
273
|
+
}));
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
id: data.id,
|
|
277
|
+
message: content,
|
|
278
|
+
content,
|
|
279
|
+
usage,
|
|
280
|
+
model: data.model,
|
|
281
|
+
provider: this.name,
|
|
282
|
+
responseTime,
|
|
283
|
+
finishReason: choice.finish_reason === 'tool_calls' ? 'tool_calls' : choice.finish_reason,
|
|
284
|
+
toolCalls,
|
|
285
|
+
metadata: {
|
|
286
|
+
systemFingerprint: data.system_fingerprint,
|
|
287
|
+
created: data.created
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=cerebras.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cerebras.js","sourceRoot":"","sources":["../../src/providers/cerebras.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare AI Provider
|
|
3
|
+
* Implementation for Cloudflare Workers AI with cost optimization
|
|
4
|
+
*/
|
|
5
|
+
import type { LLMRequest, LLMResponse, CloudflareConfig, ModelCapabilities } from '../types';
|
|
6
|
+
import { BaseProvider } from './base';
|
|
7
|
+
export declare class CloudflareProvider extends BaseProvider {
|
|
8
|
+
name: string;
|
|
9
|
+
models: string[];
|
|
10
|
+
supportsStreaming: boolean;
|
|
11
|
+
supportsTools: boolean;
|
|
12
|
+
supportsBatching: boolean;
|
|
13
|
+
private ai;
|
|
14
|
+
private accountId?;
|
|
15
|
+
constructor(config: CloudflareConfig);
|
|
16
|
+
generateResponse(request: LLMRequest): Promise<LLMResponse>;
|
|
17
|
+
validateConfig(): boolean;
|
|
18
|
+
getModels(): string[];
|
|
19
|
+
estimateCost(request: LLMRequest): number;
|
|
20
|
+
healthCheck(): Promise<boolean>;
|
|
21
|
+
protected getModelCapabilities(): Record<string, ModelCapabilities>;
|
|
22
|
+
private formatRequest;
|
|
23
|
+
private formatResponse;
|
|
24
|
+
private extractText;
|
|
25
|
+
private extractToolCalls;
|
|
26
|
+
private extractUsage;
|
|
27
|
+
private extractFinishReason;
|
|
28
|
+
private stringifyArguments;
|
|
29
|
+
private unwrapResult;
|
|
30
|
+
/**
|
|
31
|
+
* Stream response support
|
|
32
|
+
*/
|
|
33
|
+
streamResponse(request: LLMRequest): Promise<ReadableStream<string>>;
|
|
34
|
+
/**
|
|
35
|
+
* Batch processing support
|
|
36
|
+
*/
|
|
37
|
+
processBatch(requests: LLMRequest[]): Promise<LLMResponse[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Get recommended model for cost optimization
|
|
40
|
+
*/
|
|
41
|
+
getRecommendedModel(request: LLMRequest): string;
|
|
42
|
+
/**
|
|
43
|
+
* Cost optimization features
|
|
44
|
+
*/
|
|
45
|
+
generateWithCostOptimization(request: LLMRequest): Promise<LLMResponse>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/providers/cloudflare.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAGlB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAsBtC,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,IAAI,SAAgB;IACpB,MAAM,WAcJ;IACF,iBAAiB,UAAQ;IACzB,aAAa,UAAQ;IACrB,gBAAgB,UAAQ;IAExB,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,MAAM,EAAE,gBAAgB;IAW9B,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAgCjE,cAAc,IAAI,OAAO;IAIzB,SAAS,IAAI,MAAM,EAAE;IAIrB,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAiBnC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAcrC,SAAS,CAAC,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IA2HnE,OAAO,CAAC,aAAa;IA2FrB,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,WAAW;IAqDnB,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,YAAY;IAmDpB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IA6C1E;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA+BlE;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAkBhD;;OAEG;IACG,4BAA4B,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAS9E"}
|