@umituz/web-ai 1.0.4 → 1.0.5

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.
@@ -4,7 +4,7 @@ import { m as GenerationType } from '../AIErrors-DjZXUiLT.cjs';
4
4
  export { A as ABTestComparison, a as ABTestPrediction, b as ABTestRequest, c as ABTestVariant, d as AIErrorCode, e as ASPECT_RATIO_OPTIONS, y as AnyQuality, f as AspectRatio, z as AspectRatioOption, i as CREDIT_COSTS, C as ContentAnalysisRequest, g as ContentAnalysisResult, G as ContentGenerationResult, h as CreditCost, D as DEFAULT_CREDIT_COST, E as EmotionScore, i as GENERATION_COSTS, j as GenerationMetadata, k as GenerationProgress, G as GenerationResult, l as GenerationStatus, I as IMAGE_QUALITY_OPTIONS, n as ImageGenerationInput, o as ImageQuality, B as ImageQualityOption, F as ImageStyle, K as KeywordAnalysis, M as MOTION_OPTIONS, H as MotionOption, J as MotionStrength, P as ProviderQuotaExhaustedError, p as ProviderUnavailableError, Q as QualityTier, S as SEOOptimizationRequest, q as SEOOptimizationResult, r as SEOScoreBreakdown, s as STYLE_PRESETS, t as SentimentAnalysisResult, L as StylePreset, V as VIDEO_DURATION_OPTIONS_SECONDS, u as VIDEO_QUALITY_OPTIONS, N as ValidationError, v as VideoGenerationInput, w as VideoQuality, O as VideoQualityOption, x as calculateContentCreditCost, x as calculateCreditCost, R as toQualityTier } from '../AIErrors-DjZXUiLT.cjs';
5
5
  import { I as ImageGenerationRequest, V as VideoGenerationRequest, T as TextGenerationRequest } from '../ProviderConfig-DIFa9nmG.cjs';
6
6
  export { A as AnthropicConfig, B as BaseProviderConfig, F as FalConfig, c as GeminiConfig, G as GeneratedContent, e as GenerationRequest, f as GroqConfig, a as ImageToVideoRequest, d as ProviderConfig, g as ProviderHealth, h as ProviderType, P as PrunaConfig, b as VideoToVideoRequest } from '../ProviderConfig-DIFa9nmG.cjs';
7
- export { A as ABTestService, a as AIContentService, b as ASPECT_RATIO_VALUES, c as AnalysisService, B as BlogService, C as ContentCalendarService, G as GenerationExecutor, I as IAIContentService, d as IMAGE_QUALITY_VALUES, e as ImagePromptService, M as MediaGenerationService, P as PromptBuilder, S as SeoService, f as SocialService, V as VIDEO_DURATION_OPTIONS, g as VIDEO_QUALITY_VALUES, h as VideoScriptService, i as getDimensionsForAspectRatio, j as getRecommendedQuality, r as recommendQualityForAspectRatio, k as resolveDimensionsForAspectRatio } from '../PromptBuilder-DIUZlfV6.cjs';
7
+ export { A as ABTestService, a as AIContentService, b as ASPECT_RATIO_VALUES, c as AnalysisService, B as BlogService, C as ContentCalendarService, n as ContentRequestQueue, G as GenerationExecutor, I as IAIContentService, d as IMAGE_QUALITY_VALUES, e as ImagePromptService, M as MediaGenerationService, P as PromptBuilder, Q as QueueConfig, R as RequestPriority, S as SeoService, f as SocialService, V as VIDEO_DURATION_OPTIONS, g as VIDEO_QUALITY_VALUES, h as VideoScriptService, i as batchRequest, j as extractJSON, k as getDimensionsForAspectRatio, l as getRecommendedQuality, m as isValidJSON, p as parseAIResponse, r as recommendQualityForAspectRatio, o as resolveDimensionsForAspectRatio, s as safeJSONParse } from '../requestQueue-CkJ6Xc9K.cjs';
8
8
  export { c as ITextGenerator, T as TextGenerationOptions } from '../provider.factory-DyfJtR8M.cjs';
9
9
  export { A as AIError } from '../index-DKHNcMbl.cjs';
10
10
  import '../create-ai-BrKR_5fQ.cjs';
