@umituz/web-ai 1.0.8 → 1.0.10
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/{AIErrors-CSk4nvN1.d.ts → AIErrors-TuSFl--T.d.ts} +1 -1
- package/dist/{AIErrors-Dq9o95R_.d.cts → AIErrors-_IyXRWj1.d.cts} +1 -1
- package/dist/{cancellation-error-CpkPd67D.d.cts → cancellation-error-_39nYWwz.d.cts} +3 -3
- package/dist/{cancellation-error-Ci8fQhNF.d.ts → cancellation-error-hYcE9AS9.d.ts} +3 -3
- package/dist/chat/index.d.cts +4 -4
- package/dist/chat/index.d.ts +4 -4
- package/dist/{chat.service-BRtiA7H9.d.cts → chat.service-8MaW9pum.d.cts} +2 -2
- package/dist/{chat.service-Cqga2h1e.d.ts → chat.service-B4Isrckn.d.ts} +2 -2
- package/dist/content/index.d.cts +7 -7
- package/dist/content/index.d.ts +7 -7
- package/dist/core/index.cjs +90 -10
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +14 -27
- package/dist/core/index.d.ts +14 -27
- package/dist/core/index.js +86 -11
- package/dist/core/index.js.map +1 -1
- package/dist/{create-ai-DW7eHMBF.d.ts → create-ai-D-oEWzf9.d.ts} +3 -3
- package/dist/{create-ai-DeOpUgZ-.d.cts → create-ai-DRysRImc.d.cts} +3 -3
- package/dist/hooks/index.d.cts +9 -9
- package/dist/hooks/index.d.ts +9 -9
- package/dist/{index-Ca5o4gBK.d.ts → index-1e91KRYU.d.ts} +1 -1
- package/dist/{index-itgxPeLz.d.cts → index-Dv8gRzAu.d.cts} +1 -1
- package/dist/{index-DDzvTDg0.d.ts → index-OhvYUTXf.d.cts} +1 -2
- package/dist/{index-DDzvTDg0.d.cts → index-OhvYUTXf.d.ts} +1 -2
- package/dist/index.cjs +391 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -11
- package/dist/index.d.ts +11 -11
- package/dist/index.js +385 -13
- package/dist/index.js.map +1 -1
- package/dist/{provider.factory-CJuI08Xr.d.ts → provider.factory-B9RNUTYj.d.ts} +1 -1
- package/dist/{provider.factory-DG2CYFgh.d.cts → provider.factory-Ce6Een1G.d.cts} +1 -1
- package/dist/providers/index.cjs +381 -0
- package/dist/providers/index.cjs.map +1 -1
- package/dist/providers/index.d.cts +61 -11
- package/dist/providers/index.d.ts +61 -11
- package/dist/providers/index.js +380 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/{requestQueue-D-RCbxuR.d.ts → requestQueue-AP6n_bRH.d.ts} +4 -4
- package/dist/{requestQueue-O6f8VBl5.d.cts → requestQueue-D89wx91Q.d.cts} +4 -4
- package/dist/{request-deduplicator.util-NDo0_n1y.d.cts → tool-call-accumulator-C7KhaXZA.d.cts} +20 -1
- package/dist/{request-deduplicator.util-NDo0_n1y.d.ts → tool-call-accumulator-C7KhaXZA.d.ts} +20 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { b as TextTier } from './index-
|
|
2
|
-
import { e as ProviderFactory } from './provider.factory-
|
|
3
|
-
import { c as TierModelMap } from './index-
|
|
1
|
+
import { b as TextTier } from './index-OhvYUTXf.js';
|
|
2
|
+
import { e as ProviderFactory } from './provider.factory-B9RNUTYj.js';
|
|
3
|
+
import { c as TierModelMap } from './index-1e91KRYU.js';
|
|
4
4
|
import { c as GeminiConfig, F as FalConfig, P as PrunaConfig } from './ProviderConfig-DIFa9nmG.js';
|
|
5
5
|
|
|
6
6
|
declare const ANTHROPIC_MODELS: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { b as TextTier } from './index-
|
|
2
|
-
import { e as ProviderFactory } from './provider.factory-
|
|
3
|
-
import { c as TierModelMap } from './index-
|
|
1
|
+
import { b as TextTier } from './index-OhvYUTXf.cjs';
|
|
2
|
+
import { e as ProviderFactory } from './provider.factory-Ce6Een1G.cjs';
|
|
3
|
+
import { c as TierModelMap } from './index-Dv8gRzAu.cjs';
|
|
4
4
|
import { c as GeminiConfig, F as FalConfig, P as PrunaConfig } from './ProviderConfig-DIFa9nmG.cjs';
|
|
5
5
|
|
|
6
6
|
declare const ANTHROPIC_MODELS: {
|
package/dist/hooks/index.d.cts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { B as BlogGenerationRequest, G as GeneratedBlog, m as SocialContentRequest, h as GeneratedSocialContent, c as ContentTone, q as VideoScriptRequest, i as GeneratedVideoScript, b as ContentCalendarEntry, E as Emotion, f as ContentWizardStep, e as ContentWizardData, k as ImageWizardStep, j as ImageWizardData, s as VideoWizardStep, r as VideoWizardData } from '../index-BulSkB2L.cjs';
|
|
2
|
-
import { d as AIErrorCode, t as SentimentAnalysisResult, C as ContentAnalysisRequest, g as ContentAnalysisResult, S as SEOOptimizationRequest, q as SEOOptimizationResult, r as SEOScoreBreakdown, b as ABTestRequest, a as ABTestPrediction, A as ABTestComparison, G as GenerationResult, k as GenerationProgress, l as GenerationStatus, n as ImageGenerationInput, v as VideoGenerationInput, m as GenerationType, o as ImageQuality, w as VideoQuality } from '../AIErrors-
|
|
3
|
-
export { f as AspectRatio, h as CreditCost, i as GENERATION_COSTS, j as GenerationMetadata, x as calculateCreditCost } from '../AIErrors-
|
|
2
|
+
import { d as AIErrorCode, t as SentimentAnalysisResult, C as ContentAnalysisRequest, g as ContentAnalysisResult, S as SEOOptimizationRequest, q as SEOOptimizationResult, r as SEOScoreBreakdown, b as ABTestRequest, a as ABTestPrediction, A as ABTestComparison, G as GenerationResult, k as GenerationProgress, l as GenerationStatus, n as ImageGenerationInput, v as VideoGenerationInput, m as GenerationType, o as ImageQuality, w as VideoQuality } from '../AIErrors-_IyXRWj1.cjs';
|
|
3
|
+
export { f as AspectRatio, h as CreditCost, i as GENERATION_COSTS, j as GenerationMetadata, x as calculateCreditCost } from '../AIErrors-_IyXRWj1.cjs';
|
|
4
4
|
import { d as ProviderConfig, I as ImageGenerationRequest, G as GeneratedContent, V as VideoGenerationRequest, a as ImageToVideoRequest, b as VideoToVideoRequest } from '../ProviderConfig-DIFa9nmG.cjs';
|
|
5
|
-
import { c as ITextGenerator, d as ITextProvider, e as ProviderFactory } from '../provider.factory-
|
|
6
|
-
import { A as AIProviderConfig, q as GroqGenerationConfig } from '../create-ai-
|
|
7
|
-
import { b as TextTier } from '../index-
|
|
5
|
+
import { c as ITextGenerator, d as ITextProvider, e as ProviderFactory } from '../provider.factory-Ce6Een1G.cjs';
|
|
6
|
+
import { A as AIProviderConfig, q as GroqGenerationConfig } from '../create-ai-DRysRImc.cjs';
|
|
7
|
+
import { b as TextTier } from '../index-OhvYUTXf.cjs';
|
|
8
8
|
import { C as CacheManager, b as CacheStats } from '../cache-manager-Df9LLYGA.cjs';
|
|
9
|
-
import { d as ChatService, U as UseChatOptions, k as UseChatReturn } from '../chat.service-
|
|
10
|
-
import { T as TextGenerationService, j as PrunaResult, G as GenerateOptions, e as PrunaInput, a as GenerationStage } from '../cancellation-error-
|
|
11
|
-
export { C as CancellationError } from '../cancellation-error-
|
|
12
|
-
import '../index-
|
|
9
|
+
import { d as ChatService, U as UseChatOptions, k as UseChatReturn } from '../chat.service-8MaW9pum.cjs';
|
|
10
|
+
import { T as TextGenerationService, j as PrunaResult, G as GenerateOptions, e as PrunaInput, a as GenerationStage } from '../cancellation-error-_39nYWwz.cjs';
|
|
11
|
+
export { C as CancellationError } from '../cancellation-error-_39nYWwz.cjs';
|
|
12
|
+
import '../index-Dv8gRzAu.cjs';
|
|
13
13
|
|
|
14
14
|
/** Provider config for the underlying AIContentService — new AIProviderConfig,
|
|
15
15
|
* legacy ProviderConfig, or a custom ITextGenerator. */
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { B as BlogGenerationRequest, G as GeneratedBlog, m as SocialContentRequest, h as GeneratedSocialContent, c as ContentTone, q as VideoScriptRequest, i as GeneratedVideoScript, b as ContentCalendarEntry, E as Emotion, f as ContentWizardStep, e as ContentWizardData, k as ImageWizardStep, j as ImageWizardData, s as VideoWizardStep, r as VideoWizardData } from '../index-BUVULo3h.js';
|
|
2
|
-
import { d as AIErrorCode, t as SentimentAnalysisResult, C as ContentAnalysisRequest, g as ContentAnalysisResult, S as SEOOptimizationRequest, q as SEOOptimizationResult, r as SEOScoreBreakdown, b as ABTestRequest, a as ABTestPrediction, A as ABTestComparison, G as GenerationResult, k as GenerationProgress, l as GenerationStatus, n as ImageGenerationInput, v as VideoGenerationInput, m as GenerationType, o as ImageQuality, w as VideoQuality } from '../AIErrors-
|
|
3
|
-
export { f as AspectRatio, h as CreditCost, i as GENERATION_COSTS, j as GenerationMetadata, x as calculateCreditCost } from '../AIErrors-
|
|
2
|
+
import { d as AIErrorCode, t as SentimentAnalysisResult, C as ContentAnalysisRequest, g as ContentAnalysisResult, S as SEOOptimizationRequest, q as SEOOptimizationResult, r as SEOScoreBreakdown, b as ABTestRequest, a as ABTestPrediction, A as ABTestComparison, G as GenerationResult, k as GenerationProgress, l as GenerationStatus, n as ImageGenerationInput, v as VideoGenerationInput, m as GenerationType, o as ImageQuality, w as VideoQuality } from '../AIErrors-TuSFl--T.js';
|
|
3
|
+
export { f as AspectRatio, h as CreditCost, i as GENERATION_COSTS, j as GenerationMetadata, x as calculateCreditCost } from '../AIErrors-TuSFl--T.js';
|
|
4
4
|
import { d as ProviderConfig, I as ImageGenerationRequest, G as GeneratedContent, V as VideoGenerationRequest, a as ImageToVideoRequest, b as VideoToVideoRequest } from '../ProviderConfig-DIFa9nmG.js';
|
|
5
|
-
import { c as ITextGenerator, d as ITextProvider, e as ProviderFactory } from '../provider.factory-
|
|
6
|
-
import { A as AIProviderConfig, q as GroqGenerationConfig } from '../create-ai-
|
|
7
|
-
import { b as TextTier } from '../index-
|
|
5
|
+
import { c as ITextGenerator, d as ITextProvider, e as ProviderFactory } from '../provider.factory-B9RNUTYj.js';
|
|
6
|
+
import { A as AIProviderConfig, q as GroqGenerationConfig } from '../create-ai-D-oEWzf9.js';
|
|
7
|
+
import { b as TextTier } from '../index-OhvYUTXf.js';
|
|
8
8
|
import { C as CacheManager, b as CacheStats } from '../cache-manager-Df9LLYGA.js';
|
|
9
|
-
import { d as ChatService, U as UseChatOptions, k as UseChatReturn } from '../chat.service-
|
|
10
|
-
import { T as TextGenerationService, j as PrunaResult, G as GenerateOptions, e as PrunaInput, a as GenerationStage } from '../cancellation-error-
|
|
11
|
-
export { C as CancellationError } from '../cancellation-error-
|
|
12
|
-
import '../index-
|
|
9
|
+
import { d as ChatService, U as UseChatOptions, k as UseChatReturn } from '../chat.service-B4Isrckn.js';
|
|
10
|
+
import { T as TextGenerationService, j as PrunaResult, G as GenerateOptions, e as PrunaInput, a as GenerationStage } from '../cancellation-error-hYcE9AS9.js';
|
|
11
|
+
export { C as CancellationError } from '../cancellation-error-hYcE9AS9.js';
|
|
12
|
+
import '../index-1e91KRYU.js';
|
|
13
13
|
|
|
14
14
|
/** Provider config for the underlying AIContentService — new AIProviderConfig,
|
|
15
15
|
* legacy ProviderConfig, or a custom ITextGenerator. */
|
|
@@ -13,8 +13,8 @@ interface TokenUsage {
|
|
|
13
13
|
readonly inputTokens: number;
|
|
14
14
|
readonly outputTokens: number;
|
|
15
15
|
readonly totalTokens?: number;
|
|
16
|
+
readonly reasoningTokens?: number;
|
|
16
17
|
}
|
|
17
|
-
/** What every text-generating method returns — usage is never discarded. */
|
|
18
18
|
interface GenerationResult {
|
|
19
19
|
readonly text: string;
|
|
20
20
|
readonly usage?: TokenUsage;
|
|
@@ -22,7 +22,6 @@ interface GenerationResult {
|
|
|
22
22
|
readonly providerId: string;
|
|
23
23
|
readonly finishReason?: FinishReason;
|
|
24
24
|
}
|
|
25
|
-
/** Universal chat message shape; providers translate to their own wire format. */
|
|
26
25
|
interface ChatMessage {
|
|
27
26
|
readonly role: "system" | "user" | "assistant";
|
|
28
27
|
readonly content: string;
|
|
@@ -13,8 +13,8 @@ interface TokenUsage {
|
|
|
13
13
|
readonly inputTokens: number;
|
|
14
14
|
readonly outputTokens: number;
|
|
15
15
|
readonly totalTokens?: number;
|
|
16
|
+
readonly reasoningTokens?: number;
|
|
16
17
|
}
|
|
17
|
-
/** What every text-generating method returns — usage is never discarded. */
|
|
18
18
|
interface GenerationResult {
|
|
19
19
|
readonly text: string;
|
|
20
20
|
readonly usage?: TokenUsage;
|
|
@@ -22,7 +22,6 @@ interface GenerationResult {
|
|
|
22
22
|
readonly providerId: string;
|
|
23
23
|
readonly finishReason?: FinishReason;
|
|
24
24
|
}
|
|
25
|
-
/** Universal chat message shape; providers translate to their own wire format. */
|
|
26
25
|
interface ChatMessage {
|
|
27
26
|
readonly role: "system" | "user" | "assistant";
|
|
28
27
|
readonly content: string;
|
package/dist/index.cjs
CHANGED
|
@@ -1141,6 +1141,83 @@ ${paragraph}`;
|
|
|
1141
1141
|
return chunks.map((chunk) => chunk.length > maxChars ? chunk.slice(0, maxChars) : chunk).filter((chunk) => chunk.length > 0);
|
|
1142
1142
|
}
|
|
1143
1143
|
|
|
1144
|
+
// src/core/parsers/text-extract.ts
|
|
1145
|
+
var TEXT_MIME_PREFIX = "text/";
|
|
1146
|
+
var TEXT_MIME_TYPES = /* @__PURE__ */ new Set([
|
|
1147
|
+
"application/json",
|
|
1148
|
+
"application/xml",
|
|
1149
|
+
"application/yaml",
|
|
1150
|
+
"application/x-yaml",
|
|
1151
|
+
"application/javascript",
|
|
1152
|
+
"application/typescript",
|
|
1153
|
+
"application/x-sh",
|
|
1154
|
+
"application/sql",
|
|
1155
|
+
"text/csv"
|
|
1156
|
+
]);
|
|
1157
|
+
var TEXT_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
1158
|
+
"txt",
|
|
1159
|
+
"md",
|
|
1160
|
+
"markdown",
|
|
1161
|
+
"csv",
|
|
1162
|
+
"tsv",
|
|
1163
|
+
"json",
|
|
1164
|
+
"xml",
|
|
1165
|
+
"yaml",
|
|
1166
|
+
"yml",
|
|
1167
|
+
"toml",
|
|
1168
|
+
"ini",
|
|
1169
|
+
"js",
|
|
1170
|
+
"mjs",
|
|
1171
|
+
"cjs",
|
|
1172
|
+
"ts",
|
|
1173
|
+
"tsx",
|
|
1174
|
+
"jsx",
|
|
1175
|
+
"py",
|
|
1176
|
+
"rb",
|
|
1177
|
+
"go",
|
|
1178
|
+
"rs",
|
|
1179
|
+
"java",
|
|
1180
|
+
"kt",
|
|
1181
|
+
"swift",
|
|
1182
|
+
"c",
|
|
1183
|
+
"h",
|
|
1184
|
+
"cpp",
|
|
1185
|
+
"hpp",
|
|
1186
|
+
"cs",
|
|
1187
|
+
"php",
|
|
1188
|
+
"sh",
|
|
1189
|
+
"bash",
|
|
1190
|
+
"zsh",
|
|
1191
|
+
"sql",
|
|
1192
|
+
"html",
|
|
1193
|
+
"css",
|
|
1194
|
+
"scss",
|
|
1195
|
+
"env"
|
|
1196
|
+
]);
|
|
1197
|
+
var TEXT_EXTRACT_PER_FILE_LIMIT = 24e3;
|
|
1198
|
+
var TEXT_EXTRACT_TOTAL_LIMIT = 48e3;
|
|
1199
|
+
function isTextLike(mimeType, name) {
|
|
1200
|
+
if (mimeType.startsWith(TEXT_MIME_PREFIX) || TEXT_MIME_TYPES.has(mimeType)) return true;
|
|
1201
|
+
const extension = name.split(".").pop()?.toLowerCase() ?? "";
|
|
1202
|
+
return TEXT_EXTENSIONS.has(extension);
|
|
1203
|
+
}
|
|
1204
|
+
function extractText(bytes) {
|
|
1205
|
+
let out = "";
|
|
1206
|
+
const decoder = new TextDecoder("utf-8", { fatal: false });
|
|
1207
|
+
const chunkSize = 65536;
|
|
1208
|
+
for (let offset = 0; offset < bytes.length; offset += chunkSize) {
|
|
1209
|
+
out += decoder.decode(bytes.subarray(offset, Math.min(offset + chunkSize, bytes.length)), {
|
|
1210
|
+
stream: offset + chunkSize < bytes.length
|
|
1211
|
+
});
|
|
1212
|
+
}
|
|
1213
|
+
return out.split("\0").join("");
|
|
1214
|
+
}
|
|
1215
|
+
function capText(text, limit) {
|
|
1216
|
+
if (text.length <= limit) return text;
|
|
1217
|
+
return `${text.slice(0, limit)}
|
|
1218
|
+
[truncated]`;
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1144
1221
|
// src/core/calculations/random-base36-suffix.ts
|
|
1145
1222
|
var BASE_36_RADIX = 36;
|
|
1146
1223
|
var DECIMAL_OFFSET = 2;
|
|
@@ -1376,17 +1453,19 @@ function buildSystemPrompt(input = {}) {
|
|
|
1376
1453
|
const now = input.now ?? /* @__PURE__ */ new Date();
|
|
1377
1454
|
const identity = input.identity ?? DEFAULT_AI_IDENTITY;
|
|
1378
1455
|
const parts = [identity, `Current date: ${now.toISOString().slice(0, 10)}.`];
|
|
1456
|
+
const projectName = input.project?.name;
|
|
1379
1457
|
const projectInstructions = input.project?.instructions?.trim();
|
|
1380
|
-
if (projectInstructions) {
|
|
1458
|
+
if (projectName && projectInstructions) {
|
|
1381
1459
|
parts.push(
|
|
1382
|
-
`The user is working inside the project "${
|
|
1460
|
+
`The user is working inside the project "${projectName}". Follow these project instructions:
|
|
1383
1461
|
${projectInstructions}`
|
|
1384
1462
|
);
|
|
1385
1463
|
}
|
|
1464
|
+
const agentName = input.agent?.name;
|
|
1386
1465
|
const agentInstructions = input.agent?.instructions?.trim();
|
|
1387
|
-
if (agentInstructions) {
|
|
1466
|
+
if (agentName && agentInstructions) {
|
|
1388
1467
|
parts.push(
|
|
1389
|
-
`You are operating as the agent "${
|
|
1468
|
+
`You are operating as the agent "${agentName}". Follow these agent instructions:
|
|
1390
1469
|
${agentInstructions}`
|
|
1391
1470
|
);
|
|
1392
1471
|
}
|
|
@@ -1588,11 +1667,7 @@ function resolveTimestamp(value) {
|
|
|
1588
1667
|
const parsed = Date.parse(value);
|
|
1589
1668
|
return Number.isNaN(parsed) ? 0 : parsed;
|
|
1590
1669
|
}
|
|
1591
|
-
function
|
|
1592
|
-
if (str.length <= maxLength) return str;
|
|
1593
|
-
return str.slice(0, Math.max(maxLength, 0));
|
|
1594
|
-
}
|
|
1595
|
-
function selectMemories(rows, maxItems = MEMORY_MAX_ITEMS, totalLimit = MEMORY_TOTAL_LIMIT) {
|
|
1670
|
+
function selectMemories(rows, maxItems = MEMORY_MAX_ITEMS, totalLimit = MEMORY_TOTAL_LIMIT, capper = capText) {
|
|
1596
1671
|
const ordered = [...rows].sort((a, b) => {
|
|
1597
1672
|
if (a.pinned !== b.pinned) return a.pinned ? -1 : 1;
|
|
1598
1673
|
return resolveTimestamp(b.updatedAt) - resolveTimestamp(a.updatedAt);
|
|
@@ -1603,7 +1678,7 @@ function selectMemories(rows, maxItems = MEMORY_MAX_ITEMS, totalLimit = MEMORY_T
|
|
|
1603
1678
|
if (out.length >= maxItems || used >= totalLimit) break;
|
|
1604
1679
|
const content = row.content.trim();
|
|
1605
1680
|
if (content.length === 0) continue;
|
|
1606
|
-
const capped =
|
|
1681
|
+
const capped = capper(content, totalLimit - used);
|
|
1607
1682
|
out.push(capped);
|
|
1608
1683
|
used += capped.length;
|
|
1609
1684
|
}
|
|
@@ -2602,7 +2677,7 @@ var AnthropicProvider = class {
|
|
|
2602
2677
|
}
|
|
2603
2678
|
}
|
|
2604
2679
|
toGenerationResult(response, fallbackModel) {
|
|
2605
|
-
const text =
|
|
2680
|
+
const text = extractText2(response.content);
|
|
2606
2681
|
const finishReason = mapAnthropicStopReason(response.stop_reason);
|
|
2607
2682
|
if (text.length === 0) {
|
|
2608
2683
|
if (finishReason === "refusal") {
|
|
@@ -2630,7 +2705,7 @@ var AnthropicProvider = class {
|
|
|
2630
2705
|
};
|
|
2631
2706
|
}
|
|
2632
2707
|
};
|
|
2633
|
-
function
|
|
2708
|
+
function extractText2(blocks) {
|
|
2634
2709
|
return blocks.filter((block) => block.type === "text").map((block) => block.text).join("");
|
|
2635
2710
|
}
|
|
2636
2711
|
function refusalTextFor(finishReason) {
|
|
@@ -5437,6 +5512,303 @@ function createOpenAiImageAdapter(config) {
|
|
|
5437
5512
|
};
|
|
5438
5513
|
}
|
|
5439
5514
|
|
|
5515
|
+
// src/providers/adapters/openai-compatible.adapter.ts
|
|
5516
|
+
function toWireMessage(message) {
|
|
5517
|
+
if (message.role === "tool") {
|
|
5518
|
+
return { role: "tool", content: message.content, tool_call_id: message.toolCallId ?? "" };
|
|
5519
|
+
}
|
|
5520
|
+
if (message.role === "assistant" && message.toolCalls && message.toolCalls.length > 0) {
|
|
5521
|
+
return {
|
|
5522
|
+
role: "assistant",
|
|
5523
|
+
content: message.content,
|
|
5524
|
+
tool_calls: message.toolCalls.map((call) => ({
|
|
5525
|
+
id: call.id,
|
|
5526
|
+
type: "function",
|
|
5527
|
+
function: { name: call.name, arguments: call.arguments }
|
|
5528
|
+
}))
|
|
5529
|
+
};
|
|
5530
|
+
}
|
|
5531
|
+
if (message.role === "user") return { role: "user", content: message.content };
|
|
5532
|
+
return { role: message.role, content: message.content };
|
|
5533
|
+
}
|
|
5534
|
+
function mergeImages(messages, images) {
|
|
5535
|
+
if (images.length === 0) return [...messages];
|
|
5536
|
+
const parts = images.map((image) => ({
|
|
5537
|
+
type: "image_url",
|
|
5538
|
+
image_url: { url: `data:${image.mimeType};base64,${image.dataBase64}` }
|
|
5539
|
+
}));
|
|
5540
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
5541
|
+
const message = messages[index];
|
|
5542
|
+
if (message.role !== "user") continue;
|
|
5543
|
+
const textParts = typeof message.content === "string" ? message.content.length > 0 ? [{ type: "text", text: message.content }] : [] : message.content;
|
|
5544
|
+
return [
|
|
5545
|
+
...messages.slice(0, index),
|
|
5546
|
+
{ role: "user", content: [...textParts, ...parts] },
|
|
5547
|
+
...messages.slice(index + 1)
|
|
5548
|
+
];
|
|
5549
|
+
}
|
|
5550
|
+
return [...messages, { role: "user", content: [...parts] }];
|
|
5551
|
+
}
|
|
5552
|
+
async function extractErrorDetail(response) {
|
|
5553
|
+
try {
|
|
5554
|
+
const body = await response.json();
|
|
5555
|
+
return body.error;
|
|
5556
|
+
} catch {
|
|
5557
|
+
return void 0;
|
|
5558
|
+
}
|
|
5559
|
+
}
|
|
5560
|
+
async function* parseSseEvent2(rawEvent, toolCallAccumulator) {
|
|
5561
|
+
for (const line of rawEvent.split("\n")) {
|
|
5562
|
+
if (!line.startsWith("data:")) continue;
|
|
5563
|
+
const payload = line.slice(5).trim();
|
|
5564
|
+
if (payload.length === 0 || payload === "[DONE]") continue;
|
|
5565
|
+
let chunk;
|
|
5566
|
+
try {
|
|
5567
|
+
chunk = JSON.parse(payload);
|
|
5568
|
+
} catch {
|
|
5569
|
+
continue;
|
|
5570
|
+
}
|
|
5571
|
+
const delta = chunk.choices?.[0]?.delta;
|
|
5572
|
+
if (delta?.reasoning) {
|
|
5573
|
+
yield { type: "delta", channel: "reasoning", text: delta.reasoning };
|
|
5574
|
+
}
|
|
5575
|
+
if (delta?.content) {
|
|
5576
|
+
yield { type: "delta", channel: "answer", text: delta.content };
|
|
5577
|
+
}
|
|
5578
|
+
if (delta?.tool_calls) {
|
|
5579
|
+
for (const toolCallDelta of delta.tool_calls) toolCallAccumulator.push(toolCallDelta);
|
|
5580
|
+
}
|
|
5581
|
+
if (chunk.usage) {
|
|
5582
|
+
yield {
|
|
5583
|
+
type: "usage",
|
|
5584
|
+
usage: {
|
|
5585
|
+
inputTokens: chunk.usage.prompt_tokens ?? 0,
|
|
5586
|
+
outputTokens: chunk.usage.completion_tokens ?? 0,
|
|
5587
|
+
reasoningTokens: chunk.usage.completion_tokens_details?.reasoning_tokens
|
|
5588
|
+
}
|
|
5589
|
+
};
|
|
5590
|
+
}
|
|
5591
|
+
}
|
|
5592
|
+
}
|
|
5593
|
+
async function* parseSseStream(body) {
|
|
5594
|
+
const reader = body.getReader();
|
|
5595
|
+
const decoder = new TextDecoder();
|
|
5596
|
+
const toolCallAccumulator = new ToolCallAccumulator();
|
|
5597
|
+
let buffer = "";
|
|
5598
|
+
try {
|
|
5599
|
+
while (true) {
|
|
5600
|
+
const { done, value } = await reader.read();
|
|
5601
|
+
if (done) break;
|
|
5602
|
+
buffer += decoder.decode(value, { stream: true });
|
|
5603
|
+
let separator = buffer.indexOf("\n\n");
|
|
5604
|
+
while (separator !== -1) {
|
|
5605
|
+
const rawEvent = buffer.slice(0, separator);
|
|
5606
|
+
buffer = buffer.slice(separator + 2);
|
|
5607
|
+
separator = buffer.indexOf("\n\n");
|
|
5608
|
+
yield* parseSseEvent2(rawEvent, toolCallAccumulator);
|
|
5609
|
+
}
|
|
5610
|
+
}
|
|
5611
|
+
} catch (err) {
|
|
5612
|
+
throw errorFromUnknown(err);
|
|
5613
|
+
} finally {
|
|
5614
|
+
reader.releaseLock();
|
|
5615
|
+
}
|
|
5616
|
+
const calls = toolCallAccumulator.finish();
|
|
5617
|
+
if (calls.length > 0) yield { type: "tool_calls", calls };
|
|
5618
|
+
}
|
|
5619
|
+
function createOpenAiCompatibleAdapter(config) {
|
|
5620
|
+
return {
|
|
5621
|
+
async *stream(req) {
|
|
5622
|
+
const timeout = AbortSignal.timeout(config.timeoutMs);
|
|
5623
|
+
const signal = req.signal ? AbortSignal.any([req.signal, timeout]) : timeout;
|
|
5624
|
+
let response;
|
|
5625
|
+
try {
|
|
5626
|
+
response = await fetch(`${config.baseUrl}/chat/completions`, {
|
|
5627
|
+
method: "POST",
|
|
5628
|
+
headers: {
|
|
5629
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
5630
|
+
"Content-Type": "application/json"
|
|
5631
|
+
},
|
|
5632
|
+
body: JSON.stringify({
|
|
5633
|
+
model: req.externalModelId,
|
|
5634
|
+
messages: mergeImages(req.messages.map(toWireMessage), req.images ?? []),
|
|
5635
|
+
temperature: req.temperature,
|
|
5636
|
+
max_completion_tokens: req.maxOutputTokens,
|
|
5637
|
+
top_p: req.topP,
|
|
5638
|
+
stream: true,
|
|
5639
|
+
stream_options: { include_usage: true },
|
|
5640
|
+
...req.tools && req.tools.length > 0 ? {
|
|
5641
|
+
tools: req.tools.map((tool) => ({ type: "function", function: tool })),
|
|
5642
|
+
tool_choice: "auto"
|
|
5643
|
+
} : {}
|
|
5644
|
+
}),
|
|
5645
|
+
signal
|
|
5646
|
+
});
|
|
5647
|
+
} catch (err) {
|
|
5648
|
+
throw errorFromUnknown(err);
|
|
5649
|
+
}
|
|
5650
|
+
if (!response.ok || !response.body) {
|
|
5651
|
+
const detail = await extractErrorDetail(response);
|
|
5652
|
+
throw errorFromStatus(response.status, detail?.message, detail);
|
|
5653
|
+
}
|
|
5654
|
+
yield* parseSseStream(response.body);
|
|
5655
|
+
}
|
|
5656
|
+
};
|
|
5657
|
+
}
|
|
5658
|
+
|
|
5659
|
+
// src/providers/adapters/anthropic.adapter.ts
|
|
5660
|
+
var ANTHROPIC_VERSION = "2023-06-01";
|
|
5661
|
+
var ERROR_TYPE_TO_CODE = {
|
|
5662
|
+
invalid_request_error: "invalid_request",
|
|
5663
|
+
authentication_error: "invalid_key",
|
|
5664
|
+
permission_error: "invalid_key",
|
|
5665
|
+
not_found_error: "model_unavailable",
|
|
5666
|
+
request_too_large: "invalid_request",
|
|
5667
|
+
rate_limit_error: "rate_limited",
|
|
5668
|
+
overloaded_error: "capacity",
|
|
5669
|
+
api_error: "upstream_error"
|
|
5670
|
+
};
|
|
5671
|
+
function mergeImages2(messages, images) {
|
|
5672
|
+
if (images.length === 0) return [...messages];
|
|
5673
|
+
const blocks = images.map((image) => ({
|
|
5674
|
+
type: "image",
|
|
5675
|
+
source: { type: "base64", media_type: image.mimeType, data: image.dataBase64 }
|
|
5676
|
+
}));
|
|
5677
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
5678
|
+
const message = messages[index];
|
|
5679
|
+
if (message.role !== "user") continue;
|
|
5680
|
+
const textBlocks = typeof message.content === "string" ? message.content.length > 0 ? [{ type: "text", text: message.content }] : [] : message.content;
|
|
5681
|
+
return [
|
|
5682
|
+
...messages.slice(0, index),
|
|
5683
|
+
{ role: "user", content: [...textBlocks, ...blocks] },
|
|
5684
|
+
...messages.slice(index + 1)
|
|
5685
|
+
];
|
|
5686
|
+
}
|
|
5687
|
+
return [...messages, { role: "user", content: [...blocks] }];
|
|
5688
|
+
}
|
|
5689
|
+
async function extractErrorDetail2(response) {
|
|
5690
|
+
try {
|
|
5691
|
+
const body = await response.json();
|
|
5692
|
+
return body.error?.message;
|
|
5693
|
+
} catch {
|
|
5694
|
+
return void 0;
|
|
5695
|
+
}
|
|
5696
|
+
}
|
|
5697
|
+
function wireError(error) {
|
|
5698
|
+
const code = error.type && ERROR_TYPE_TO_CODE[error.type] || "upstream_error";
|
|
5699
|
+
return new AiError(code, error.message);
|
|
5700
|
+
}
|
|
5701
|
+
function* parseAnthropicEvent(rawEvent) {
|
|
5702
|
+
for (const line of rawEvent.split("\n")) {
|
|
5703
|
+
if (!line.startsWith("data:")) continue;
|
|
5704
|
+
const payload = line.slice(5).trim();
|
|
5705
|
+
if (payload.length === 0) continue;
|
|
5706
|
+
try {
|
|
5707
|
+
yield JSON.parse(payload);
|
|
5708
|
+
} catch {
|
|
5709
|
+
continue;
|
|
5710
|
+
}
|
|
5711
|
+
}
|
|
5712
|
+
}
|
|
5713
|
+
function mergeOutputTokens(previous, outputTokens) {
|
|
5714
|
+
return {
|
|
5715
|
+
inputTokens: previous?.inputTokens ?? 0,
|
|
5716
|
+
outputTokens,
|
|
5717
|
+
reasoningTokens: previous?.reasoningTokens
|
|
5718
|
+
};
|
|
5719
|
+
}
|
|
5720
|
+
async function* parseAnthropicStream(body) {
|
|
5721
|
+
const reader = body.getReader();
|
|
5722
|
+
const decoder = new TextDecoder();
|
|
5723
|
+
let buffer = "";
|
|
5724
|
+
let usage = null;
|
|
5725
|
+
let usageEmitted = false;
|
|
5726
|
+
const flushUsage = function* () {
|
|
5727
|
+
if (usage && !usageEmitted && (usage.inputTokens > 0 || usage.outputTokens > 0)) {
|
|
5728
|
+
usageEmitted = true;
|
|
5729
|
+
yield { type: "usage", usage };
|
|
5730
|
+
}
|
|
5731
|
+
};
|
|
5732
|
+
try {
|
|
5733
|
+
while (true) {
|
|
5734
|
+
const { done, value } = await reader.read();
|
|
5735
|
+
if (done) break;
|
|
5736
|
+
buffer += decoder.decode(value, { stream: true });
|
|
5737
|
+
let separator = buffer.indexOf("\n\n");
|
|
5738
|
+
while (separator !== -1) {
|
|
5739
|
+
const rawEvent = buffer.slice(0, separator);
|
|
5740
|
+
buffer = buffer.slice(separator + 2);
|
|
5741
|
+
separator = buffer.indexOf("\n\n");
|
|
5742
|
+
for (const event of parseAnthropicEvent(rawEvent)) {
|
|
5743
|
+
if (event.error) throw wireError(event.error);
|
|
5744
|
+
if (event.type === "message_start" && event.message?.usage) {
|
|
5745
|
+
usage = {
|
|
5746
|
+
inputTokens: event.message.usage.input_tokens ?? 0,
|
|
5747
|
+
outputTokens: 0,
|
|
5748
|
+
reasoningTokens: void 0
|
|
5749
|
+
};
|
|
5750
|
+
} else if (event.type === "message_delta" && event.usage) {
|
|
5751
|
+
usage = mergeOutputTokens(usage, event.usage.output_tokens ?? 0);
|
|
5752
|
+
} else if (event.type === "message_stop") {
|
|
5753
|
+
yield* flushUsage();
|
|
5754
|
+
} else if (event.delta?.type === "text_delta" && event.delta.text) {
|
|
5755
|
+
yield { type: "delta", channel: "answer", text: event.delta.text };
|
|
5756
|
+
} else if (event.delta?.type === "thinking_delta" && event.delta.thinking) {
|
|
5757
|
+
yield { type: "delta", channel: "reasoning", text: event.delta.thinking };
|
|
5758
|
+
}
|
|
5759
|
+
}
|
|
5760
|
+
}
|
|
5761
|
+
}
|
|
5762
|
+
yield* flushUsage();
|
|
5763
|
+
} catch (err) {
|
|
5764
|
+
throw err instanceof AiError ? err : errorFromUnknown(err);
|
|
5765
|
+
} finally {
|
|
5766
|
+
reader.releaseLock();
|
|
5767
|
+
}
|
|
5768
|
+
}
|
|
5769
|
+
function createAnthropicAdapter(config) {
|
|
5770
|
+
return {
|
|
5771
|
+
async *stream(req) {
|
|
5772
|
+
const timeout = AbortSignal.timeout(config.timeoutMs);
|
|
5773
|
+
const signal = req.signal ? AbortSignal.any([req.signal, timeout]) : timeout;
|
|
5774
|
+
const system = req.messages.filter((message) => message.role === "system").map((message) => message.content).join("\n\n");
|
|
5775
|
+
const messages = mergeImages2(
|
|
5776
|
+
req.messages.filter((message) => message.role !== "system").map((message) => {
|
|
5777
|
+
if (message.role === "user") return { role: "user", content: message.content };
|
|
5778
|
+
return { role: "assistant", content: message.content };
|
|
5779
|
+
}),
|
|
5780
|
+
req.images ?? []
|
|
5781
|
+
);
|
|
5782
|
+
let response;
|
|
5783
|
+
try {
|
|
5784
|
+
response = await fetch(`${config.baseUrl}/v1/messages`, {
|
|
5785
|
+
method: "POST",
|
|
5786
|
+
headers: {
|
|
5787
|
+
"x-api-key": config.apiKey,
|
|
5788
|
+
"anthropic-version": ANTHROPIC_VERSION,
|
|
5789
|
+
"Content-Type": "application/json"
|
|
5790
|
+
},
|
|
5791
|
+
body: JSON.stringify({
|
|
5792
|
+
model: req.externalModelId,
|
|
5793
|
+
messages,
|
|
5794
|
+
...system.length > 0 ? { system } : {},
|
|
5795
|
+
max_tokens: req.maxOutputTokens,
|
|
5796
|
+
stream: true
|
|
5797
|
+
}),
|
|
5798
|
+
signal
|
|
5799
|
+
});
|
|
5800
|
+
} catch (err) {
|
|
5801
|
+
throw errorFromUnknown(err);
|
|
5802
|
+
}
|
|
5803
|
+
if (!response.ok || !response.body) {
|
|
5804
|
+
const detail = await extractErrorDetail2(response);
|
|
5805
|
+
throw errorFromStatus(response.status, detail);
|
|
5806
|
+
}
|
|
5807
|
+
yield* parseAnthropicStream(response.body);
|
|
5808
|
+
}
|
|
5809
|
+
};
|
|
5810
|
+
}
|
|
5811
|
+
|
|
5440
5812
|
// src/content/domain/calculations/ContentCreditCost.ts
|
|
5441
5813
|
var CREDIT_COSTS = {
|
|
5442
5814
|
"text-to-image": { standard: 1, hd: 2, "4k": 4 },
|
|
@@ -7142,6 +7514,8 @@ exports.SeoService = SeoService;
|
|
|
7142
7514
|
exports.SocialService = SocialService;
|
|
7143
7515
|
exports.StreamingResponseParser = StreamingResponseParser;
|
|
7144
7516
|
exports.StructuredPromptBuilder = StructuredPromptBuilder;
|
|
7517
|
+
exports.TEXT_EXTRACT_PER_FILE_LIMIT = TEXT_EXTRACT_PER_FILE_LIMIT;
|
|
7518
|
+
exports.TEXT_EXTRACT_TOTAL_LIMIT = TEXT_EXTRACT_TOTAL_LIMIT;
|
|
7145
7519
|
exports.TEXT_TIERS = TEXT_TIERS;
|
|
7146
7520
|
exports.TIMEOUTS = TIMEOUTS;
|
|
7147
7521
|
exports.TRANSIENT_ERROR_CODES = TRANSIENT_ERROR_CODES;
|
|
@@ -7181,6 +7555,7 @@ exports.calculateExponentialBackoff = calculateExponentialBackoff;
|
|
|
7181
7555
|
exports.calculateTrailingDelay = calculateTrailingDelay;
|
|
7182
7556
|
exports.canFailover = canFailover;
|
|
7183
7557
|
exports.canStartTask = canStartTask;
|
|
7558
|
+
exports.capText = capText;
|
|
7184
7559
|
exports.chatIdGenerator = chatIdGenerator;
|
|
7185
7560
|
exports.chunkText = chunkText;
|
|
7186
7561
|
exports.clampScore = clampScore;
|
|
@@ -7192,12 +7567,14 @@ exports.consumeGroqStream = consumeGroqStream;
|
|
|
7192
7567
|
exports.cosineSimilarity = cosineSimilarity;
|
|
7193
7568
|
exports.countChanges = countChanges;
|
|
7194
7569
|
exports.createAI = createAI;
|
|
7570
|
+
exports.createAnthropicAdapter = createAnthropicAdapter;
|
|
7195
7571
|
exports.createAssistantMessage = createAssistantMessage;
|
|
7196
7572
|
exports.createFalProvider = createFalProvider;
|
|
7197
7573
|
exports.createGeminiProvider = createGeminiProvider;
|
|
7198
7574
|
exports.createGroqProvider = createGroqProvider;
|
|
7199
7575
|
exports.createMessage = createMessage;
|
|
7200
7576
|
exports.createOpenAiAudioTranscriptionAdapter = createOpenAiAudioTranscriptionAdapter;
|
|
7577
|
+
exports.createOpenAiCompatibleAdapter = createOpenAiCompatibleAdapter;
|
|
7201
7578
|
exports.createOpenAiEmbeddingsAdapter = createOpenAiEmbeddingsAdapter;
|
|
7202
7579
|
exports.createOpenAiImageAdapter = createOpenAiImageAdapter;
|
|
7203
7580
|
exports.createOpenAiSpeechAdapter = createOpenAiSpeechAdapter;
|
|
@@ -7227,6 +7604,7 @@ exports.extractJsonCandidate = extractJsonCandidate;
|
|
|
7227
7604
|
exports.extractJsonFromCodeFence = extractJsonFromCodeFence;
|
|
7228
7605
|
exports.extractJsonObject = extractJsonObject;
|
|
7229
7606
|
exports.extractSseDataPayload = extractSseDataPayload;
|
|
7607
|
+
exports.extractText = extractText;
|
|
7230
7608
|
exports.extractTextFromMessages = extractTextFromMessages;
|
|
7231
7609
|
exports.extractTokenUsage = extractTokenUsage;
|
|
7232
7610
|
exports.failoverCandidate = failoverCandidate;
|
|
@@ -7247,6 +7625,7 @@ exports.isMediaProvider = isMediaProvider;
|
|
|
7247
7625
|
exports.isRetryableErrorType = isRetryableErrorType;
|
|
7248
7626
|
exports.isSseDataLine = isSseDataLine;
|
|
7249
7627
|
exports.isSseDoneMarker = isSseDoneMarker;
|
|
7628
|
+
exports.isTextLike = isTextLike;
|
|
7250
7629
|
exports.isTextProvider = isTextProvider;
|
|
7251
7630
|
exports.isTextTier = isTextTier;
|
|
7252
7631
|
exports.isTransientError = isTransientError;
|