@umituz/web-ai 1.0.1 → 1.0.2
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/dist/content/index.cjs +116 -10
- package/dist/content/index.cjs.map +1 -1
- package/dist/content/index.d.cts +1 -1
- package/dist/content/index.d.ts +1 -1
- package/dist/content/index.js +116 -10
- package/dist/content/index.js.map +1 -1
- package/dist/core/index.cjs +10 -0
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +13 -3
- package/dist/core/index.d.ts +13 -3
- package/dist/core/index.js +9 -1
- package/dist/core/index.js.map +1 -1
- package/dist/{create-ai-DXEoke8-.d.ts → create-ai-9PW752z8.d.ts} +11 -1
- package/dist/{create-ai-DOI9jD3v.d.cts → create-ai-CXYKPK6G.d.cts} +11 -1
- package/dist/hooks/index.cjs +272 -10
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.cts +28 -2
- package/dist/hooks/index.d.ts +28 -2
- package/dist/hooks/index.js +272 -11
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.cjs +421 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.js +402 -11
- package/dist/index.js.map +1 -1
- package/dist/providers/index.cjs +696 -10
- package/dist/providers/index.cjs.map +1 -1
- package/dist/providers/index.d.cts +75 -8
- package/dist/providers/index.d.ts +75 -8
- package/dist/providers/index.js +679 -11
- package/dist/providers/index.js.map +1 -1
- package/dist/text-generation.service-BQO3Tvz2.d.cts +66 -0
- package/dist/text-generation.service-CcYQM6Ch.d.ts +66 -0
- package/package.json +6 -1
package/dist/index.cjs
CHANGED
|
@@ -132,6 +132,14 @@ var AIError = class _AIError extends Error {
|
|
|
132
132
|
}
|
|
133
133
|
};
|
|
134
134
|
|
|
135
|
+
// src/core/errors/groq-error.ts
|
|
136
|
+
var GroqError = class extends AIError {
|
|
137
|
+
constructor(type, message, cause, metadata = {}) {
|
|
138
|
+
super(type, message, cause, metadata);
|
|
139
|
+
this.name = "GroqError";
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
|
|
135
143
|
// src/core/errors/error-classifier.ts
|
|
136
144
|
var DEFAULT_RETRYABLE_TYPES = /* @__PURE__ */ new Set([
|
|
137
145
|
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
@@ -410,6 +418,8 @@ function calculateExponentialBackoff(params) {
|
|
|
410
418
|
// src/core/constants/identifier.constants.ts
|
|
411
419
|
var MESSAGE_ID_PREFIX = "msg-";
|
|
412
420
|
var CHAT_MESSAGE_ID_SUFFIX_LENGTH = 9;
|
|
421
|
+
var CACHE_KEY_TYPE_COMPLETION = "completion";
|
|
422
|
+
var CACHE_KEY_TYPE_CHAT = "chat";
|
|
413
423
|
var USER_ROLE = "user";
|
|
414
424
|
var ASSISTANT_ROLE = "assistant";
|
|
415
425
|
var QUEUE_PRIORITY_USER_REQUEST = 10;
|
|
@@ -1881,12 +1891,22 @@ var DEFAULT_GENERATION_CONFIG = {
|
|
|
1881
1891
|
maxTokens: 1024,
|
|
1882
1892
|
topP: 1
|
|
1883
1893
|
};
|
|
1894
|
+
var DEFAULT_MODELS = {
|
|
1895
|
+
TEXT: GROQ_MODELS.LLAMA_3_1_8B_INSTANT,
|
|
1896
|
+
FAST: GROQ_MODELS.LLAMA_3_1_8B_INSTANT,
|
|
1897
|
+
EXPERIMENTAL: GROQ_MODELS.GPT_OSS_20B
|
|
1898
|
+
};
|
|
1884
1899
|
var GROQ_BASE_URL = "https://api.groq.com/openai/v1";
|
|
1900
|
+
var DEFAULT_BASE_URL = GROQ_BASE_URL;
|
|
1885
1901
|
var CHAT_COMPLETIONS_PATH = "/chat/completions";
|
|
1902
|
+
var API_ENDPOINTS = {
|
|
1903
|
+
CHAT: CHAT_COMPLETIONS_PATH
|
|
1904
|
+
};
|
|
1886
1905
|
var GROQ_TIMEOUTS = {
|
|
1887
1906
|
DEFAULT: 3e4,
|
|
1888
1907
|
STREAMING: 6e4
|
|
1889
1908
|
};
|
|
1909
|
+
var TIMEOUTS = GROQ_TIMEOUTS;
|
|
1890
1910
|
var HTTP_HEADERS = {
|
|
1891
1911
|
CONTENT_TYPE: "Content-Type",
|
|
1892
1912
|
APPLICATION_JSON: "application/json",
|
|
@@ -1945,13 +1965,65 @@ var GroqChatRequestBuilder = class _GroqChatRequestBuilder {
|
|
|
1945
1965
|
}
|
|
1946
1966
|
};
|
|
1947
1967
|
|
|
1968
|
+
// src/providers/groq/groq-config-store.ts
|
|
1969
|
+
var GroqConfigStore = class {
|
|
1970
|
+
config = null;
|
|
1971
|
+
initialize(config) {
|
|
1972
|
+
const validation = validateApiKey(config.apiKey, { minLength: 1 });
|
|
1973
|
+
if (!validation.valid) {
|
|
1974
|
+
throw new GroqError("INVALID_API_KEY" /* INVALID_API_KEY */, validation.reason ?? "Invalid API key");
|
|
1975
|
+
}
|
|
1976
|
+
const normalized = {
|
|
1977
|
+
apiKey: config.apiKey.trim(),
|
|
1978
|
+
baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,
|
|
1979
|
+
timeoutMs: config.timeoutMs ?? TIMEOUTS.DEFAULT,
|
|
1980
|
+
...config.models !== void 0 ? { models: config.models } : {},
|
|
1981
|
+
...config.textModel !== void 0 ? { textModel: config.textModel } : {}
|
|
1982
|
+
};
|
|
1983
|
+
this.config = normalized;
|
|
1984
|
+
return normalized;
|
|
1985
|
+
}
|
|
1986
|
+
get() {
|
|
1987
|
+
if (!this.config) {
|
|
1988
|
+
throw new GroqError(
|
|
1989
|
+
"MISSING_CONFIG" /* MISSING_CONFIG */,
|
|
1990
|
+
"Client not initialized. Call configureProvider first."
|
|
1991
|
+
);
|
|
1992
|
+
}
|
|
1993
|
+
return this.config;
|
|
1994
|
+
}
|
|
1995
|
+
getOrNull() {
|
|
1996
|
+
return this.config;
|
|
1997
|
+
}
|
|
1998
|
+
isInitialized() {
|
|
1999
|
+
return this.config !== null;
|
|
2000
|
+
}
|
|
2001
|
+
setApiKey(apiKey) {
|
|
2002
|
+
const current = this.get();
|
|
2003
|
+
const validation = validateApiKey(apiKey, { minLength: 1 });
|
|
2004
|
+
if (!validation.valid) {
|
|
2005
|
+
throw new GroqError("INVALID_API_KEY" /* INVALID_API_KEY */, validation.reason ?? "Invalid API key");
|
|
2006
|
+
}
|
|
2007
|
+
this.config = { ...current, apiKey: apiKey.trim() };
|
|
2008
|
+
}
|
|
2009
|
+
reset() {
|
|
2010
|
+
this.config = null;
|
|
2011
|
+
}
|
|
2012
|
+
};
|
|
2013
|
+
|
|
1948
2014
|
// src/providers/groq/groq-http-transport.ts
|
|
1949
2015
|
var GroqHttpTransport = class {
|
|
1950
|
-
constructor(
|
|
1951
|
-
this.
|
|
2016
|
+
constructor(configSource) {
|
|
2017
|
+
this.configSource = configSource;
|
|
1952
2018
|
}
|
|
1953
|
-
|
|
2019
|
+
configSource;
|
|
1954
2020
|
pendingAbortControllers = /* @__PURE__ */ new Set();
|
|
2021
|
+
getConfig() {
|
|
2022
|
+
if ("get" in this.configSource && typeof this.configSource.get === "function") {
|
|
2023
|
+
return this.configSource.get();
|
|
2024
|
+
}
|
|
2025
|
+
return this.configSource;
|
|
2026
|
+
}
|
|
1955
2027
|
cancelPendingRequests() {
|
|
1956
2028
|
for (const controller of this.pendingAbortControllers) {
|
|
1957
2029
|
controller.abort();
|
|
@@ -1966,7 +2038,7 @@ var GroqHttpTransport = class {
|
|
|
1966
2038
|
}
|
|
1967
2039
|
async streamChatCompletion(request, options = {}) {
|
|
1968
2040
|
const url = `${this.baseUrl()}${CHAT_COMPLETIONS_PATH}`;
|
|
1969
|
-
const timeout = this.
|
|
2041
|
+
const timeout = this.getConfig().timeoutMs ?? GROQ_TIMEOUTS.STREAMING;
|
|
1970
2042
|
const controller = new AbortController();
|
|
1971
2043
|
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
1972
2044
|
const onExternalAbort = () => controller.abort();
|
|
@@ -1993,11 +2065,11 @@ var GroqHttpTransport = class {
|
|
|
1993
2065
|
}
|
|
1994
2066
|
}
|
|
1995
2067
|
baseUrl() {
|
|
1996
|
-
return this.
|
|
2068
|
+
return this.getConfig().baseUrl ?? GROQ_BASE_URL;
|
|
1997
2069
|
}
|
|
1998
2070
|
async request(endpoint, body) {
|
|
1999
2071
|
const url = `${this.baseUrl()}${endpoint}`;
|
|
2000
|
-
const timeout = this.
|
|
2072
|
+
const timeout = this.getConfig().timeoutMs ?? GROQ_TIMEOUTS.DEFAULT;
|
|
2001
2073
|
const controller = new AbortController();
|
|
2002
2074
|
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
2003
2075
|
this.pendingAbortControllers.add(controller);
|
|
@@ -2020,7 +2092,7 @@ var GroqHttpTransport = class {
|
|
|
2020
2092
|
buildHeaders() {
|
|
2021
2093
|
return {
|
|
2022
2094
|
[HTTP_HEADERS.CONTENT_TYPE]: HTTP_HEADERS.APPLICATION_JSON,
|
|
2023
|
-
[HTTP_HEADERS.AUTHORIZATION]: `${HTTP_HEADERS.BEARER_PREFIX}${this.
|
|
2095
|
+
[HTTP_HEADERS.AUTHORIZATION]: `${HTTP_HEADERS.BEARER_PREFIX}${this.getConfig().apiKey}`
|
|
2024
2096
|
};
|
|
2025
2097
|
}
|
|
2026
2098
|
async throwFromErrorResponse(response) {
|
|
@@ -2064,21 +2136,40 @@ var GroqHttpTransport = class {
|
|
|
2064
2136
|
|
|
2065
2137
|
// src/providers/groq/groq-http-client.ts
|
|
2066
2138
|
var GroqHttpClient = class {
|
|
2139
|
+
configStore;
|
|
2067
2140
|
transport;
|
|
2068
2141
|
executor;
|
|
2069
|
-
constructor(
|
|
2070
|
-
|
|
2142
|
+
constructor(configOrDeps, maybeDeps = {}) {
|
|
2143
|
+
const isConfig = typeof configOrDeps === "object" && configOrDeps !== null && "apiKey" in configOrDeps && typeof configOrDeps.apiKey === "string";
|
|
2144
|
+
const deps = isConfig ? maybeDeps : configOrDeps ?? {};
|
|
2145
|
+
this.configStore = deps.configStore ?? new GroqConfigStore();
|
|
2146
|
+
if (isConfig) {
|
|
2147
|
+
this.configStore.initialize(configOrDeps);
|
|
2148
|
+
}
|
|
2149
|
+
this.transport = deps.transport ?? new GroqHttpTransport(this.configStore);
|
|
2071
2150
|
const retryManager2 = deps.retryManager ?? new RetryManager();
|
|
2072
2151
|
const queue = deps.queue ?? new RequestQueue();
|
|
2073
2152
|
const deduplicator = deps.deduplicator ?? new RequestDeduplicator();
|
|
2074
2153
|
this.executor = new CompositeExecutor([
|
|
2075
2154
|
new DedupeExecutor(deduplicator, {
|
|
2076
|
-
generateKey: (request) => deduplicatorKey(request,
|
|
2155
|
+
generateKey: (request) => deduplicatorKey(request, this.configStore.isInitialized() ? this.configStore.get().apiKey : "")
|
|
2077
2156
|
}),
|
|
2078
2157
|
new RetryExecutor(retryManager2),
|
|
2079
2158
|
new QueueExecutor(queue, QUEUE_PRIORITY_USER_REQUEST)
|
|
2080
2159
|
]);
|
|
2081
2160
|
}
|
|
2161
|
+
initialize(config) {
|
|
2162
|
+
this.configStore.initialize(config);
|
|
2163
|
+
}
|
|
2164
|
+
isInitialized() {
|
|
2165
|
+
return this.configStore.isInitialized();
|
|
2166
|
+
}
|
|
2167
|
+
getApiKey() {
|
|
2168
|
+
return this.configStore.get().apiKey;
|
|
2169
|
+
}
|
|
2170
|
+
setApiKey(apiKey) {
|
|
2171
|
+
this.configStore.setApiKey(apiKey);
|
|
2172
|
+
}
|
|
2082
2173
|
cancelPendingRequests() {
|
|
2083
2174
|
this.transport.cancelPendingRequests();
|
|
2084
2175
|
}
|
|
@@ -2091,6 +2182,10 @@ var GroqHttpClient = class {
|
|
|
2091
2182
|
streamChatCompletion(request, options) {
|
|
2092
2183
|
return this.transport.streamChatCompletion(request, options);
|
|
2093
2184
|
}
|
|
2185
|
+
reset() {
|
|
2186
|
+
this.transport.cancelPendingRequests();
|
|
2187
|
+
this.configStore.reset();
|
|
2188
|
+
}
|
|
2094
2189
|
};
|
|
2095
2190
|
function deduplicatorKey(request, apiKey) {
|
|
2096
2191
|
const { model, messages, stream: _stream, ...rest } = request;
|
|
@@ -2967,6 +3062,278 @@ function createAI(config = {}) {
|
|
|
2967
3062
|
return factory;
|
|
2968
3063
|
}
|
|
2969
3064
|
|
|
3065
|
+
// src/providers/groq/groq-messages.ts
|
|
3066
|
+
var createUserMessage = (content) => ({
|
|
3067
|
+
role: "user",
|
|
3068
|
+
content
|
|
3069
|
+
});
|
|
3070
|
+
var createAssistantMessage = (content) => ({
|
|
3071
|
+
role: "assistant",
|
|
3072
|
+
content
|
|
3073
|
+
});
|
|
3074
|
+
var createSystemMessage = (content) => ({
|
|
3075
|
+
role: "system",
|
|
3076
|
+
content
|
|
3077
|
+
});
|
|
3078
|
+
var createMessage = (role, content) => ({
|
|
3079
|
+
role,
|
|
3080
|
+
content
|
|
3081
|
+
});
|
|
3082
|
+
var promptToMessages = (prompt) => [
|
|
3083
|
+
createUserMessage(prompt)
|
|
3084
|
+
];
|
|
3085
|
+
var extractTextFromMessages = (messages) => messages.map((m) => m.content).join("\n\n");
|
|
3086
|
+
var formatMessagesForDisplay = (messages) => messages.map((m) => `[${m.role.toUpperCase()}]: ${m.content}`).join("\n\n---\n\n");
|
|
3087
|
+
|
|
3088
|
+
// src/providers/groq/groq-structured-json.ts
|
|
3089
|
+
async function requestStructuredJson(client, request) {
|
|
3090
|
+
const chatRequest = {
|
|
3091
|
+
model: request.model,
|
|
3092
|
+
messages: [createUserMessage(request.instructions)],
|
|
3093
|
+
temperature: request.temperature,
|
|
3094
|
+
max_tokens: request.maxTokens,
|
|
3095
|
+
response_format: { type: "json_object" },
|
|
3096
|
+
...request.reasoningEffort !== void 0 ? { reasoning_effort: request.reasoningEffort } : {}
|
|
3097
|
+
};
|
|
3098
|
+
const response = await client.postChatCompletion(chatRequest);
|
|
3099
|
+
const content = response.choices[0]?.message?.content ?? "";
|
|
3100
|
+
const candidate = extractJsonCandidate(content);
|
|
3101
|
+
try {
|
|
3102
|
+
return JSON.parse(candidate);
|
|
3103
|
+
} catch (err) {
|
|
3104
|
+
throw new GroqError(
|
|
3105
|
+
"UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
|
|
3106
|
+
"model response contained no parsable json object",
|
|
3107
|
+
err instanceof Error ? err : void 0
|
|
3108
|
+
);
|
|
3109
|
+
}
|
|
3110
|
+
}
|
|
3111
|
+
|
|
3112
|
+
// src/providers/groq/text-generation.service.ts
|
|
3113
|
+
var STRUCTURED_OUTPUT_TEMPERATURE = 0.1;
|
|
3114
|
+
var TextGenerationService = class {
|
|
3115
|
+
constructor(httpClient, cache = new CacheManager(), defaultModel = DEFAULT_MODELS.TEXT) {
|
|
3116
|
+
this.httpClient = httpClient;
|
|
3117
|
+
this.cache = cache;
|
|
3118
|
+
this.defaultModel = defaultModel;
|
|
3119
|
+
}
|
|
3120
|
+
httpClient;
|
|
3121
|
+
cache;
|
|
3122
|
+
defaultModel;
|
|
3123
|
+
id = "groq-text-generation";
|
|
3124
|
+
name = "Groq Text Generation";
|
|
3125
|
+
capabilities = ["text"];
|
|
3126
|
+
jsonParser = new JsonResponseParser();
|
|
3127
|
+
generateCompletion(prompt, options = {}) {
|
|
3128
|
+
const model = options.model ?? this.defaultModel;
|
|
3129
|
+
return this.executeWithCache(
|
|
3130
|
+
{
|
|
3131
|
+
type: CACHE_KEY_TYPE_COMPLETION,
|
|
3132
|
+
model,
|
|
3133
|
+
prompt,
|
|
3134
|
+
config: options.generationConfig
|
|
3135
|
+
},
|
|
3136
|
+
async () => {
|
|
3137
|
+
const request = GroqChatRequestBuilder.for(model).withMessages([createUserMessage(prompt)]).withConfig(options.generationConfig).build();
|
|
3138
|
+
const response = await this.httpClient.postChatCompletion(request);
|
|
3139
|
+
return this.extractContent(response.choices[0]?.message?.content);
|
|
3140
|
+
}
|
|
3141
|
+
);
|
|
3142
|
+
}
|
|
3143
|
+
generateChatCompletion(messages, options = {}) {
|
|
3144
|
+
const model = options.model ?? this.defaultModel;
|
|
3145
|
+
return this.executeWithCache(
|
|
3146
|
+
{
|
|
3147
|
+
type: CACHE_KEY_TYPE_CHAT,
|
|
3148
|
+
model,
|
|
3149
|
+
messages: [...messages],
|
|
3150
|
+
config: options.generationConfig
|
|
3151
|
+
},
|
|
3152
|
+
async () => {
|
|
3153
|
+
const request = GroqChatRequestBuilder.for(model).withMessages(messages).withConfig(options.generationConfig).build();
|
|
3154
|
+
const response = await this.httpClient.postChatCompletion(request);
|
|
3155
|
+
return this.extractContent(response.choices[0]?.message?.content);
|
|
3156
|
+
}
|
|
3157
|
+
);
|
|
3158
|
+
}
|
|
3159
|
+
generateStructured(promptOrRequest, options) {
|
|
3160
|
+
if (typeof promptOrRequest === "string") {
|
|
3161
|
+
const model2 = options?.model ?? this.defaultModel;
|
|
3162
|
+
const jsonPrompt = StructuredPromptBuilder.for(promptOrRequest).withSchema(options?.schema).build();
|
|
3163
|
+
const request = GroqChatRequestBuilder.for(model2).withMessages([createUserMessage(jsonPrompt)]).withConfig({
|
|
3164
|
+
...options?.generationConfig,
|
|
3165
|
+
temperature: STRUCTURED_OUTPUT_TEMPERATURE
|
|
3166
|
+
}).build();
|
|
3167
|
+
return this.httpClient.postChatCompletion(request).then((response) => {
|
|
3168
|
+
const content = this.extractContent(response.choices[0]?.message?.content);
|
|
3169
|
+
return this.jsonParser.parse(content);
|
|
3170
|
+
});
|
|
3171
|
+
}
|
|
3172
|
+
const req = promptOrRequest;
|
|
3173
|
+
const model = req.model ?? (req.tier ? this.resolveModel(req.tier) : this.defaultModel);
|
|
3174
|
+
const schemaObj = req.schema;
|
|
3175
|
+
const messages = [];
|
|
3176
|
+
if (req.systemPrompt) {
|
|
3177
|
+
messages.push({ role: "system", content: req.systemPrompt });
|
|
3178
|
+
}
|
|
3179
|
+
for (const m of req.messages) {
|
|
3180
|
+
messages.push({ role: m.role, content: m.content });
|
|
3181
|
+
}
|
|
3182
|
+
const lastMsg = messages[messages.length - 1];
|
|
3183
|
+
if (lastMsg) {
|
|
3184
|
+
const structuredPrompt = StructuredPromptBuilder.for(lastMsg.content).withSchema(schemaObj).build();
|
|
3185
|
+
messages[messages.length - 1] = { ...lastMsg, content: structuredPrompt };
|
|
3186
|
+
}
|
|
3187
|
+
const groqReq = GroqChatRequestBuilder.for(model).withMessages(messages).withConfig({
|
|
3188
|
+
temperature: req.temperature ?? STRUCTURED_OUTPUT_TEMPERATURE,
|
|
3189
|
+
maxTokens: req.maxTokens
|
|
3190
|
+
}).build();
|
|
3191
|
+
return this.httpClient.postChatCompletion(groqReq).then((response) => {
|
|
3192
|
+
const content = this.extractContent(response.choices[0]?.message?.content);
|
|
3193
|
+
const parsed = this.jsonParser.parse(content);
|
|
3194
|
+
const genResult = {
|
|
3195
|
+
text: content,
|
|
3196
|
+
model: response.model,
|
|
3197
|
+
providerId: this.id,
|
|
3198
|
+
finishReason: response.choices[0]?.finish_reason ?? "stop",
|
|
3199
|
+
usage: response.usage ? {
|
|
3200
|
+
inputTokens: response.usage.prompt_tokens,
|
|
3201
|
+
outputTokens: response.usage.completion_tokens,
|
|
3202
|
+
totalTokens: response.usage.total_tokens
|
|
3203
|
+
} : void 0
|
|
3204
|
+
};
|
|
3205
|
+
return { value: parsed, result: genResult };
|
|
3206
|
+
});
|
|
3207
|
+
}
|
|
3208
|
+
streamCompletion(prompt, callbacks, options = {}) {
|
|
3209
|
+
return this.streamChatCompletion([createUserMessage(prompt)], callbacks, options);
|
|
3210
|
+
}
|
|
3211
|
+
async streamChatCompletion(messages, callbacks, options = {}) {
|
|
3212
|
+
const model = options.model ?? this.defaultModel;
|
|
3213
|
+
const request = GroqChatRequestBuilder.for(model).withMessages(messages).withConfig(options.generationConfig).withStream(true).build();
|
|
3214
|
+
const parser = new StreamingResponseParser(
|
|
3215
|
+
{
|
|
3216
|
+
onChunk: (chunk) => callbacks.onChunk?.(chunk)
|
|
3217
|
+
},
|
|
3218
|
+
extractContentFromSsePayload
|
|
3219
|
+
);
|
|
3220
|
+
try {
|
|
3221
|
+
const stream = await this.httpClient.streamChatCompletion(request, {
|
|
3222
|
+
signal: options.signal
|
|
3223
|
+
});
|
|
3224
|
+
const fullText = await parser.parse(stream);
|
|
3225
|
+
callbacks.onComplete?.(fullText);
|
|
3226
|
+
return fullText;
|
|
3227
|
+
} catch (error) {
|
|
3228
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
3229
|
+
callbacks.onError?.(err);
|
|
3230
|
+
throw err;
|
|
3231
|
+
}
|
|
3232
|
+
}
|
|
3233
|
+
clearCache() {
|
|
3234
|
+
this.cache.clear();
|
|
3235
|
+
}
|
|
3236
|
+
// --- ITextProvider implementation ---
|
|
3237
|
+
resolveModel(tier) {
|
|
3238
|
+
return GROQ_TIERS[tier] ?? this.defaultModel;
|
|
3239
|
+
}
|
|
3240
|
+
async generate(request) {
|
|
3241
|
+
const messages = [];
|
|
3242
|
+
if (request.systemPrompt) {
|
|
3243
|
+
messages.push({ role: "system", content: request.systemPrompt });
|
|
3244
|
+
}
|
|
3245
|
+
for (const m of request.messages) {
|
|
3246
|
+
messages.push({ role: m.role, content: m.content });
|
|
3247
|
+
}
|
|
3248
|
+
const model = request.model ?? (request.tier ? this.resolveModel(request.tier) : this.defaultModel);
|
|
3249
|
+
const groqReq = GroqChatRequestBuilder.for(model).withMessages(messages).withConfig({
|
|
3250
|
+
temperature: request.temperature,
|
|
3251
|
+
maxTokens: request.maxTokens
|
|
3252
|
+
}).build();
|
|
3253
|
+
const resp = await this.httpClient.postChatCompletion(groqReq);
|
|
3254
|
+
const content = resp.choices[0]?.message?.content ?? "";
|
|
3255
|
+
return {
|
|
3256
|
+
text: content,
|
|
3257
|
+
finishReason: resp.choices[0]?.finish_reason ?? "stop",
|
|
3258
|
+
model: resp.model,
|
|
3259
|
+
providerId: this.id,
|
|
3260
|
+
usage: resp.usage ? {
|
|
3261
|
+
inputTokens: resp.usage.prompt_tokens,
|
|
3262
|
+
outputTokens: resp.usage.completion_tokens,
|
|
3263
|
+
totalTokens: resp.usage.total_tokens
|
|
3264
|
+
} : void 0
|
|
3265
|
+
};
|
|
3266
|
+
}
|
|
3267
|
+
async stream(request, callbacks) {
|
|
3268
|
+
const messages = [];
|
|
3269
|
+
if (request.systemPrompt) {
|
|
3270
|
+
messages.push({ role: "system", content: request.systemPrompt });
|
|
3271
|
+
}
|
|
3272
|
+
for (const m of request.messages) {
|
|
3273
|
+
messages.push({ role: m.role, content: m.content });
|
|
3274
|
+
}
|
|
3275
|
+
const model = request.model ?? (request.tier ? this.resolveModel(request.tier) : this.defaultModel);
|
|
3276
|
+
const text = await this.streamChatCompletion(
|
|
3277
|
+
messages,
|
|
3278
|
+
{
|
|
3279
|
+
onChunk: callbacks.onChunk,
|
|
3280
|
+
onError: callbacks.onError
|
|
3281
|
+
},
|
|
3282
|
+
{
|
|
3283
|
+
model,
|
|
3284
|
+
signal: request.signal,
|
|
3285
|
+
generationConfig: {
|
|
3286
|
+
temperature: request.temperature,
|
|
3287
|
+
maxTokens: request.maxTokens
|
|
3288
|
+
}
|
|
3289
|
+
}
|
|
3290
|
+
);
|
|
3291
|
+
const result = {
|
|
3292
|
+
text,
|
|
3293
|
+
finishReason: "stop",
|
|
3294
|
+
model,
|
|
3295
|
+
providerId: this.id
|
|
3296
|
+
};
|
|
3297
|
+
callbacks.onComplete?.(result);
|
|
3298
|
+
return result;
|
|
3299
|
+
}
|
|
3300
|
+
async countTokens(text) {
|
|
3301
|
+
return Math.max(1, Math.ceil(text.length / 4));
|
|
3302
|
+
}
|
|
3303
|
+
async estimateCost(_request) {
|
|
3304
|
+
return 0;
|
|
3305
|
+
}
|
|
3306
|
+
async healthCheck() {
|
|
3307
|
+
try {
|
|
3308
|
+
await this.generateCompletion("ping", {
|
|
3309
|
+
generationConfig: { maxTokens: 1 }
|
|
3310
|
+
});
|
|
3311
|
+
return "healthy";
|
|
3312
|
+
} catch {
|
|
3313
|
+
return "unavailable";
|
|
3314
|
+
}
|
|
3315
|
+
}
|
|
3316
|
+
async executeWithCache(params, factory) {
|
|
3317
|
+
const key = this.cache.generateKey(params);
|
|
3318
|
+
const cached = this.cache.get(key);
|
|
3319
|
+
if (cached !== null) {
|
|
3320
|
+
return cached;
|
|
3321
|
+
}
|
|
3322
|
+
const result = await factory();
|
|
3323
|
+
this.cache.set(key, result);
|
|
3324
|
+
return result;
|
|
3325
|
+
}
|
|
3326
|
+
extractContent(content) {
|
|
3327
|
+
if (!content) {
|
|
3328
|
+
throw new GroqError(
|
|
3329
|
+
"UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
|
|
3330
|
+
"No content generated from Groq API"
|
|
3331
|
+
);
|
|
3332
|
+
}
|
|
3333
|
+
return content;
|
|
3334
|
+
}
|
|
3335
|
+
};
|
|
3336
|
+
|
|
2970
3337
|
// src/core/calculations/random-base36-suffix.ts
|
|
2971
3338
|
var BASE_36_RADIX = 36;
|
|
2972
3339
|
var DECIMAL_OFFSET = 2;
|
|
@@ -3194,12 +3561,37 @@ function readNumber(source, keys) {
|
|
|
3194
3561
|
return null;
|
|
3195
3562
|
}
|
|
3196
3563
|
|
|
3564
|
+
// src/providers/groq/groq-container.ts
|
|
3565
|
+
var container = null;
|
|
3566
|
+
function configureProvider(config) {
|
|
3567
|
+
const configStore = new GroqConfigStore();
|
|
3568
|
+
const transport = new GroqHttpTransport(configStore);
|
|
3569
|
+
const httpClient = new GroqHttpClient({ configStore, transport });
|
|
3570
|
+
httpClient.initialize(config);
|
|
3571
|
+
const textGeneration = new TextGenerationService(
|
|
3572
|
+
httpClient,
|
|
3573
|
+
new CacheManager(),
|
|
3574
|
+
config.textModel
|
|
3575
|
+
);
|
|
3576
|
+
const chat = new ChatService(textGeneration);
|
|
3577
|
+
container = { groqHttpClient: httpClient, textGeneration, chat };
|
|
3578
|
+
return container;
|
|
3579
|
+
}
|
|
3580
|
+
function getProvider() {
|
|
3581
|
+
return container;
|
|
3582
|
+
}
|
|
3583
|
+
function resetProvider() {
|
|
3584
|
+
container?.groqHttpClient.reset();
|
|
3585
|
+
container = null;
|
|
3586
|
+
}
|
|
3587
|
+
|
|
3197
3588
|
exports.AIError = AIError;
|
|
3198
3589
|
exports.AIErrorType = AIErrorType;
|
|
3199
3590
|
exports.ANTHROPIC_API_VERSION = ANTHROPIC_API_VERSION;
|
|
3200
3591
|
exports.ANTHROPIC_DEFAULT_MAX_TOKENS = ANTHROPIC_DEFAULT_MAX_TOKENS;
|
|
3201
3592
|
exports.ANTHROPIC_MODELS = ANTHROPIC_MODELS;
|
|
3202
3593
|
exports.ANTHROPIC_TIERS = ANTHROPIC_TIERS;
|
|
3594
|
+
exports.API_ENDPOINTS = API_ENDPOINTS;
|
|
3203
3595
|
exports.AnthropicHttpTransport = AnthropicHttpTransport;
|
|
3204
3596
|
exports.AnthropicProvider = AnthropicProvider;
|
|
3205
3597
|
exports.AnthropicRequestBuilder = AnthropicRequestBuilder;
|
|
@@ -3209,8 +3601,11 @@ exports.ChatIdGenerator = ChatIdGenerator;
|
|
|
3209
3601
|
exports.ChatService = ChatService;
|
|
3210
3602
|
exports.CompositeExecutor = CompositeExecutor;
|
|
3211
3603
|
exports.DEFAULT_API_KEY_RULE = DEFAULT_API_KEY_RULE;
|
|
3604
|
+
exports.DEFAULT_BASE_URL = DEFAULT_BASE_URL;
|
|
3212
3605
|
exports.DEFAULT_ERROR_CLASSIFICATION_RULE = DEFAULT_ERROR_CLASSIFICATION_RULE;
|
|
3606
|
+
exports.DEFAULT_GENERATION_CONFIG = DEFAULT_GENERATION_CONFIG;
|
|
3213
3607
|
exports.DEFAULT_HTTP_STATUS_RULE = DEFAULT_HTTP_STATUS_RULE;
|
|
3608
|
+
exports.DEFAULT_MODELS = DEFAULT_MODELS;
|
|
3214
3609
|
exports.DEFAULT_PROMPT_STRATEGY = DEFAULT_PROMPT_STRATEGY;
|
|
3215
3610
|
exports.DEFAULT_RETRY_BACKOFF_MULTIPLIER = DEFAULT_RETRY_BACKOFF_MULTIPLIER;
|
|
3216
3611
|
exports.DEFAULT_RETRY_INITIAL_DELAY_MS = DEFAULT_RETRY_INITIAL_DELAY_MS;
|
|
@@ -3225,6 +3620,9 @@ exports.GROQ_MODELS = GROQ_MODELS;
|
|
|
3225
3620
|
exports.GROQ_TIERS = GROQ_TIERS;
|
|
3226
3621
|
exports.GeminiProvider = GeminiProvider;
|
|
3227
3622
|
exports.GroqChatRequestBuilder = GroqChatRequestBuilder;
|
|
3623
|
+
exports.GroqConfigStore = GroqConfigStore;
|
|
3624
|
+
exports.GroqError = GroqError;
|
|
3625
|
+
exports.GroqErrorType = AIErrorType;
|
|
3228
3626
|
exports.GroqHttpClient = GroqHttpClient;
|
|
3229
3627
|
exports.GroqHttpTransport = GroqHttpTransport;
|
|
3230
3628
|
exports.GroqProvider = GroqProvider;
|
|
@@ -3245,6 +3643,8 @@ exports.SSE_PREFIX = SSE_PREFIX;
|
|
|
3245
3643
|
exports.StreamingResponseParser = StreamingResponseParser;
|
|
3246
3644
|
exports.StructuredPromptBuilder = StructuredPromptBuilder;
|
|
3247
3645
|
exports.TEXT_TIERS = TEXT_TIERS;
|
|
3646
|
+
exports.TIMEOUTS = TIMEOUTS;
|
|
3647
|
+
exports.TextGenerationService = TextGenerationService;
|
|
3248
3648
|
exports.ThrottleManager = ThrottleManager;
|
|
3249
3649
|
exports.USER_FRIENDLY_ERROR_MESSAGES = USER_FRIENDLY_ERROR_MESSAGES;
|
|
3250
3650
|
exports.asObjectArray = asObjectArray;
|
|
@@ -3257,13 +3657,18 @@ exports.cacheManager = cacheManager;
|
|
|
3257
3657
|
exports.chatIdGenerator = chatIdGenerator;
|
|
3258
3658
|
exports.clampScore = clampScore;
|
|
3259
3659
|
exports.classifyHttpStatus = classifyHttpStatus;
|
|
3660
|
+
exports.configureProvider = configureProvider;
|
|
3260
3661
|
exports.consumeAnthropicStream = consumeAnthropicStream;
|
|
3261
3662
|
exports.consumeGroqStream = consumeGroqStream;
|
|
3262
3663
|
exports.createAI = createAI;
|
|
3664
|
+
exports.createAssistantMessage = createAssistantMessage;
|
|
3263
3665
|
exports.createFalProvider = createFalProvider;
|
|
3264
3666
|
exports.createGeminiProvider = createGeminiProvider;
|
|
3667
|
+
exports.createMessage = createMessage;
|
|
3265
3668
|
exports.createPrunaProvider = createPrunaProvider;
|
|
3266
3669
|
exports.createSseResponse = createSseResponse;
|
|
3670
|
+
exports.createSystemMessage = createSystemMessage;
|
|
3671
|
+
exports.createUserMessage = createUserMessage;
|
|
3267
3672
|
exports.debounce = debounce;
|
|
3268
3673
|
exports.debounceManager = debounceManager;
|
|
3269
3674
|
exports.defaultEffortForModel = defaultEffortForModel;
|
|
@@ -3276,9 +3681,12 @@ exports.extractJsonCandidate = extractJsonCandidate;
|
|
|
3276
3681
|
exports.extractJsonFromCodeFence = extractJsonFromCodeFence;
|
|
3277
3682
|
exports.extractJsonObject = extractJsonObject;
|
|
3278
3683
|
exports.extractSseDataPayload = extractSseDataPayload;
|
|
3684
|
+
exports.extractTextFromMessages = extractTextFromMessages;
|
|
3279
3685
|
exports.extractTokenUsage = extractTokenUsage;
|
|
3280
3686
|
exports.formatErrorForLogging = formatErrorForLogging;
|
|
3687
|
+
exports.formatMessagesForDisplay = formatMessagesForDisplay;
|
|
3281
3688
|
exports.generateWithPruna = generateWithPruna;
|
|
3689
|
+
exports.getProvider = getProvider;
|
|
3282
3690
|
exports.isAuthErrorType = isAuthErrorType;
|
|
3283
3691
|
exports.isMediaProvider = isMediaProvider;
|
|
3284
3692
|
exports.isRetryableErrorType = isRetryableErrorType;
|
|
@@ -3292,9 +3700,12 @@ exports.mergeTierOverrides = mergeTierOverrides;
|
|
|
3292
3700
|
exports.messageFormatter = messageFormatter;
|
|
3293
3701
|
exports.normalizeSseChunk = normalizeSseChunk;
|
|
3294
3702
|
exports.oneOfCatalog = oneOfCatalog;
|
|
3703
|
+
exports.promptToMessages = promptToMessages;
|
|
3295
3704
|
exports.repairCommonJsonDefects = repairCommonJsonDefects;
|
|
3296
3705
|
exports.requestDeduplicator = requestDeduplicator;
|
|
3297
3706
|
exports.requestQueue = requestQueue;
|
|
3707
|
+
exports.requestStructuredJson = requestStructuredJson;
|
|
3708
|
+
exports.resetProvider = resetProvider;
|
|
3298
3709
|
exports.resolveModel = resolveModel;
|
|
3299
3710
|
exports.resolveUserFriendlyErrorMessage = resolveUserFriendlyErrorMessage;
|
|
3300
3711
|
exports.resolveUserFriendlyMessage = resolveUserFriendlyMessage;
|