@@ -4,7 +4,7 @@ import { m as GenerationType } from '../AIErrors-CLjXRty-.js';
4
4
  export { A as ABTestComparison, a as ABTestPrediction, b as ABTestRequest, c as ABTestVariant, d as AIErrorCode, e as ASPECT_RATIO_OPTIONS, y as AnyQuality, f as AspectRatio, z as AspectRatioOption, i as CREDIT_COSTS, C as ContentAnalysisRequest, g as ContentAnalysisResult, G as ContentGenerationResult, h as CreditCost, D as DEFAULT_CREDIT_COST, E as EmotionScore, i as GENERATION_COSTS, j as GenerationMetadata, k as GenerationProgress, G as GenerationResult, l as GenerationStatus, I as IMAGE_QUALITY_OPTIONS, n as ImageGenerationInput, o as ImageQuality, B as ImageQualityOption, F as ImageStyle, K as KeywordAnalysis, M as MOTION_OPTIONS, H as MotionOption, J as MotionStrength, P as ProviderQuotaExhaustedError, p as ProviderUnavailableError, Q as QualityTier, S as SEOOptimizationRequest, q as SEOOptimizationResult, r as SEOScoreBreakdown, s as STYLE_PRESETS, t as SentimentAnalysisResult, L as StylePreset, V as VIDEO_DURATION_OPTIONS_SECONDS, u as VIDEO_QUALITY_OPTIONS, N as ValidationError, v as VideoGenerationInput, w as VideoQuality, O as VideoQualityOption, x as calculateContentCreditCost, x as calculateCreditCost, R as toQualityTier } from '../AIErrors-CLjXRty-.js';
5
5
  import { I as ImageGenerationRequest, V as VideoGenerationRequest, T as TextGenerationRequest } from '../ProviderConfig-DIFa9nmG.js';
6
6
  export { A as AnthropicConfig, B as BaseProviderConfig, F as FalConfig, c as GeminiConfig, G as GeneratedContent, e as GenerationRequest, f as GroqConfig, a as ImageToVideoRequest, d as ProviderConfig, g as ProviderHealth, h as ProviderType, P as PrunaConfig, b as VideoToVideoRequest } from '../ProviderConfig-DIFa9nmG.js';
7
- export { A as ABTestService, a as AIContentService, b as ASPECT_RATIO_VALUES, c as AnalysisService, B as BlogService, C as ContentCalendarService, G as GenerationExecutor, I as IAIContentService, d as IMAGE_QUALITY_VALUES, e as ImagePromptService, M as MediaGenerationService, P as PromptBuilder, S as SeoService, f as SocialService, V as VIDEO_DURATION_OPTIONS, g as VIDEO_QUALITY_VALUES, h as VideoScriptService, i as getDimensionsForAspectRatio, j as getRecommendedQuality, r as recommendQualityForAspectRatio, k as resolveDimensionsForAspectRatio } from '../PromptBuilder-B5Lm1znm.js';
7
+ export { A as ABTestService, a as AIContentService, b as ASPECT_RATIO_VALUES, c as AnalysisService, B as BlogService, C as ContentCalendarService, n as ContentRequestQueue, G as GenerationExecutor, I as IAIContentService, d as IMAGE_QUALITY_VALUES, e as ImagePromptService, M as MediaGenerationService, P as PromptBuilder, Q as QueueConfig, R as RequestPriority, S as SeoService, f as SocialService, V as VIDEO_DURATION_OPTIONS, g as VIDEO_QUALITY_VALUES, h as VideoScriptService, i as batchRequest, j as extractJSON, k as getDimensionsForAspectRatio, l as getRecommendedQuality, m as isValidJSON, p as parseAIResponse, r as recommendQualityForAspectRatio, o as resolveDimensionsForAspectRatio, s as safeJSONParse } from '../requestQueue-CvxWxC-z.js';
8
8
  export { c as ITextGenerator, T as TextGenerationOptions } from '../provider.factory-BwPnqSEU.js';
9
9
  export { A as AIError } from '../index-DIHz8_OJ.js';
10
10
  import '../create-ai-0eZFFqTw.js';
@@ -4188,7 +4188,14 @@ var BlogService = class {
4188
4188
  };
4189
4189
 
4190
4190
  // src/content/infrastructure/utils/requestQueue.ts
4191
- ({
4191
+ var RequestPriority = /* @__PURE__ */ ((RequestPriority2) => {
4192
+ RequestPriority2[RequestPriority2["LOW"] = 0] = "LOW";
4193
+ RequestPriority2[RequestPriority2["NORMAL"] = 1] = "NORMAL";
4194
+ RequestPriority2[RequestPriority2["HIGH"] = 2] = "HIGH";
4195
+ RequestPriority2[RequestPriority2["URGENT"] = 3] = "URGENT";
4196
+ return RequestPriority2;
4197
+ })(RequestPriority || {});
4198
+ var DEFAULT_CONFIG = {
4192
4199
  maxConcurrent: RequestQueueConfig.MAX_CONCURRENT,
4193
4200
  maxQueueSize: RequestQueueConfig.MAX_QUEUE_SIZE,
4194
4201
  defaultTimeout: RequestQueueConfig.DEFAULT_TIMEOUT_MS,
@@ -4196,7 +4203,133 @@ var BlogService = class {
4196
4203
  enableRateLimit: RequestQueueConfig.RATE_LIMIT.ENABLED,
4197
4204
  rateLimitWindow: RequestQueueConfig.RATE_LIMIT.WINDOW_MS,
4198
4205
  rateLimitMaxRequests: RequestQueueConfig.RATE_LIMIT.MAX_REQUESTS_PER_WINDOW
4199
- });
4206
+ };
4207
+ var RequestQueue2 = class {
4208
+ queue = [];
4209
+ running = /* @__PURE__ */ new Set();
4210
+ config;
4211
+ requestHistory = [];
4212
+ isProcessing = false;
4213
+ constructor(config = {}) {
4214
+ this.config = { ...DEFAULT_CONFIG, ...config };
4215
+ }
4216
+ async add(fn, priority = 1 /* NORMAL */, maxRetries = 3) {
4217
+ if (this.queue.length >= this.config.maxQueueSize) {
4218
+ throw new Error("Queue is full");
4219
+ }
4220
+ return new Promise((resolve, reject) => {
4221
+ const request = {
4222
+ id: generateId("req"),
4223
+ priority,
4224
+ timestamp: Date.now(),
4225
+ fn,
4226
+ resolve,
4227
+ reject,
4228
+ retries: 0,
4229
+ maxRetries
4230
+ };
4231
+ this.queue.push(request);
4232
+ this.sortQueue();
4233
+ if (!this.isProcessing) {
4234
+ this.process();
4235
+ }
4236
+ });
4237
+ }
4238
+ sortQueue() {
4239
+ this.queue.sort((a, b) => {
4240
+ if (a.priority !== b.priority) {
4241
+ return b.priority - a.priority;
4242
+ }
4243
+ return a.timestamp - b.timestamp;
4244
+ });
4245
+ }
4246
+ async process() {
4247
+ if (this.isProcessing) return;
4248
+ this.isProcessing = true;
4249
+ while (this.queue.length > 0 || this.running.size > 0) {
4250
+ while (this.queue.length > 0 && this.running.size < this.config.maxConcurrent) {
4251
+ if (this.config.enableRateLimit && !this.canMakeRequest()) {
4252
+ break;
4253
+ }
4254
+ const request = this.queue.shift();
4255
+ if (!request) break;
4256
+ this.running.add(request.id);
4257
+ this.executeRequest(request);
4258
+ }
4259
+ await new Promise((resolve) => setTimeout(resolve, RequestQueueConfig.POLL_INTERVAL_MS));
4260
+ }
4261
+ this.isProcessing = false;
4262
+ }
4263
+ canMakeRequest() {
4264
+ const now = Date.now();
4265
+ const windowStart = now - this.config.rateLimitWindow;
4266
+ this.requestHistory = this.requestHistory.filter(
4267
+ (timestamp) => timestamp > windowStart
4268
+ );
4269
+ return this.requestHistory.length < this.config.rateLimitMaxRequests;
4270
+ }
4271
+ async executeRequest(request) {
4272
+ try {
4273
+ if (this.config.enableRateLimit) {
4274
+ this.requestHistory.push(Date.now());
4275
+ }
4276
+ const result = await this.withTimeout(
4277
+ request.fn,
4278
+ this.config.defaultTimeout
4279
+ );
4280
+ request.resolve(result);
4281
+ } catch (error) {
4282
+ if (request.retries < request.maxRetries) {
4283
+ request.retries++;
4284
+ const delay = this.config.retryDelay * request.retries;
4285
+ setTimeout(() => {
4286
+ this.queue.unshift(request);
4287
+ this.sortQueue();
4288
+ }, delay);
4289
+ } else {
4290
+ request.reject(error);
4291
+ }
4292
+ } finally {
4293
+ this.running.delete(request.id);
4294
+ }
4295
+ }
4296
+ async withTimeout(fn, timeout) {
4297
+ const controller = new AbortController();
4298
+ let timeoutId;
4299
+ const timeoutPromise = new Promise((_, reject) => {
4300
+ timeoutId = setTimeout(() => {
4301
+ controller.abort();
4302
+ reject(new Error("Request timeout"));
4303
+ }, timeout);
4304
+ });
4305
+ try {
4306
+ const result = await Promise.race([fn(controller.signal), timeoutPromise]);
4307
+ return result;
4308
+ } finally {
4309
+ if (timeoutId) clearTimeout(timeoutId);
4310
+ }
4311
+ }
4312
+ getStats() {
4313
+ return {
4314
+ queued: this.queue.length,
4315
+ running: this.running.size,
4316
+ rateLimitRemaining: this.config.enableRateLimit ? this.config.rateLimitMaxRequests - this.requestHistory.filter(
4317
+ (timestamp) => Date.now() - timestamp < this.config.rateLimitWindow
4318
+ ).length : Infinity
4319
+ };
4320
+ }
4321
+ clear() {
4322
+ for (const request of this.queue) {
4323
+ request.reject(new Error("Queue cleared"));
4324
+ }
4325
+ this.queue = [];
4326
+ }
4327
+ async drain() {
4328
+ while (this.running.size > 0) {
4329
+ await new Promise((resolve) => setTimeout(resolve, RequestQueueConfig.POLL_INTERVAL_MS));
4330
+ }
4331
+ }
4332
+ };
4200
4333
  async function batchRequest(requests, options = {}) {
4201
4334
  const {
4202
4335
  concurrency = 3,
@@ -4680,7 +4813,10 @@ function safeJSONParse(text, fallback, onError) {
4680
4813
  const positionMatch = error.message.match(/position (\d+)/);
4681
4814
  const position = positionMatch ? parseInt(positionMatch[1], 10) : -1;
4682
4815
  if (position > 0) {
4683
- text.substring(Math.max(0, position - 50), position + 50);
4816
+ const context = text.substring(Math.max(0, position - 50), position + 50);
4817
+ onError?.(`JSON parse error at position ${position}: "${context}"`);
4818
+ } else {
4819
+ onError?.(`JSON parse error: ${error.message}`);
4684
4820
  }
4685
4821
  }
4686
4822
  return fallback;
@@ -4707,9 +4843,23 @@ function extractJSON(text) {
4707
4843
  function parseAIResponse(response, fallback, onError) {
4708
4844
  const json = extractJSON(response);
4709
4845
  if (!json) {
4846
+ onError?.("No JSON payload found in response");
4710
4847
  return fallback;
4711
4848
  }
4712
- return safeJSONParse(json, fallback);
4849
+ return safeJSONParse(json, fallback, onError);
4850
+ }
4851
+ function isValidJSON(text) {
4852
+ const trimmed = text.trim();
4853
+ if (trimmed.length === 0) return false;
4854
+ if (!(trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]"))) {
4855
+ return false;
4856
+ }
4857
+ try {
4858
+ JSON.parse(trimmed);
4859
+ return true;
4860
+ } catch {
4861
+ return false;
4862
+ }
4713
4863
  }
4714
4864
 
4715
4865
  // src/content/application/services/GenerationExecutor.ts
@@ -4770,7 +4920,48 @@ function toAIProviderConfig(config) {
4770
4920
  ...pruna ? { pruna } : {}
4771
4921
  };
4772
4922
  }
4773
- var buildServices = (configOrGenerator) => {
4923
+ var buildServices = (configOrGenerator, model, customGenerator) => {
4924
+ if (customGenerator) {
4925
+ const executor2 = new GenerationExecutor(customGenerator);
4926
+ const emptyFactory = new ProviderFactory({
4927
+ priority: [],
4928
+ fallbackEnabled: false
4929
+ });
4930
+ return {
4931
+ providerFactory: emptyFactory,
4932
+ blogService: new BlogService(executor2),
4933
+ socialService: new SocialService(executor2),
4934
+ videoScriptService: new VideoScriptService(executor2),
4935
+ analysisService: new AnalysisService(executor2),
4936
+ seoService: new SeoService(executor2),
4937
+ abTestService: new ABTestService(executor2),
4938
+ imagePromptService: new ImagePromptService(executor2),
4939
+ contentCalendarService: new ContentCalendarService(executor2),
4940
+ mediaGenerationService: new MediaGenerationService(emptyFactory)
4941
+ };
4942
+ }
4943
+ if (typeof configOrGenerator === "string") {
4944
+ const aiConfig = {
4945
+ anthropic: {
4946
+ apiKey: configOrGenerator,
4947
+ ...model ? { models: { balanced: model } } : {}
4948
+ }
4949
+ };
4950
+ const factory2 = createAI(aiConfig);
4951
+ const executor2 = new GenerationExecutor(factory2);
4952
+ return {
4953
+ providerFactory: factory2,
4954
+ blogService: new BlogService(executor2),
4955
+ socialService: new SocialService(executor2),
4956
+ videoScriptService: new VideoScriptService(executor2),
4957
+ analysisService: new AnalysisService(executor2),
4958
+ seoService: new SeoService(executor2),
4959
+ abTestService: new ABTestService(executor2),
4960
+ imagePromptService: new ImagePromptService(executor2),
4961
+ contentCalendarService: new ContentCalendarService(executor2),
4962
+ mediaGenerationService: new MediaGenerationService(factory2)
4963
+ };
4964
+ }
4774
4965
  if (isTextGenerator(configOrGenerator)) {
4775
4966
  const executor2 = new GenerationExecutor(configOrGenerator);
4776
4967
  const emptyFactory = new ProviderFactory({
@@ -4816,8 +5007,8 @@ var AIContentService = class {
4816
5007
  imagePromptService;
4817
5008
  contentCalendarService;
4818
5009
  mediaGenerationService;
4819
- constructor(configOrGenerator) {
4820
- const bundle = buildServices(configOrGenerator);
5010
+ constructor(configOrGenerator, model, textGenerator) {
5011
+ const bundle = buildServices(configOrGenerator, model, textGenerator);
4821
5012
  this.providerFactory = bundle.providerFactory;
4822
5013
  this.blogService = bundle.blogService;
4823
5014
  this.socialService = bundle.socialService;
@@ -5118,6 +5309,6 @@ function buildVideoRequest(data) {
5118
5309
  }
5119
5310
  }
5120
5311
 
5121
- export { ABTestService, AB_TEST_DEFAULT_CONFIDENCE, AIContentService, AIError, ASPECT_RATIO_OPTIONS, ASPECT_RATIO_VALUES, AnalysisService, BlogService, CONTENT_WIZARD_STEPS, CREDIT_COSTS, ContentCalendarService, DEFAULT_CREDIT_COST, DEFAULT_HASHTAG_BUDGET, CREDIT_COSTS as GENERATION_COSTS, GenerationExecutor, IMAGE_QUALITY_OPTIONS, IMAGE_QUALITY_VALUES, IMAGE_WIZARD_STEPS, ImagePromptService, MOTION_OPTIONS, MediaGenerationService, MemoryConfig, ModelDefaults, PLATFORM_SPECS, PromptBuilder, ProviderQuotaExhaustedError, ProviderTimingConfig, ProviderUnavailableError, RequestQueueConfig, STYLE_PRESETS, SeoService, SocialService, SpeechPaceConfig, TextModelDefaults, VIDEO_DURATION_OPTIONS, VIDEO_DURATION_OPTIONS_SECONDS, VIDEO_QUALITY_OPTIONS, VIDEO_QUALITY_VALUES, VIDEO_WIZARD_STEPS, ValidationError, ValidationLimits, VideoScriptService, buildContentRequest, buildImageRequest, buildVideoRequest, calculateContentCreditCost, calculateContentCreditCost as calculateCreditCost, calculateImprovementPercentage, calculateKeywordDensity, calculateRetryBackoffDelayMs, clampConfidenceToValidRange, clampScoreToValidRange, classifyKeywordProminence, countKeywordOccurrences, countWordsInContent, estimateFalGenerationCost, estimateGeminiGenerationCost, estimateGroqGenerationCost, estimatePrunaGenerationCost, estimateTokenBudgetForCalendarDays, estimateTokenBudgetForDuration, estimateUnknownProviderCost, estimateWordCountForDuration, generateId, getDimensionsForAspectRatio, getRecommendedQuality, isUnderutilizedKeyword, rankAndTrimHashtags, recommendQualityForAspectRatio, resolveCalendarEntryDate, resolveDefaultPrunaModel, resolveDimensionsForAspectRatio, resolveFalImageSize, resolveFalInferenceSteps, resolveHashtagBudget, resolveMaxContentLength, resolvePlatformSpec, selectHigherScoreVariantId, toQualityTier, truncateForAbVariantPreview, truncateForBlogPromptPreview, truncateForSeoPreview, validateCalendarDays, validateContentBody, validateDurationSeconds, validateHashtagCount, validateKeywordList, validateTopicText };
5312
+ export { ABTestService, AB_TEST_DEFAULT_CONFIDENCE, AIContentService, AIError, ASPECT_RATIO_OPTIONS, ASPECT_RATIO_VALUES, AnalysisService, BlogService, CONTENT_WIZARD_STEPS, CREDIT_COSTS, ContentCalendarService, RequestQueue2 as ContentRequestQueue, DEFAULT_CREDIT_COST, DEFAULT_HASHTAG_BUDGET, CREDIT_COSTS as GENERATION_COSTS, GenerationExecutor, IMAGE_QUALITY_OPTIONS, IMAGE_QUALITY_VALUES, IMAGE_WIZARD_STEPS, ImagePromptService, MOTION_OPTIONS, MediaGenerationService, MemoryConfig, ModelDefaults, PLATFORM_SPECS, PromptBuilder, ProviderQuotaExhaustedError, ProviderTimingConfig, ProviderUnavailableError, RequestPriority, RequestQueueConfig, STYLE_PRESETS, SeoService, SocialService, SpeechPaceConfig, TextModelDefaults, VIDEO_DURATION_OPTIONS, VIDEO_DURATION_OPTIONS_SECONDS, VIDEO_QUALITY_OPTIONS, VIDEO_QUALITY_VALUES, VIDEO_WIZARD_STEPS, ValidationError, ValidationLimits, VideoScriptService, batchRequest, buildContentRequest, buildImageRequest, buildVideoRequest, calculateContentCreditCost, calculateContentCreditCost as calculateCreditCost, calculateImprovementPercentage, calculateKeywordDensity, calculateRetryBackoffDelayMs, clampConfidenceToValidRange, clampScoreToValidRange, classifyKeywordProminence, countKeywordOccurrences, countWordsInContent, estimateFalGenerationCost, estimateGeminiGenerationCost, estimateGroqGenerationCost, estimatePrunaGenerationCost, estimateTokenBudgetForCalendarDays, estimateTokenBudgetForDuration, estimateUnknownProviderCost, estimateWordCountForDuration, extractJSON, generateId, getDimensionsForAspectRatio, getRecommendedQuality, isUnderutilizedKeyword, isValidJSON, parseAIResponse, rankAndTrimHashtags, recommendQualityForAspectRatio, resolveCalendarEntryDate, resolveDefaultPrunaModel, resolveDimensionsForAspectRatio, resolveFalImageSize, resolveFalInferenceSteps, resolveHashtagBudget, resolveMaxContentLength, resolvePlatformSpec, safeJSONParse, selectHigherScoreVariantId, toQualityTier, truncateForAbVariantPreview, truncateForBlogPromptPreview, truncateForSeoPreview, validateCalendarDays, validateContentBody, validateDurationSeconds, validateHashtagCount, validateKeywordList, validateTopicText };
5122
5313
  //# sourceMappingURL=index.js.map
5123
5314
  //# sourceMappingURL=index.js.map