fjffk简单的咖啡店科开发2方法2 环滁皆山也。其西南诸峰,林壑尤美,望之蔚然而深秀者,琅琊也。山行六七里,渐闻水声潺潺,而泻出于两峰之间者,酿泉也 ??????????????????????????????? ??????????????/????????????????? ............/................... .........................../... ??????????????????????????????? >>>>>>>>>>>>>/>>>>>>>>>>>>>>>>> ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< >>>>>>>>>>>>>/>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> dsdfEntityManager.php000064400000007607152665637620010060 0ustar00defaultWordModel(); return $defaultWordModel->value; } /** * @template T * * @returns T & \App\Domains\Entity\BaseDriver */ public function driver($driver = null): BaseDriver { if ($driver && ! $driver instanceof EntityEnum) { throw new InvalidArgumentException('Driver must be an instance of AIModelEnum'); } /** @var BaseDriver $driverInstance */ $driverInstance = parent::driver($driver?->value); return $driverInstance->createDriverReqsIfNeeded(); } /** * This method is used to set another user for the driver. * It is useful when you want to use the driver for a specific user. * Alternatively, you can use the `forUser` method when you want to use the driver for a specific user. * * @template T * * @returns T & \App\Domains\Entity\BaseDriver */ public function driverForUser(int|User $user, ?EntityEnum $driver = null): BaseDriver { return $this->driver($driver)->forUser($user); } public function driverForPlan(Plan $plan, ?EntityEnum $driver = null): BaseDriver { return $this->driver($driver)->forPlan($plan); } public function driverForTeam(Team $team, ?EntityEnum $driver = null): BaseDriver { return $this->driver($driver)->forTeam($team); } public function driverForGuest(?EntityEnum $driver = null): BaseDriver { return $this->driver($driver)->forGuest(); } public function all(?EngineEnum $filterByEngine = null, ?User $user = null, bool $onlyListableCases = false, ?Plan $plan = null, ?Team $team = null): Collection { return once(function () use ($filterByEngine, $user, $onlyListableCases, $plan, $team) { return collect(EntityEnum::cases()) ->when($filterByEngine, static function ($collect) use ($filterByEngine) { return $collect->filter(fn ($entity) => $entity->engine() === $filterByEngine)->values(); }) ->map(function ($entity) use ($user, $plan, $team) { if ($plan) { return $this->driverForPlan($plan, $entity); } if ($team && $team?->allow_seats > 0) { return $this->driverForTeam($team, $entity); } if ($user) { return $this->driverForUser($user, $entity); } return $this->driver($entity); }) ->when($onlyListableCases, static function ($collect) { return $collect->filter(fn ($entity) => $entity->enum() === $entity->creditEnum())->values(); }); }); } private function defaultWordModel(): EntityEnum { $defaultEngine = setting('default_ai_engine'); $setting = Setting::getCache(); return match ($defaultEngine) { EngineEnum::OPEN_AI->slug() => EntityEnum::fromSlug($setting?->openai_default_model ?? EntityEnum::GPT_4_O->slug()), EngineEnum::ANTHROPIC->slug() => EntityEnum::fromSlug(setting('anthropic_default_model', EntityEnum::ANTHROPIC_CLAUDE_3_5_HAIKU->slug())), EngineEnum::GEMINI->slug() => EntityEnum::fromSlug(setting('gemini_default_model', EntityEnum::GEMINI_1_5_FLASH->slug())), default => EntityEnum::GPT_4_O, }; } } Facades/Entity.php000064400000000517152665637620010104 0ustar00map(function ($driver) { return self::makeStat($driver); }); } public static function speechToText(): EntityStatItem { return self::makeStat(WithSpeechToTextInterface::class); } public static function imageToVideo(): EntityStatItem { return self::makeStat(WithImageToVideoInterface::class); } public static function image(): EntityStatItem { return self::makeStat(WithImagesInterface::class); } public static function char(): EntityStatItem { return self::makeStat(WithCharsInterface::class); } public static function minute(): EntityStatItem { return self::makeStat(WithMinuteInterface::class); } public static function second(): EntityStatItem { return self::makeStat(WithSecondInterface::class); } public static function presentation(): EntityStatItem { return self::makeStat(WithPresentationInterface::class); } public static function word(): EntityStatItem { return self::makeStat(WithWordsInterface::class); } public static function textToSpeech(): EntityStatItem { return self::makeStat(WithTextToSpeechInterface::class); } public static function visionPreview(): EntityStatItem { return self::makeStat(WithVisionPreviewInterface::class); } public static function textToVideo(): EntityStatItem { return self::makeStat(WithTextToVideoInterface::class); } public static function plagiarism(): EntityStatItem { return self::makeStat(WithPlagiarismInterface::class); } public static function type(string $type): EntityStatItem { return self::makeStat($type); } } Enums/EntityEnum.php000064400000216616152665637620010503 0ustar00map( fn ($case) => $case->creditBy() )->unique()->values(); } public function isReasoningModel(): bool { return match ($this) { self::GPT_O_1, self::GPT_O_4_MINI, self::GPT_O_3, self::GPT_O_03_mini, self::GPT_5, self::GPT_5_CHAT, self::GPT_5_PRO, self::GPT_5_MINI, self::GPT_5_NANO => true, default => false, }; } public function creditBy(): self { // we are not using this for now, because we only show default model for user return match ($this) { // self::GPT_3_5_TURBO_0125, // self::GPT_3_5_TURBO_1106 => self::GPT_3_5_TURBO, default => $this }; } public function creditIndex(): float { return 1.0; } public function label(): string { return match ($this) { self::BLACK_FOREST_LABS_FLUX_1_SCHNELL => __('Black Forest Labs Flux 1 Schnell'), self::IMAGE_TO_VIDEO => __('AI Video'), self::STABLE_DIFFUSION_XL_1024_V_1_0 => __('Stable Diffusion XL 1.0'), self::STABLE_DIFFUSION_V_1_6 => __('Stable Diffusion 1.6'), self::SD_3 => __('Stable Diffusion 3'), self::SD_3_TURBO => __('Stable Diffusion 3 turbo'), self::SD_3_MEDIUM => __('Stable Diffusion 3 Medium'), self::SD_3_LARGE => __('Stable Diffusion 3 Large'), self::SD_3_LARGE_TURBO => __('Stable Diffusion 3 Large Turbo'), self::SD_3_5_LARGE => __('Stable Diffusion 3.5 Large'), self::SD_3_5_LARGE_TURBO => __('Stable Diffusion 3.5 Large Turbo'), self::SD_3_5_MEDIUM => __('Stable Diffusion 3.5 Medium'), self::CORE => __('Core'), self::ULTRA => __('Ultra'), self::AWS_BEDROCK => __('AWS Bedrock'), // OpenAI self::DAVINCI => __('Davinci 002 (Expensive & Capable)'), self::TEXT_DAVINCI_003 => __('Davinci 003 (Expensive & Capable)'), self::GPT_3_5_TURBO => __('GPT 3.5-turbo (Most Expensive & Fastest & Most Capable)'), self::GPT_3_5_TURBO_0125 => __('GTP 3.5-turbo-0125 (Updated Knowleddge cutoff of Sep 2021, 16k)'), self::GPT_3_5_TURBO_1106 => __('GTP 3.5-turbo-1106 (Updated Knowleddge cutoff of Nov 2021, 16k)'), self::GPT_4_TURBO => __('GPT-4 Turbo (Most Expensive & Fastest & Most Capable)'), self::GPT_4 => __('GPT-4 (Most Expensive & Fastest & Most Capable)'), self::GPT_4_1106_PREVIEW => __('GPT-4-1106 Turbo (Updated Knowleddge cutoff of April 2023, 128k)'), self::GPT_4_0125_PREVIEW => __('GPT-4-0125 Turbo (Updated Knowleddge cutoff of Dec 2023, 128k)'), self::TEXT_EMBEDDING_ADA_002 => __('Text Embedding Ada (Expensive & Capable)'), self::TEXT_EMBEDDING_3_SMALL => __('Text Embedding Small'), self::TEXT_EMBEDDING_3_LARGE => __('Text Embedding Large'), self::WHISPER_1 => __('WHISPER 1 The latest text to speech model, optimized for speed.'), self::DALL_E_2 => __('DALL-E 2 The previous DALL·E model released in Nov 2022.'), self::DALL_E_3 => __('DALL-E 3 The latest DALL·E model released in Nov 2023.'), self::GPT_IMAGE_1 => __('GPT-IMAGE-1 The latest image model released in Nov 2025.'), self::TTS_1 => __('TTS 1 The latest text to speech model, optimized for speed.'), self::TTS_1_HD => __('TTS 1 HD The latest text to speech model, optimized for quality.'), self::GPT_4_O => __('GPT-4o Most advanced works for Vision, multimodal flagship model that’s cheaper and faster than GPT-4 Turbo. (Updated Knowleddge cutoff of Oct 2023, 128k)'), self::GPT_4_O_MINI => __('GPT-4o mini Our affordable and intelligent small model for fast, lightweight tasks. GPT-4o mini is cheaper and more capable than GPT-3.5 Turbo.'), self::GPT_4_O_SEARCH_PREVIEW => __('GPT-4o Search Preview'), self::GPT_4_O_MINI_SEARCH_PREVIEW => __('GPT-4o Mini Search Preview'), self::GPT_4_O1_PREVIEW => __('GPT o1-preview (Updated Knowledge cutoff of Dec 2023, 128k)'), self::GPT_4_O1_MINI => __('GPT o1-mini (Updated Knowledge cutoff of Dec 2023, 128k)'), self::GPT_O_1 => __('GPT o1 (Updated Knowledge cutoff of Dec 2023, 128k)'), self::GPT_O_03_mini => __('GPT o3-mini (Updated Knowledge cutoff of October 2023, 200k)'), self::GPT_4_O_REALTIME_PREVIEW => __('GPT-4o Realtime Preview (Updated Knowledge cutoff of December 2024, 128k)'), self::GPT_4_1 => __('GPT-4.1 (Jun 01, 2024 knowledge cutoff, 32k max output tokens.)'), self::GPT_4_1_MINI => __('GPT-4.1 Mini (Jun 01, 2024 knowledge cutoff, 32k max output tokens.)'), self::GPT_4_1_NANO => __('GPT-4.1 Nano (Jun 01, 2024 knowledge cutoff, 32k max output tokens.)'), self::GPT_O_4_MINI => __('GPT o4-mini (Jun 01, 2024 knowledge cutoff, 100k max output tokens.)'), self::GPT_O_3 => __('GPT o3 (Jun 01, 2024 knowledge cutoff, 100k max output tokens.)'), self::GPT_5 => __('GPT-5 (Oct 01, 2024 knowledge cutoff, 128k max output tokens.)'), self::GPT_5_MINI => __('GPT-5 Mini (May 31, 2024 knowledge cutoff, 128k max output tokens.)'), self::GPT_5_NANO => __('GPT-5 Nano (May 31, 2024 knowledge cutoff, 128k max output tokens.)'), self::GPT_5_CHAT => __('GPT-5 Chat (Sep 30, 2024 knowledge cutoff, 128k max output tokens.)'), self::GPT_5_PRO => __('GPT-5 Pro (Sep 30, 2024 knowledge cutoff, 272k max output tokens.)'), self::SORA_2 => __('Sora 2 (Flagship video generation with synced audio)'), self::SORA_2_PRO => __('Sora 2 Pro (Most advanced synced-audio video generation)'), // Anthropic self::CLAUDE_SONNET_4_5 => __('Claude Sonnet 4.5'), self::CLAUDE_OPUS_4_1 => __('Claude Opus 4.1'), self::CLAUDE_OPUS_4 => __('Claude Opus 4'), self::CLAUDE_SONNET_4 => __('Claude Sonnet 4'), self::CLAUDE_3_7_SONNET => __('Claude 3.7 Sonnet'), self::CLAUDE_3_5_HAIKU => __('Claude 3.5 Haiku'), self::CLAUDE_3_5_SONNET_V2 => __('Claude 3.5 Sonnet V2'), self::CLAUDE_3_5_SONNET => __('Claude 3.5 Sonnet'), self::CLAUDE_3_SONNET => __('Claude 3 Sonnet'), self::CLAUDE_3_OPUS => __('Claude 3 Opus'), self::CLAUDE_3_HAIKU => __('Claude 3 Haiku'), self::CLAUDE_2_1 => __('Claude 2.1'), self::CLAUDE_2_0 => __('Claude 2'), self::VOYAGE_2 => __('Voyage 2'), self::VOYAGE_LARGE_2 => __('Voyage Large 2'), self::VOYAGE_CODE_2 => __('Voyage Code 2'), self::CLIPDROP => __('Clipdrop for Photo Studio'), self::NOVITA => __('Novita for Photo Studio'), self::FREEPIK => __('Novita for Image Editor'), self::PLAGIARISMCHECK => __('Plagiarism Check'), self::SYNTHESIA => __('Synthesia'), self::HEYGEN => __('Heygen'), self::PEBBLELY => __('Pebblely'), // Gemini self::GEMINI_2_5_FLASH_PREVIEW_05_20 => __('Gemini 2.5 Flash Preview 05-20 Adaptive thinking, cost efficiency'), self::GEMINI_2_5_PRO => __('Gemini 2.5 Pro Preview Enhanced thinking and reasoning, multimodal understanding, advanced coding, and more'), self::GEMINI_2_0_FLASH => __('Gemini 2.0 Flash Next generation features, speed, thinking, realtime streaming, and multimodal generation'), self::GEMINI_2_0_FLASH_LITE => __('Gemini 2.0 Flash-Lite Cost efficiency and low latency'), self::GEMINI_1_5_PRO => __('Gemini 1.5 Pro Complex reasoning tasks requiring more intelligence'), self::GEMINI_1_5_FLASH => __('Gemini 1.5 Flash Fast and versatile performance across a diverse variety of tasks'), self::GEMINI_EMBEDDING_EXP => __('Gemini Embedding Measuring the relatedness of text strings'), self::GEMINI_TEXT_EMBEDDING_004 => __('Gemini Text Embeding 004'), // Deepseek self::DEEPSEEK_CHAT => __('Deepseek Chat'), self::DEEPSEEK_REASONER => __('Deepseek DeepSeek-R1'), // Unsplash self::UNSPLASH => __('Unsplash for AI Article Wizard'), // Pexels self::PEXELS => __('Pexels for AI Article Wizard'), // Pixabay self::PIXABAY => __('Pixabay for AI Article Wizard'), // Elevenlabs self::ELEVENLABS => __('Elevenlabs for TTS'), self::ELEVENLABS_VOICE_CHATBOT => __('Elevenlabs Voice Chatbots'), self::ISOLATOR => __('Voice Isolator (1 word = 5 used characters of elevenlabs) X 1 token'), self::ELEVENLABS_AI_MUSIC => __('Elevenlabs for AI Music Pro'), // Google self::GOOGLE => __('Google for TTS'), // Azure self::AZURE => __('Azure for TTS'), self::AZURE_OPENAI => __('Azure OpenAI Model'), // Speechify self::Speechify => __('Speechify for TTS'), // Serper self::SERPER => __('Serper for Realtime Data'), // Perplexity self::PERPLEXITY => __('Perplexity for Realtime Data'), // Midjourney self::MIDJOURNEY => __('Midjourney'), // X AI self::GROK_2_1212 => __('Grok 2 1212'), self::GROK_2_VISION_1212 => __('Grok 2 Vision 1212'), self::GROK_3 => __('Grok 3'), self::GROK_3_MINI => __('Grok 3 Mini'), self::GROK_3_FAST => __('Grok 3 Fast'), self::GROK_3_MINI_FAST => __('Grok 3 Mini Fast'), self::GROK_4 => __('Grok 4'), self::GROK_4_FAST => __('Grok 4 Fast'), // Gamma AI self::GAMMA_AI => __('Gamma AI'), // FAL AI self::VEO_2 => __('Google VEO 2'), self::IMAGEN_4 => __('Google Imagen 4'), self::VEED => __('Veed'), self::VEO_3 => __('Veo 3'), self::VEO_3_1_TEXT_TO_VIDEO => __('Veo 3.1 Text To Video'), self::VEO_3_1_TEXT_TO_VIDEO_FAST => __('Fast Veo 3.1 Text To Video'), self::VEO_3_1_FIRST_LAST_FRAME_TO_VIDEO => __('Veo 3.1 First Last Frame To Video'), self::VEO_3_1_FIRST_LAST_FRAME_TO_VIDEO_FAST => __('Fast Veo 3.1 First Last Frame To Video'), self::VEO_3_1_IMAGE_TO_VIDEO => __('Veo 3.1 Image To Video'), self::VEO_3_1_IMAGE_TO_VIDEO_FAST => __('Fast Veo 3.1 Image To Video'), self::VEO_3_1_REFERENCE_TO_VIDEO => __('Veo 3.1 Reference To Video'), self::VEO_3_FAST => __('Fast Veo 3'), self::KLING_VIDEO => __('Kling Video'), self::FLUX_PRO => __('Flux Pro'), self::NANO_BANANA => __('Nano Banana'), self::NANO_BANANA_EDIT => __('Nano Banana Edit'), self::SEEDREAM_4 => __('SeeDream v4 '), self::SEEDREAM_4_EDIT => __('SeeDream v4 Edit'), self::FLUX_PRO_KONTEXT_MAX_MULTI => __('Flux Pro Kontext Max Multi'), self::FLUX_PRO_KONTEXT_TEXT_TO_IMAGE => __('Flux Pro Kontext Max Text to Image'), self::FLUX_PRO_KONTEXT => __('Flux Pro Kontext Max'), self::IDEOGRAM => __('Ideogram V2'), self::FLUX_PRO_1_1 => __('Flux Pro 1.1'), self::FLUX_REALISM => __('Flux Realism'), self::FLUX_SCHNELL => __('Flux Schnell'), self::KLING => __('Kling 1.0'), self::KLING_2_1 => __('Kling 2.1'), self::KLING_2_5_TURBO_PRO_TTV => __('Kling 2.5 Turbo Pro Text to Video'), self::KLING_2_5_TURBO_PRO_ITV => __('Kling 2.5 Turbo Pro Image to Video'), self::KLING_2_5_TURBO_STANDARD_ITV => __('Kling 2.5 Turbo Standard Image to Video'), self::KLING_IMAGE => __('Kling Image to Video'), self::LUMA_DREAM_MACHINE => __('Luma Dream Machine'), self::HAIPER => __('Haiper'), self::MINIMAX => __('Minimax'), self::VIDEO_UPSCALER => __('Video Upscaler'), self::COGVIDEOX_5B => __('Cogvideox 5B'), self::ANIMATEDIFF_V2V => __('Animatediff V2V'), self::FAST_ANIMATEDIFF_TURBO => __('Fast Animatediff Turbo'), self::AD_MARKETING_VIDEO => __('Ad Marketing Video'), self::AD_MARKETING_VIDEO_TOPVIEW => __('Topview Ad Video'), self::AI_CLIP_VIZARD => __('Vizard AI Clip'), self::AI_CLIP_KLAP => __('Klap AI Clip'), // AI/ML api minimax engine self::MUSIC_01 => __('Music 01'), // Open Router self::ANTHROPIC_CLAUDE_3_5_HAIKU_20241022 => __('Anthropic: Claude 3.5 Haiku (2024-10-22)'), self::ANTHROPIC_CLAUDE_3_5_HAIKU_20241022_SELF_MODERATED => __('Anthropic: Claude 3.5 Haiku (2024-10-22) (self-moderated)'), self::ANTHROPIC_CLAUDE_3_5_HAIKU => __('Anthropic: Claude 3.5 Haiku'), self::ANTHROPIC_CLAUDE_3_5_HAIKU_SELF_MODERATED => __('Anthropic: Claude 3.5 Haiku (self-moderated)'), self::LUMIMAID_V02_70B => __('Lumimaid v0.2 70B'), self::MAGNUM_V4_72B => __('Magnum v4 72B'), self::XAI_GROK_BETA => __('xAI: Grok Beta'), self::MINISTRAL_8B => __('Ministral 8B'), self::MINISTRAL_3B => __('Ministral 3B'), self::QWEN25_7B_INSTRUCT => __('Qwen2.5 7B Instruct'), self::NVIDIA_LLAMA_31_NEMOTRON_70B_INSTRUCT => __('NVIDIA: Llama 3.1 Nemotron 70B Instruct'), self::INFLECTION_3_PI => __('Inflection: Inflection 3 Pi'), self::INFLECTION_3_PRODUCTIVITY => __('Inflection: Inflection 3 Productivity'), self::LIQUID_LFM_40B_MOE_FREE => __('Liquid: LFM 40B MoE (free)'), self::LIQUID_LFM_40B_MOB => __('Liquid: LFM 40B MoE'), self::ROCINANTE_12B => __('Rocinante 12B'), self::EVA_QWEN25_14B => __('EVA Qwen2.5 14B'), self::MAGNUM_V2_72B => __('Magnum v2 72B'), self::META_LLAMA32_3B_INSTRUCT_FREE => __('Meta: Llama 3.2 3B Instruct (free)'), self::META_LLAMA32_1B_INSTRUCT_FREE => __('Meta: Llama 3.2 1B Instruct (free)'), self::META_LLAMA32_3B_INSTRUCT => __('Meta: Llama 3.2 3B Instruct'), self::META_LLAMA32_1B_INSTRUCT => __('Meta: Llama 3.2 1B Instruct'), self::PERPLEXITY_LLAMA_31_SONAR_405B_ONLINE => __('Perplexity: Llama 3.1 Sonar 405B Online'), self::PERPLEXITY_LLAMA_31_SONAR_70B_ONLINE => __('Perplexity: Llama 3.1 Sonar 70B Online'), self::PERPLEXITY_LLAMA_31_SONAR_70B => __('Perplexity: Llama 3.1 Sonar 70B'), self::PERPLEXITY_LLAMA_31_SONAR_8B_ONLINE => __('Perplexity: Llama 3.1 Sonar 8B Online'), self::PERPLEXITY_LLAMA_31_SONAR_8B => __('Perplexity: Llama 3.1 Sonar 8B'), }; } public function isV2BetaSdEntity(): bool { return match ($this) { self::SD_3, self::SD_3_TURBO, self::SD_3_MEDIUM, self::SD_3_LARGE, self::SD_3_LARGE_TURBO, self::SD_3_5_LARGE, self::SD_3_5_LARGE_TURBO, self::SD_3_5_MEDIUM, self::CORE, self::ULTRA => true, default => false, }; } public function engine(): EngineEnum { return match ($this) { self::IMAGE_TO_VIDEO, self::STABLE_DIFFUSION_XL_1024_V_1_0, self::STABLE_DIFFUSION_V_1_6, self::SD_3, self::SD_3_TURBO, self::SD_3_MEDIUM, self::SD_3_LARGE, self::SD_3_LARGE_TURBO, self::SD_3_5_LARGE, self::SD_3_5_LARGE_TURBO, self::SD_3_5_MEDIUM, self::CORE, self::ULTRA, self::AWS_BEDROCK => EngineEnum::STABLE_DIFFUSION, // Together self::BLACK_FOREST_LABS_FLUX_1_SCHNELL => EngineEnum::TOGETHER, // OpenAI self::DAVINCI, self::TEXT_DAVINCI_003, self::GPT_3_5_TURBO, self::GPT_3_5_TURBO_0125, self::GPT_3_5_TURBO_1106, self::GPT_4_TURBO, self::GPT_4, self::GPT_4_1106_PREVIEW, self::GPT_4_0125_PREVIEW, self::TEXT_EMBEDDING_ADA_002, self::TEXT_EMBEDDING_3_SMALL, self::TEXT_EMBEDDING_3_LARGE, self::WHISPER_1, self::DALL_E_2, self::DALL_E_3, self::GPT_IMAGE_1, self::TTS_1, self::TTS_1_HD, self::GPT_4_O, self::GPT_4_O_MINI, self::GPT_4_O_SEARCH_PREVIEW, self::GPT_4_O_MINI_SEARCH_PREVIEW, self::GPT_4_O1_PREVIEW, self::GPT_4_O1_MINI, self::GPT_O_1, self::GPT_O_03_mini, self::GPT_4_O_REALTIME_PREVIEW, self::GPT_4_1, self::GPT_4_1_MINI, self::GPT_4_1_NANO, self::GPT_O_3, self::GPT_5, self::GPT_5_MINI, self::GPT_5_NANO, self::GPT_5_CHAT, self::GPT_5_PRO, self::SORA_2, self::SORA_2_PRO, self::GPT_O_4_MINI => EngineEnum::OPEN_AI, // Anthropic self::CLAUDE_SONNET_4_5, self::CLAUDE_OPUS_4_1, self::CLAUDE_SONNET_4, self::CLAUDE_OPUS_4, self::CLAUDE_3_7_SONNET, self::CLAUDE_3_5_HAIKU, self::CLAUDE_3_5_SONNET_V2, self::CLAUDE_3_5_SONNET, self::CLAUDE_3_SONNET, self::CLAUDE_3_OPUS, self::CLAUDE_3_HAIKU, self::CLAUDE_2_1, self::CLAUDE_2_0, self::VOYAGE_2, self::VOYAGE_LARGE_2, self::VOYAGE_CODE_2 => EngineEnum::ANTHROPIC, // Deepseek self::DEEPSEEK_CHAT, self::DEEPSEEK_REASONER => EngineEnum::DEEP_SEEK, // Clipdrop self::CLIPDROP => EngineEnum::CLIPDROP, // Novita self::NOVITA => EngineEnum::NOVITA, // Freepik self::FREEPIK => EngineEnum::FREEPIK, // Plagiarism Check self::PLAGIARISMCHECK => EngineEnum::PLAGIARISM_CHECK, // SYNTHESIA self::SYNTHESIA => EngineEnum::SYNTHESIA, // HEYGEN self::HEYGEN => EngineEnum::HEYGEN, // Pebblely self::PEBBLELY => EngineEnum::PEBBLELY, // Gemini self::GEMINI_2_5_FLASH_PREVIEW_05_20, self::GEMINI_2_5_PRO, self::GEMINI_2_0_FLASH, self::GEMINI_2_0_FLASH_LITE, self::GEMINI_1_5_PRO, self::GEMINI_1_5_FLASH, self::GEMINI_EMBEDDING_EXP, self::GEMINI_TEXT_EMBEDDING_004 => EngineEnum::GEMINI, // Unsplash self::UNSPLASH => EngineEnum::UNSPLASH, // Pexels self::PEXELS => EngineEnum::PEXELS, // Pixabay self::PIXABAY => EngineEnum::PIXABAY, // Elevenlabs self::ELEVENLABS, self::ELEVENLABS_VOICE_CHATBOT, self::ELEVENLABS_AI_MUSIC, self::ISOLATOR => EngineEnum::ELEVENLABS, // Google self::GOOGLE => EngineEnum::GOOGLE, // Azure self::AZURE, self::AZURE_OPENAI => EngineEnum::AZURE, // Speechify self::Speechify => EngineEnum::Speechify, // Serper self::SERPER => EngineEnum::SERPER, // Perplexity self::PERPLEXITY => EngineEnum::PERPLEXITY, // PIAPI self::MIDJOURNEY => EngineEnum::PI_API, // X AI self::GROK_2_1212, self::GROK_2_VISION_1212, self::GROK_3, self::GROK_3_MINI, self::GROK_3_FAST, self::GROK_3_MINI_FAST, self::GROK_4, self::GROK_4_FAST => EngineEnum::X_AI, // Gamma AI self::GAMMA_AI => EngineEnum::GAMMA_AI, // FAL AI self::VEO_2, self::VEED, self::VEO_3_1_TEXT_TO_VIDEO, self::VEO_3_1_TEXT_TO_VIDEO_FAST, self::VEO_3_1_FIRST_LAST_FRAME_TO_VIDEO, self::VEO_3_1_FIRST_LAST_FRAME_TO_VIDEO_FAST, self::VEO_3_1_IMAGE_TO_VIDEO, self::VEO_3_1_IMAGE_TO_VIDEO_FAST, self::VEO_3_1_REFERENCE_TO_VIDEO, self::VEO_3, self::VEO_3_FAST, self::KLING_2_5_TURBO_PRO_TTV, self::KLING_2_5_TURBO_PRO_ITV, self::KLING_2_5_TURBO_STANDARD_ITV, self::KLING_VIDEO, self::VIDEO_UPSCALER, self::COGVIDEOX_5B, self::ANIMATEDIFF_V2V, self::FAST_ANIMATEDIFF_TURBO, self::FLUX_PRO, self::NANO_BANANA, self::NANO_BANANA_EDIT, self::SEEDREAM_4, self::SEEDREAM_4_EDIT, self::IMAGEN_4, self::FLUX_PRO_KONTEXT_MAX_MULTI, self::FLUX_PRO_KONTEXT_TEXT_TO_IMAGE, self::FLUX_PRO_KONTEXT, self::FLUX_PRO_1_1, self::FLUX_REALISM, self::FLUX_SCHNELL, self::IDEOGRAM, self::KLING, self::KLING_2_1, self::KLING_IMAGE, self::LUMA_DREAM_MACHINE, self::HAIPER, self::MINIMAX => EngineEnum::FAL_AI, // Creatify self::AD_MARKETING_VIDEO => EngineEnum::CREATIFY, // Topview self::AD_MARKETING_VIDEO_TOPVIEW => EngineEnum::TOPVIEW, // AI CLIP self::AI_CLIP_KLAP => EngineEnum::KLAP, self::AI_CLIP_VIZARD => EngineEnum::VIZARD, // AI/ML api minimax engine self::MUSIC_01 => EngineEnum::AI_ML_MINIMAX, // Open Router self::ANTHROPIC_CLAUDE_3_5_HAIKU_20241022, self::ANTHROPIC_CLAUDE_3_5_HAIKU_20241022_SELF_MODERATED, self::ANTHROPIC_CLAUDE_3_5_HAIKU, self::ANTHROPIC_CLAUDE_3_5_HAIKU_SELF_MODERATED, self::LUMIMAID_V02_70B, self::MAGNUM_V4_72B, self::XAI_GROK_BETA, self::MINISTRAL_8B, self::MINISTRAL_3B, self::QWEN25_7B_INSTRUCT, self::NVIDIA_LLAMA_31_NEMOTRON_70B_INSTRUCT, self::INFLECTION_3_PI, self::INFLECTION_3_PRODUCTIVITY, self::LIQUID_LFM_40B_MOE_FREE, self::LIQUID_LFM_40B_MOB, self::ROCINANTE_12B, self::EVA_QWEN25_14B, self::MAGNUM_V2_72B, self::META_LLAMA32_3B_INSTRUCT_FREE, self::META_LLAMA32_1B_INSTRUCT_FREE, self::META_LLAMA32_3B_INSTRUCT, self::META_LLAMA32_1B_INSTRUCT, self::PERPLEXITY_LLAMA_31_SONAR_405B_ONLINE, self::PERPLEXITY_LLAMA_31_SONAR_70B_ONLINE, self::PERPLEXITY_LLAMA_31_SONAR_70B, self::PERPLEXITY_LLAMA_31_SONAR_8B_ONLINE, self::PERPLEXITY_LLAMA_31_SONAR_8B => EngineEnum::OPEN_ROUTER, }; } public function driverClass(): string { return match ($this) { // Together self::BLACK_FOREST_LABS_FLUX_1_SCHNELL => Together\FLUX1SchnellDriver::class, // Stable Diffusion self::IMAGE_TO_VIDEO => StableDiffusion\ImageToVideoDriver::class, self::STABLE_DIFFUSION_XL_1024_V_1_0 => StableDiffusion\XL1024V10Driver::class, self::STABLE_DIFFUSION_V_1_6 => StableDiffusion\V16Driver::class, self::SD_3 => StableDiffusion\Sd3Driver::class, self::SD_3_TURBO => StableDiffusion\Sd3TurboDriver::class, self::SD_3_MEDIUM => StableDiffusion\Sd3MediumDriver::class, self::SD_3_LARGE => StableDiffusion\Sd3LargeDriver::class, self::SD_3_LARGE_TURBO => StableDiffusion\Sd3LargeTurboDriver::class, self::SD_3_5_LARGE => StableDiffusion\Sd35LargeDriver::class, self::SD_3_5_LARGE_TURBO => StableDiffusion\Sd35LargeTurboDriver::class, self::SD_3_5_MEDIUM => StableDiffusion\Sd35MediumDriver::class, self::CORE => StableDiffusion\CoreDriver::class, self::ULTRA => StableDiffusion\UltraDriver::class, self::AWS_BEDROCK => StableDiffusion\AwsBedrockDriver::class, // OpenAI self::DAVINCI => OpenAI\DavinciDriver::class, self::TEXT_DAVINCI_003 => OpenAI\TextDavinciDriver::class, self::GPT_3_5_TURBO => OpenAI\GPT35TurboDriver::class, self::GPT_3_5_TURBO_0125 => OpenAI\GPT35Turbo0125Driver::class, self::GPT_3_5_TURBO_1106 => OpenAI\GPT35Turbo1106Driver::class, self::GPT_4_TURBO => OpenAI\GPT4TurboDriver::class, self::GPT_4 => OpenAI\GPT4Driver::class, self::GPT_4_1106_PREVIEW => OpenAI\GPT41106PreviewDriver::class, self::GPT_4_0125_PREVIEW => OpenAI\GPT40125PreviewDriver::class, self::TEXT_EMBEDDING_ADA_002 => OpenAI\TextEmbeddingAdaDriver::class, self::TEXT_EMBEDDING_3_SMALL => OpenAI\TextEmbedding3SmallDriver::class, self::TEXT_EMBEDDING_3_LARGE => OpenAI\TextEmbedding3LargeDriver::class, self::WHISPER_1 => OpenAI\Whisper1Driver::class, self::DALL_E_2 => OpenAI\DallE2Driver::class, self::DALL_E_3 => OpenAI\DallE3Driver::class, self::GPT_IMAGE_1 => OpenAI\GptImage1Driver::class, self::TTS_1 => OpenAI\TTS1Driver::class, self::TTS_1_HD => OpenAI\TTS1HDDriver::class, self::GPT_4_O => OpenAI\GPT4ODriver::class, self::GPT_4_O_MINI => OpenAI\GPT4OMiniDriver::class, self::GPT_4_O_SEARCH_PREVIEW => OpenAI\GPT4OSearchPreviewDriver::class, self::GPT_4_O_MINI_SEARCH_PREVIEW => OpenAI\GPT4OMiniSearchPreviewDriver::class, self::GPT_4_O1_PREVIEW => OpenAI\GPT4O1PreviewDriver::class, self::GPT_4_O1_MINI => OpenAI\GPT4O1MiniDriver::class, self::GPT_O_1 => OpenAI\GPTO1Driver::class, self::GPT_O_03_mini => OpenAI\GPTO3MiniDriver::class, self::GPT_4_O_REALTIME_PREVIEW => OpenAI\GPT4ORealtimePreviewDriver::class, self::GPT_4_1 => OpenAI\GPT41Driver::class, self::GPT_O_4_MINI => OpenAI\GPTO4MiniDriver::class, self::GPT_4_1_NANO => OpenAI\GPT41NanoDriver::class, self::GPT_4_1_MINI => OpenAI\GPT41MiniDriver::class, self::GPT_O_3 => OpenAI\GPTO3Driver::class, self::GPT_5 => OpenAI\GPT5Driver::class, self::GPT_5_MINI => OpenAI\GPT5MiniDriver::class, self::GPT_5_NANO => OpenAI\GPT5NanoDriver::class, self::GPT_5_CHAT => OpenAI\GPT5ChatDriver::class, self::GPT_5_PRO => OpenAI\GPT5ProDriver::class, self::SORA_2 => OpenAI\Sora2Driver::class, self::SORA_2_PRO => OpenAI\Sora2ProDriver::class, // Anthropic self::CLAUDE_SONNET_4_5 => Anthropic\ClaudeSonnet45Driver::class, self::CLAUDE_OPUS_4_1 => Anthropic\ClaudeOpus41Driver::class, self::CLAUDE_SONNET_4 => Anthropic\ClaudeSonnet4Driver::class, self::CLAUDE_OPUS_4 => Anthropic\ClaudeOpus4Driver::class, self::CLAUDE_3_7_SONNET => Anthropic\Claude37SonnetDriver::class, self::CLAUDE_3_5_HAIKU => Anthropic\Claude35HaikuDriver::class, self::CLAUDE_3_5_SONNET_V2 => Anthropic\Claude35SonnetV2Driver::class, self::CLAUDE_3_5_SONNET => Anthropic\Claude35SonnetDriver::class, self::CLAUDE_3_SONNET => Anthropic\Claude3SonnetDriver::class, self::CLAUDE_3_OPUS => Anthropic\Claude3OpusDriver::class, self::CLAUDE_3_HAIKU => Anthropic\Claude3HaikuDriver::class, self::CLAUDE_2_1 => Anthropic\Claude21Driver::class, self::CLAUDE_2_0 => Anthropic\Claude20Driver::class, self::VOYAGE_2 => Anthropic\Voyage2Driver::class, self::VOYAGE_LARGE_2 => Anthropic\VoyageLarge2Driver::class, self::VOYAGE_CODE_2 => Anthropic\VoyageCode2Driver::class, // Gemini self::GEMINI_2_5_FLASH_PREVIEW_05_20 => Gemini\Gemini25FlashPreview0417Driver::class, self::GEMINI_2_5_PRO => Gemini\Gemini25ProExp0325Driver::class, self::GEMINI_2_0_FLASH => Gemini\Gemini20FlashDriver::class, self::GEMINI_2_0_FLASH_LITE => Gemini\Gemini20FlashLiteDriver::class, self::GEMINI_1_5_PRO => Gemini\Gemini15ProDriver::class, self::GEMINI_1_5_FLASH => Gemini\Gemini15FlashDriver::class, self::GEMINI_EMBEDDING_EXP => Gemini\GeminiEmbeddingExpDriver::class, self::GEMINI_TEXT_EMBEDDING_004 => Gemini\GeminiTextEmbeding004Driver::class, // Deepseek self::DEEPSEEK_CHAT => Deepseek\DeepseekChatDriver::class, self::DEEPSEEK_REASONER => Deepseek\DeepseekReasonerDriver::class, // Others self::CLIPDROP => ClipDropDriver::class, self::NOVITA => NovitaDriver::class, self::FREEPIK => FreepikDriver::class, self::PLAGIARISMCHECK => PlagiarismCheckDriver::class, self::SYNTHESIA => SynthesiaDriver::class, self::HEYGEN => HeygenDriver::class, self::PEBBLELY => PebblelyDriver::class, self::UNSPLASH => UnsplashDriver::class, self::PEXELS => PexelsDriver::class, self::PIXABAY => PixabayDriver::class, self::ELEVENLABS => ElevenLabs\ElevenlabsDriver::class, self::ELEVENLABS_VOICE_CHATBOT => ElevenLabs\ElevenlabsVoiceChatbotDriver::class, self::ISOLATOR => ElevenLabs\IsolatorDriver::class, self::ELEVENLABS_AI_MUSIC => ElevenLabs\ElevenlabsAIMusicDriver::class, self::GOOGLE => GoogleDriver::class, self::AZURE => AzureDriver::class, self::AZURE_OPENAI => AzureOpenaiDriver::class, self::Speechify => SpeechifyDriver::class, self::SERPER => SerperDriver::class, self::PERPLEXITY => PerplexityDriver::class, // PiAPI self::MIDJOURNEY => MidjourneyDriver::class, // X AI self::GROK_2_1212 => XAI\Grok21212Driver::class, self::GROK_2_VISION_1212 => XAI\Grok2Vision1212Driver::class, self::GROK_3 => XAI\Grok3Driver::class, self::GROK_3_MINI => XAI\Grok3MiniDriver::class, self::GROK_3_FAST => XAI\Grok3FastDriver::class, self::GROK_3_MINI_FAST => XAI\Grok3MiniFastDriver::class, self::GROK_4 => XAI\Grok4Driver::class, self::GROK_4_FAST => XAI\Grok4FastDriver::class, // Gamma AI self::GAMMA_AI => GammaAIDriver::class, // FAL AI self::VEO_2 => FalAI\Veo2Driver::class, self::VEO_3 => FalAI\Veo3Driver::class, self::VEO_3_FAST => FalAI\Veo3FastDriver::class, self::VEO_3_1_TEXT_TO_VIDEO => FalAI\Veo31\Veo31TTVDriver::class, self::VEO_3_1_TEXT_TO_VIDEO_FAST => FalAI\Veo31\Veo31TTVFastDriver::class, self::VEO_3_1_FIRST_LAST_FRAME_TO_VIDEO => FalAI\Veo31\Veo31FLFTVDriver::class, self::VEO_3_1_FIRST_LAST_FRAME_TO_VIDEO_FAST => FalAI\Veo31\Veo31FLFTVFastDriver::class, self::VEO_3_1_IMAGE_TO_VIDEO => FalAI\Veo31\Veo31ITVDriver::class, self::VEO_3_1_IMAGE_TO_VIDEO_FAST => FalAI\Veo31\Veo31ITVFastDriver::class, self::VEO_3_1_REFERENCE_TO_VIDEO => FalAI\Veo31\Veo31RTVDriver::class, self::KLING_VIDEO => FalAI\KlingVideoDriver::class, self::VEED => FalAI\VeedDriver::class, self::FLUX_PRO => FalAI\FluxProDriver::class, self::NANO_BANANA => FalAI\NanoBananaDriver::class, self::NANO_BANANA_EDIT => FalAI\NanoBananaEditDriver::class, self::SEEDREAM_4 => FalAI\SeeDream4Driver::class, self::SEEDREAM_4_EDIT => FalAI\SeeDream4EditDriver::class, self::IMAGEN_4 => FalAI\Imagen4Driver::class, self::FLUX_PRO_KONTEXT_MAX_MULTI => FalAI\FluxProKontextMaxMultiDriver::class, self::FLUX_PRO_KONTEXT_TEXT_TO_IMAGE => FalAI\FluxProKontextTextToImageDriver::class, self::FLUX_PRO_KONTEXT => FalAI\FluxProKontextDriver::class, self::IDEOGRAM => FalAI\IdeogramDriver::class, self::FLUX_PRO_1_1 => FalAI\FluxPro11Driver::class, self::FLUX_REALISM => FalAI\FluxRealismDriver::class, self::FLUX_SCHNELL => FalAI\FluxSchnellDriver::class, self::KLING => FalAI\KlingDriver::class, self::KLING_2_1 => FalAI\KlingV21Driver::class, self::KLING_2_5_TURBO_PRO_TTV => FalAI\Kling25Turbo\Kling25TurboProTTVDriver::class, self::KLING_2_5_TURBO_PRO_ITV => FalAI\Kling25Turbo\Kling25TurboProITVDriver::class, self::KLING_2_5_TURBO_STANDARD_ITV => FalAI\Kling25Turbo\Kling25TurboStandardITVDriver::class, self::KLING_IMAGE => FalAI\KlingImageDriver::class, self::LUMA_DREAM_MACHINE => FalAI\LumaDreamMachineDriver::class, self::HAIPER => FalAI\HaiperDriver::class, self::MINIMAX => FalAI\MinimaxDriver::class, self::VIDEO_UPSCALER => FalAI\VideoUpscalerDriver::class, self::COGVIDEOX_5B => FalAI\Cogvideox5bDriver::class, self::ANIMATEDIFF_V2V => FalAI\AnimatediffV2vDriver::class, self::FAST_ANIMATEDIFF_TURBO => FalAI\FastAnimatediffTurboDriver::class, // CREATIFY self::AD_MARKETING_VIDEO => Creatify\AdMarketingVideoDriver::class, // Topview self::AD_MARKETING_VIDEO_TOPVIEW => Topview\AdMarketingVideoTopviewDriver::class, // Ai clip self::AI_CLIP_KLAP => Klap\AIClipKlapDriver::class, self::AI_CLIP_VIZARD => Vizard\AIClipVizardDriver::class, // AI/ML api minimax engine self::MUSIC_01 => AiMlMinimax\Music01Driver::class, // OpenRouter self::ANTHROPIC_CLAUDE_3_5_HAIKU_20241022 => OpenRouter\AnthropicClaude35Haiku20241022::class, self::ANTHROPIC_CLAUDE_3_5_HAIKU_20241022_SELF_MODERATED => OpenRouter\AnthropicClaude35Haiku20241022SelfModerated::class, self::ANTHROPIC_CLAUDE_3_5_HAIKU => OpenRouter\AnthropicClaude35Haiku::class, self::ANTHROPIC_CLAUDE_3_5_HAIKU_SELF_MODERATED => OpenRouter\AnthropicClaude35HaikuSelfModerated::class, self::LUMIMAID_V02_70B => OpenRouter\LumimaidV0270B::class, self::MAGNUM_V4_72B => OpenRouter\MagnumV472B::class, self::XAI_GROK_BETA => OpenRouter\XaiGrokBeta::class, self::MINISTRAL_8B => OpenRouter\Ministral8B::class, self::MINISTRAL_3B => OpenRouter\Ministral3B::class, self::QWEN25_7B_INSTRUCT => OpenRouter\Qwen257BInstruct::class, self::NVIDIA_LLAMA_31_NEMOTRON_70B_INSTRUCT => OpenRouter\NvidiaLlama31Nemotron70BInstruct::class, self::INFLECTION_3_PI => OpenRouter\Inflection3Pi::class, self::INFLECTION_3_PRODUCTIVITY => OpenRouter\Inflection3Productivity::class, self::LIQUID_LFM_40B_MOE_FREE => OpenRouter\LiquidLfm40BMoeFree::class, self::LIQUID_LFM_40B_MOB => OpenRouter\LiquidLfm40BMob::class, self::ROCINANTE_12B => OpenRouter\Rocinante12B::class, self::EVA_QWEN25_14B => OpenRouter\EvaQwen2514B::class, self::MAGNUM_V2_72B => OpenRouter\MagnumV272B::class, self::META_LLAMA32_3B_INSTRUCT_FREE => OpenRouter\MetaLlama323BInstructFree::class, self::META_LLAMA32_1B_INSTRUCT_FREE => OpenRouter\MetaLlama321BInstructFree::class, self::META_LLAMA32_3B_INSTRUCT => OpenRouter\MetaLlama323BInstruct::class, self::META_LLAMA32_1B_INSTRUCT => OpenRouter\MetaLlama321BInstruct::class, self::PERPLEXITY_LLAMA_31_SONAR_405B_ONLINE => OpenRouter\PerplexityLlama31Sonar405BOnline::class, self::PERPLEXITY_LLAMA_31_SONAR_70B_ONLINE => OpenRouter\PerplexityLlama31Sonar70BOnline::class, self::PERPLEXITY_LLAMA_31_SONAR_70B => OpenRouter\PerplexityLlama31Sonar70B::class, self::PERPLEXITY_LLAMA_31_SONAR_8B_ONLINE => OpenRouter\PerplexityLlama31Sonar8BOnline::class, self::PERPLEXITY_LLAMA_31_SONAR_8B => OpenRouter\PerplexityLlama31Sonar8B::class, }; } /** @noinspection PhpDuplicateMatchArmBodyInspection */ public function unitPrice(): float { return match ($this) { // Images & Video Models self::BLACK_FOREST_LABS_FLUX_1_SCHNELL => 0.01, self::IMAGE_TO_VIDEO => 0.5, self::STABLE_DIFFUSION_XL_1024_V_1_0 => 0.05, self::STABLE_DIFFUSION_V_1_6 => 0.03, self::SD_3, self::ULTRA, self::SD_3_TURBO => 0.06, self::SD_3_MEDIUM => 0.06, self::SD_3_LARGE => 0.10, self::SD_3_LARGE_TURBO => 0.15, self::SD_3_5_LARGE => 0.15, self::SD_3_5_LARGE_TURBO => 0.20, self::SD_3_5_MEDIUM => 0.10, self::CORE => 0.03, self::AWS_BEDROCK => 0.05, // OpenAI self::DAVINCI, self::GPT_3_5_TURBO_1106, self::GPT_3_5_TURBO => 0.00000266, self::TEXT_DAVINCI_003 => 0.0000266, self::GPT_3_5_TURBO_0125 => 0.000001995, self::GPT_4_TURBO, self::GPT_4_1106_PREVIEW, self::GPT_4_0125_PREVIEW, self::TTS_1_HD => 0.0000399, self::GPT_4 => 0.0000798, self::TEXT_EMBEDDING_ADA_002 => 0.0000000665, self::TEXT_EMBEDDING_3_SMALL => 0.000000027, self::TEXT_EMBEDDING_3_LARGE => 0.0000000665, self::WHISPER_1 => 0.000000798, self::DALL_E_2 => 0.04, self::DALL_E_3 => 0.08, self::GPT_IMAGE_1 => 0.042, self::TTS_1, self::GPT_4_O => 0.00001995, self::GPT_4_O_MINI => 0.000000798, self::GPT_4_O_SEARCH_PREVIEW => 0.0000133, self::GPT_4_O_MINI_SEARCH_PREVIEW => 0.000000798, self::GPT_4_O1_PREVIEW => 0.0000798, self::GPT_4_O1_MINI => 0.000005852, self::GPT_O_1 => 0.0000798, self::GPT_O_03_mini => 0.000005852, self::GPT_4_O_REALTIME_PREVIEW => 0.0000266, self::GPT_4_1 => 0.00001064, self::GPT_4_1_NANO => 0.000000665, self::GPT_4_1_MINI => 0.00000266, self::GPT_O_4_MINI => 0.000005852, self::GPT_O_3 => 0.0000665, self::GPT_5 => 0.000013330, self::GPT_5_MINI => 0.000002670, self::GPT_5_NANO => 0.000000530, self::GPT_5_CHAT => 0.00001000, self::GPT_5_PRO => 0.00016, self::SORA_2 => 0.10, self::SORA_2_PRO => 0.50, // Anthropic self::CLAUDE_SONNET_4_5, self::CLAUDE_OPUS_4_1, self::CLAUDE_OPUS_4, self::CLAUDE_SONNET_4, self::CLAUDE_3_7_SONNET, self::CLAUDE_3_5_SONNET_V2, self::CLAUDE_3_5_SONNET, self::CLAUDE_3_SONNET => 0.000015, self::CLAUDE_3_5_HAIKU => 0.000003, self::CLAUDE_3_OPUS => 0.000015, self::CLAUDE_3_HAIKU => 0.000003, self::CLAUDE_2_1, self::CLAUDE_2_0 => 0.000015, // Voyage self::VOYAGE_2, self::VOYAGE_CODE_2 => 0.00001, self::VOYAGE_LARGE_2 => 0.000015, // Deepseek self::DEEPSEEK_CHAT => 0.00000147, self::DEEPSEEK_REASONER => 0.00000292, // Others self::CLIPDROP => 0.5, self::NOVITA => 0.017, self::FREEPIK => 0.20, self::PLAGIARISMCHECK => 0.000276, self::SYNTHESIA => 2.97, self::HEYGEN => 0.5, self::PEBBLELY => 0.019, // Gemini self::GEMINI_2_5_FLASH_PREVIEW_05_20 => 0.00000333, self::GEMINI_2_5_PRO => 0.00001333, self::GEMINI_2_0_FLASH => 0.00000053, self::GEMINI_2_0_FLASH_LITE => 0.00000040, self::GEMINI_1_5_PRO => 0.00001333, self::GEMINI_EMBEDDING_EXP => 0.00001, self::GEMINI_1_5_FLASH => 0.00000051, self::GEMINI_TEXT_EMBEDDING_004 => 0.00001, // Unsplash self::UNSPLASH, self::PEXELS, self::PIXABAY => 0.01, // Elevenlabs self::ELEVENLABS, self::ELEVENLABS_VOICE_CHATBOT, self::ELEVENLABS_AI_MUSIC, self::ISOLATOR => 0.3, // Google self::GOOGLE => 0.016, // Azure self::AZURE => 0.015, self::AZURE_OPENAI => 0.00, // Speechify self::Speechify => 0.015, // Serper self::SERPER => 0.001, // Perplexity self::PERPLEXITY => 0.00002, // PiAPI self::MIDJOURNEY => 0.03, // X AI self::GROK_2_1212, self::GROK_2_VISION_1212 => 0.00001333, self::GROK_3 => 0.00002, self::GROK_3_MINI => 0.00000067, self::GROK_3_FAST => 0.00003333, self::GROK_3_MINI_FAST => 0.000001, self::GROK_4 => 0.000011000, self::GROK_4_FAST => 0.000000650, // FAL AI self::NANO_BANANA => 0.039, self::SEEDREAM_4 => 0.03, self::FLUX_PRO_1_1, self::FLUX_REALISM, self::IMAGEN_4 => 0.04, self::NANO_BANANA_EDIT, self::SEEDREAM_4_EDIT => 0.4, self::GAMMA_AI => 0.01, self::VEO_2 => 2.5, self::VEED => 0.35, self::VEO_3_1_TEXT_TO_VIDEO => 3.2, self::VEO_3_1_TEXT_TO_VIDEO_FAST => 1.2, self::VEO_3_1_FIRST_LAST_FRAME_TO_VIDEO => 3.2, self::VEO_3_1_FIRST_LAST_FRAME_TO_VIDEO_FAST => 1.2, self::VEO_3_1_IMAGE_TO_VIDEO => 3.2, self::VEO_3_1_IMAGE_TO_VIDEO_FAST => 1.2, self::VEO_3_1_REFERENCE_TO_VIDEO => 3.2, self::VEO_3_FAST => 1.2, self::VEO_3 => 3.2, self::KLING_VIDEO => 1.4, self::FLUX_PRO_KONTEXT_TEXT_TO_IMAGE, self::FLUX_PRO_KONTEXT, self::FLUX_PRO => 0.4, self::FLUX_SCHNELL => 0.003, self::FLUX_PRO_KONTEXT_MAX_MULTI => 0.8, self::KLING_2_5_TURBO_PRO_TTV, self::KLING_2_5_TURBO_PRO_ITV, self::KLING_2_5_TURBO_STANDARD_ITV => 0.6, self::KLING, self::KLING_2_1, self::KLING_IMAGE, self::LUMA_DREAM_MACHINE, self::HAIPER, self::MINIMAX => 0.5, self::IDEOGRAM => 0.6, self::VIDEO_UPSCALER, self::COGVIDEOX_5B, self::ANIMATEDIFF_V2V, self::FAST_ANIMATEDIFF_TURBO => 0.20, // Creatify self::AD_MARKETING_VIDEO => 1.5, // Topview self::AD_MARKETING_VIDEO_TOPVIEW => 1.5, // Ai clips self::AI_CLIP_KLAP => 0.48, self::AI_CLIP_VIZARD => 0.24, // Music self::MUSIC_01 => 0.05, // OpenRouter self::ANTHROPIC_CLAUDE_3_5_HAIKU_20241022 => 0.00000533, self::ANTHROPIC_CLAUDE_3_5_HAIKU_20241022_SELF_MODERATED => 0.00000533, self::ANTHROPIC_CLAUDE_3_5_HAIKU => 0.00000533, self::ANTHROPIC_CLAUDE_3_5_HAIKU_SELF_MODERATED => 0.00000533, self::LUMIMAID_V02_70B => 0.005, self::MAGNUM_V4_72B => 0.005, self::XAI_GROK_BETA => 0.005, self::MINISTRAL_8B => 0.005, self::MINISTRAL_3B => 0.005, self::QWEN25_7B_INSTRUCT => 0.005, self::NVIDIA_LLAMA_31_NEMOTRON_70B_INSTRUCT => 0.005, self::INFLECTION_3_PI => 0.005, self::INFLECTION_3_PRODUCTIVITY => 0.005, self::LIQUID_LFM_40B_MOE_FREE => 0.005, self::LIQUID_LFM_40B_MOB => 0.005, self::ROCINANTE_12B => 0.005, self::EVA_QWEN25_14B => 0.005, self::MAGNUM_V2_72B => 0.005, self::META_LLAMA32_3B_INSTRUCT_FREE => 0.005, self::META_LLAMA32_1B_INSTRUCT_FREE => 0.005, self::META_LLAMA32_3B_INSTRUCT => 0.005, self::META_LLAMA32_1B_INSTRUCT => 0.005, self::PERPLEXITY_LLAMA_31_SONAR_405B_ONLINE => 0.005, self::PERPLEXITY_LLAMA_31_SONAR_70B_ONLINE => 0.005, self::PERPLEXITY_LLAMA_31_SONAR_70B => 0.005, self::PERPLEXITY_LLAMA_31_SONAR_8B_ONLINE => 0.005, self::PERPLEXITY_LLAMA_31_SONAR_8B => 0.000000270, // Default fallback default => 0.0, }; } public static function getPlanLimits(EngineEnum $engine): Collection { return collect(self::listableCases())->filter( fn (EntityEnum $model) => $model->engine() === $engine )->mapWithKeys( fn (EntityEnum $model) => [ $model->slug() => [ 'credit' => 0, 'isUnlimited' => false, ], ] ); } public function subLabel(): string { $driverClass = $this->driverClass(); return match (true) { class_interface_exists($driverClass, WithVideoToVideoInterface::class) => __('Video'), class_interface_exists($driverClass, WithImagesInterface::class) => __('Images'), class_interface_exists($driverClass, WithWordsInterface::class) => __('Words'), class_interface_exists($driverClass, WithCharsInterface::class) => __('Characters'), class_interface_exists($driverClass, WithMinuteInterface::class) => __('Minutes'), class_interface_exists($driverClass, WithSecondInterface::class) => __('Seconds'), class_interface_exists($driverClass, WithImageToVideoInterface::class) => __('Image to Video'), class_interface_exists($driverClass, WithTextToSpeechInterface::class) => __('Text to Speech'), class_interface_exists($driverClass, WithSpeechToTextInterface::class) => __('Speech to Text'), class_interface_exists($driverClass, WithTextToVideoInterface::class) => __('Text to Video'), class_interface_exists($driverClass, WithVisionPreviewInterface::class) => __('Vision'), class_interface_exists($driverClass, WithPresentationInterface::class) => __('Presentation'), class_interface_exists($driverClass, WithPlagiarismInterface::class) => __('Plagiarism'), }; } public function tokenType(): AITokenType { $driverClass = $this->driverClass(); return match (true) { class_interface_exists($driverClass, WithImagesInterface::class) => AITokenType::IMAGE, class_interface_exists($driverClass, WithWordsInterface::class) => AITokenType::WORD, class_interface_exists($driverClass, WithCharsInterface::class) => AITokenType::CHARACTER, class_interface_exists($driverClass, WithMinuteInterface::class) => AITokenType::MINUTE, class_interface_exists($driverClass, WithSecondInterface::class) => AITokenType::SECOND, class_interface_exists($driverClass, WithPresentationInterface::class) => AITokenType::PRESENTATION, class_interface_exists($driverClass, WithImageToVideoInterface::class) => AITokenType::IMAGE_TO_VIDEO, class_interface_exists($driverClass, WithTextToSpeechInterface::class) => AITokenType::TEXT_TO_SPEECH, class_interface_exists($driverClass, WithSpeechToTextInterface::class) => AITokenType::SPEECH_TO_TEXT, class_interface_exists($driverClass, WithTextToVideoInterface::class) => AITokenType::TEXT_TO_VIDEO, class_interface_exists($driverClass, WithVideoToVideoInterface::class) => AITokenType::VIDEO_TO_VIDEO, class_interface_exists($driverClass, WithVisionPreviewInterface::class) => AITokenType::VISION, class_interface_exists($driverClass, WithPlagiarismInterface::class) => AITokenType::PLAGIARISM }; } public function tooltipHowToCalc(): string { $driverClass = $this->driverClass(); return match (true) { class_interface_exists($driverClass, WithImagesInterface::class) => __('1 Credit = 1 Image'), class_interface_exists($driverClass, WithWordsInterface::class), class_interface_exists($driverClass, WithSpeechToTextInterface::class), class_interface_exists($driverClass, WithVisionPreviewInterface::class), class_interface_exists($driverClass, WithPlagiarismInterface::class) => __('1 Credit = 1 Word'), class_interface_exists($driverClass, WithCharsInterface::class) => __('1 Credit = 1 Character'), class_interface_exists($driverClass, WithMinuteInterface::class) => __('1 Credit = 1 Minute'), class_interface_exists($driverClass, WithSecondInterface::class) => __('1 Credit = 1 Second'), class_interface_exists($driverClass, WithPresentationInterface::class) => __('1 Credit = 1 Presentation Credit'), class_interface_exists($driverClass, WithImageToVideoInterface::class), class_interface_exists($driverClass, WithVideoToVideoInterface::class), class_interface_exists($driverClass, WithTextToVideoInterface::class) => __('1 Credit = 1 Video'), class_interface_exists($driverClass, WithTextToSpeechInterface::class) => __('1 Credit = 1 Voice'), }; } public static function entityDrivers(): array { return [ WithImagesInterface::class, WithWordsInterface::class, WithCharsInterface::class, WithMinuteInterface::class, WithSecondInterface::class, WithPresentationInterface::class, WithImageToVideoInterface::class, WithVideoToVideoInterface::class, WithTextToSpeechInterface::class, WithSpeechToTextInterface::class, WithTextToVideoInterface::class, WithVisionPreviewInterface::class, WithPlagiarismInterface::class, ]; } public function defaultCreditForDemo(): float { $driverClass = $this->driverClass(); return match (true) { class_interface_exists($driverClass, WithImagesInterface::class) => 200, class_interface_exists($driverClass, WithWordsInterface::class), class_interface_exists($driverClass, WithCharsInterface::class) => 5000, class_interface_exists($driverClass, WithMinuteInterface::class) => 20, class_interface_exists($driverClass, WithSecondInterface::class) => 8, class_interface_exists($driverClass, WithPresentationInterface::class), class_interface_exists($driverClass, WithVideoToVideoInterface::class), class_interface_exists($driverClass, WithImageToVideoInterface::class), class_interface_exists($driverClass, WithTextToSpeechInterface::class), class_interface_exists($driverClass, WithSpeechToTextInterface::class), class_interface_exists($driverClass, WithTextToVideoInterface::class), class_interface_exists($driverClass, WithVisionPreviewInterface::class), class_interface_exists($driverClass, WithPlagiarismInterface::class) => 100, }; } public function isBetaEntity(): bool { return false; } public static function embedingModels(EngineEnum $engineEnum): array { return match ($engineEnum) { EngineEnum::ANTHROPIC => [ self::VOYAGE_2, self::VOYAGE_CODE_2, self::VOYAGE_LARGE_2, ], EngineEnum::GEMINI => [ self::GEMINI_TEXT_EMBEDDING_004, self::GEMINI_EMBEDDING_EXP, ], default => [ self::TEXT_EMBEDDING_ADA_002, self::TEXT_EMBEDDING_3_SMALL, self::TEXT_EMBEDDING_3_LARGE, ] }; } public function isEmbedding(): bool { return in_array($this, [ self::TEXT_EMBEDDING_ADA_002, self::TEXT_EMBEDDING_3_SMALL, self::TEXT_EMBEDDING_3_LARGE, self::GEMINI_TEXT_EMBEDDING_004, self::GEMINI_EMBEDDING_EXP, self::VOYAGE_2, self::VOYAGE_CODE_2, self::VOYAGE_LARGE_2, ]); } public static function reWriterModels(EngineEnum $engineEnum): array { return match ($engineEnum) { default => [ self::DAVINCI, self::TEXT_DAVINCI_003, self::GPT_3_5_TURBO, self::GPT_3_5_TURBO_0125, self::GPT_4, self::GPT_4_1106_PREVIEW, self::GPT_4_0125_PREVIEW, self::GPT_4_TURBO, self::GPT_4_O, self::GPT_4_O_MINI, self::GPT_4_O_SEARCH_PREVIEW, self::GPT_4_O_MINI_SEARCH_PREVIEW, self::GPT_4_O1_PREVIEW, self::GPT_4_O1_MINI, self::GPT_O_1, self::GPT_O_03_mini, self::GPT_4_1, self::GPT_O_4_MINI, self::GPT_4_1_NANO, self::GPT_4_1_MINI, self::GPT_O_3, self::GPT_5, self::GPT_5_MINI, self::GPT_5_NANO, self::GPT_5_CHAT, self::GPT_5_PRO, self::DEEPSEEK_CHAT, self::DEEPSEEK_REASONER, ] }; } public function keyAsString(): string { return (string) $this->name; } public function valueAsString(): string { return (string) $this->value; } } Models/Entity.php000064400000004237152665637620010004 0ustar00 EngineEnum::class, 'key' => EntityEnum::class, 'status' => StatusEnum::class, ]; public function tokens(): HasMany { return $this->hasMany(Token::class); } public function wordToken(): ?Token { return $this->tokens->firstWhere('type', AITokenType::WORD); } public function imageToken(): ?Token { return $this->tokens->firstWhere('type', AITokenType::IMAGE); } public function aiFinance(): HasMany { return $this->hasMany(AiChatModelPlan::class); } public function scopeIsEnabled(Builder $query): Builder { return $query->where('status', StatusEnum::ENABLED); } public function scopeByEngine(Builder $query, EngineEnum $engine): Builder { return $query->where('engine', $engine); } public static function planModels(): Collection|array { return once(static function () { $planId = getCurrentActiveSubscription()?->getAttribute('plan_id') ?? 0; $query = self::query(); if ($planId == 0) { $query->where('is_selected', 1); } else { $query->whereHas('aiFinance', function ($query) use ($planId) { $query->where('plan_id', $planId); }); } $query->whereHas('tokens', function ($query) { $query->where('type', 'word'); }); return $query->get(); }); } } EntityStatItem.php000064400000006643152665637620010237 0ustar00user = $user; return $this; } public function forPlan(?Plan $plan): self { $this->plan = $plan; return $this; } public function forTeam(?Team $team): self { $this->team = $team; return $this; } private function getUser(): Authenticatable|User|null { return $this->user ?? auth()->user(); } public function list(): Collection { return once(function () { return $this->allEntities() ->filter( fn (EntityDriverInterface $driver) => $driver instanceof $this->type ) ->includeDisabled($this->includeDisabled) ->includeUnlisted($this->includeUnlisted); }); } public function totalCredits(): float { return $this->list()->sum( fn (WithCreditInterface $driver) => $driver->forUser($this->getUser())->forPlan($this->plan)->forTeam($this->team)->creditBalance() ); } public function totalCreditsForGroup(): float { return $this->list()->sum( fn (WithCreditInterface $driver) => $driver->forUser($this->getUser())->forPlan($this->plan)->forTeam($this->team)->getCreditBalance() ); } public function checkIfThereUnlimited(): bool { return $this->list()->contains( fn (WithCreditInterface $driver) => $driver->forUser($this->getUser())->forPlan($this->plan)->isUnlimitedCredit() ); } public function checkIfThereUnlimitedForGroup(): bool { return $this->list()->contains( fn (WithCreditInterface $driver) => $driver->forUser($this->getUser())->forPlan($this->plan)->forTeam($this->team)->getIsUnlimitedCredit() ); } public function entityCount(): int { return $this->list()->count(); } public function includeDisabled(bool $condition): static { $this->includeDisabled = $condition; return $this; } public function includeUnlisted(bool $condition): static { $this->includeUnlisted = $condition; return $this; } public function filterByEngine(EngineEnum $enum): static { $this->filterByEngine = $enum; return $this; } private function allEntities(): Collection { return once(function () { if (is_null($this->user) && ! $this->plan?->exists) { $this->forUser(Auth::user()); } return Entity::all(filterByEngine: $this->filterByEngine, user: $this->user, plan: $this->plan, team: $this->team); }); } } Mixins/EntityCollectionMixin.php000064400000002470152665637620013046 0ustar00when( ! $condition, fn ($entities) => $entities->filter(fn (WithStatus $driver) => $driver->isEnabled()) ); }; } public function includeUnlisted(): Closure { /** @phpstan-ignore-next-line */ return function (bool $condition): Collection|static { /** * @var Collection|HigherOrderCollectionProxy $this */ return $this->when( ! $condition, fn ($entities) => $entities->filter(fn (EntityDriverInterface&WithCreditInterface $driver) => $driver->enum() === $driver->creditEnum()) ); }; } } Concerns/Input/HasInput.php000064400000000714152665637620011705 0ustar00input)) { throw new RuntimeException('Input is not provided'); } return $this->input; } public function input(string $input): static { $this->input = $input; return $this; } } Concerns/Input/HasInputMinute.php000064400000000771152665637620013072 0ustar00inputMinute)) { throw new RuntimeException('Input is not provided'); } return $this->inputMinute; } public function inputMinute(int $inputMinute): static { $this->inputMinute = $inputMinute; return $this; } } Concerns/Input/HasInputImage.php000064400000001044152665637620012645 0ustar00inputImageCount)) { throw new RuntimeException('Input image count is not provided'); } return $this->inputImageCount; } public function inputImageCount(int $inputImageCount): static { $this->inputImageCount = $inputImageCount; return $this; } } Concerns/Input/HasInputVoice.php000064400000001044152665637620012670 0ustar00inputVoiceCount)) { throw new RuntimeException('Input video count is not provided'); } return $this->inputVoiceCount; } public function inputVoiceCount(int $inputVoiceCount): static { $this->inputVoiceCount = $inputVoiceCount; return $this; } } Concerns/Input/HasInputVideo.php000064400000001044152665637620012671 0ustar00inputVideoCount)) { throw new RuntimeException('Input video count is not provided'); } return $this->inputVideoCount; } public function inputVideoCount(int $inputVideoCount): static { $this->inputVideoCount = $inputVideoCount; return $this; } } Concerns/Input/HasInputSecond.php000064400000000771152665637620013044 0ustar00inputSecond)) { throw new RuntimeException('Input is not provided'); } return $this->inputSecond; } public function inputSecond(int $inputSecond): static { $this->inputSecond = $inputSecond; return $this; } } Concerns/Input/HasInputPresentation.php000064400000001065152665637620014301 0ustar00inputPresentation)) { throw new RuntimeException('Input is not provided'); } return $this->inputPresentation; } public function inputPresentation(float $inputPresentation): static { $this->inputPresentation = $inputPresentation; return $this; } } Concerns/HasStatus.php000064400000001300152665637620010762 0ustar00model()?->status; } public function isEnabled(): bool { if ($this instanceof EntityDriverInterface && ! $this->engineDriver()->isEnabled()) { return false; } return $this->status() === StatusEnum::ENABLED; } public function updateStatus(bool $status): bool { return $this->model()->update([ 'status' => $status ? StatusEnum::ENABLED : StatusEnum::DISABLED, ]); } } Concerns/HasCreditLimit.php000064400000021745152665637620011727 0ustar00enum()->creditBy(); } protected function getPlanWithCredit(): ?Plan { $this->ensurePlanProvided(); return $this->plan; } protected function getTeamWithCredit(): ?Team { $this->ensureTeamProvided(); return $this->team; } protected function getUserWithCredit(): null|User|Authenticatable { $this->ensureUserProvided(); return $this->getUser(); } public function getCredit(): array { if ($this->plan?->exists) { return $this->getPlanWithCredit()?->getCredit($this->engine()->slug(), $this->creditKey()); } $user = $this->getUserWithCredit(); if ($this->team?->exists || $user?->myTeam?->exists) { if (! $this->team?->exists) { $this->team = $user?->myTeam; } $memberStat = $user->teamMember; if (isset($memberStat) && $memberStat->status !== 'active') { // If the user is not an active member of the team, return the user's credit return $user?->getCredit($this->engine()->slug(), $this->creditKey()) ?? []; } $userCredits = $this->getUserWithCredit()?->getCredit($this->engine()->slug(), $this->creditKey()); $teamCredits = $this->getTeamWithCredit()?->getCredit($this->engine()->slug(), $this->creditKey()); $mergedCredits = [ 'credit' => 0, 'isUnlimited' => false, ]; if (($userCredits['isUnlimited'] ?? false) || ($teamCredits['isUnlimited'] ?? false)) { $mergedCredits['isUnlimited'] = true; $mergedCredits['credit'] = 0; } else { $mergedCredits['credit'] = ($userCredits['credit'] ?? 0) + ($teamCredits['credit'] ?? 0); } return $mergedCredits; } return $user?->getCredit($this->engine()->slug(), $this->creditKey()); } /** * @throws Exception */ public function creditBalance(): float { return match (config('octane.enabled') || isset($this->team)) { true => $this->getCreditBalance(), default => once(function () { return $this->getCreditBalance(); }), }; } /** * @throws Exception */ public function isUnlimitedCredit(): bool { return match (config('octane.enabled')) { true => $this->getIsUnlimitedCredit(), default => once(function () { return $this->getIsUnlimitedCredit(); }), }; } public function getCreditBalance(): float { $credit = $this->getCredit()['credit']; if (is_string($credit)) { $credit = (float) $credit; } $aiFinances = app('ai_chat_model_plan'); $engineDefaultModels = $this->engine()->getDefaultModels(Setting::getCache(), SettingTwo::getCache()); $model = $this->model(config('octane.enabled')); if ( $model && ! $model->is_selected && ! in_array($model->key, $engineDefaultModels, true) && ! in_array($model->id, $aiFinances, true) ) { return 0; } return $credit; } /** * @throws Exception */ public function getIsUnlimitedCredit(): bool { $aiFinances = app('ai_chat_model_plan'); $engineDefaultModels = $this->engine()->getDefaultModels(Setting::getCache(), SettingTwo::getCache()); $model = $this->model(config('octane.enabled')); if ( $model && ! $model->is_selected && ! in_array($model->key, $engineDefaultModels, true) && ! in_array($model->id, $aiFinances, true) ) { return false; } return $this->getCredit()['isUnlimited']; } /** * @throws Exception */ public function hasCreditBalance(): bool { if ($this->guest) { return $this->guestHasAttempts(); } return $this->creditBalance() > 0 || $this->isUnlimitedCredit(); } public function guestHasAttempts(): bool { $clientIp = Helper::getRequestIp(); $rateLimiter = new \App\Helpers\Classes\RateLimiter\RateLimiter('guest-chat-attempt', (int) setting('guest_user_daily_message_limit', '10')); if ($rateLimiter->attempt($clientIp)) { return true; } return false; } /** * @throws Exception */ public function redirectIfNoCreditBalance(): void { if ($this->hasCreditBalance()) { return; } MagicResponse::NO_CREDITS_LEFT->exception(); } /** * @throws Exception */ public function setCredit(float $value = 1.00): bool { return $this->updateUserCredit($value, function ($creditBalance, $credit) { return $credit; }, skipCalculatedCredit: true); } /** * @throws Exception */ public function setDefaultCreditForDemo(): bool { if ($this->getUserWithCredit()?->isAdmin()) { $this->setAsUnlimited(); } return $this->setCredit($this->creditEnum()->defaultCreditForDemo()); } public function setAsUnlimited(bool $unlimited = true): bool { $user = $this->getUserWithCredit(); $creditKey = $this->creditKey(); $engineKey = $this->engine()->slug(); $creditsArr = $user?->entity_credits; $creditsArr[$engineKey][$creditKey] = [ 'credit' => $creditsArr[$engineKey][$creditKey]['credit'] ?? 0.0, 'isUnlimited' => $unlimited, ]; return $user?->update([ 'entity_credits' => $creditsArr, ]); } /** * @throws Exception */ public function increaseCredit(float $value = 1.00): bool { return $this->updateUserCredit($value, function ($creditBalance, $credit) { return $creditBalance + $credit; }); } /** * @throws Exception */ public function decreaseCredit(float $value = 1.00): bool { if ($this->guest || $this->isUnlimitedCredit()) { return true; } $unitPrice = EntityEnum::fromSlug($this->enum()->slug())->unitPrice(); $currentSpend = $value * $unitPrice; setting(['total_spend' => number_format((setting('total_spend', 0) + $currentSpend), 2)])->save(); UserUsageCredit::create([ 'user_id' => $this->getUser()->id, 'model_key' => $this->enum()->slug(), 'credit' => $value, 'unit_price' => $unitPrice, 'total' => $value * $unitPrice, ]); return $this->updateUserCredit($value, function ($creditBalance, $credit) { return max(0, $creditBalance - $credit); }); } /** * @throws Exception */ private function updateUserCredit(float $value, Closure $callback, bool $skipCalculatedCredit = false): bool { $user = $this->getUserWithCredit(); $team = $this->team; if ($skipCalculatedCredit) { $credit = $value; } else { $credit = $this->calculatedInputCredit ?: $value; } $creditKey = $this->creditKey(); $engineKey = $this->engine()->slug(); $isTeamCredit = isset($team) && $team->exists; $target = $isTeamCredit ? $team : $user; $creditsArr = $target && isset($target->entity_credits) ? $target->entity_credits : User::getFreshCredits(); $creditsArr[$engineKey][$creditKey] = [ 'credit' => $callback($this->creditBalance(), $credit), 'isUnlimited' => $creditsArr[$engineKey][$creditKey]['isUnlimited'] ?? false, ]; return $target?->update([ 'entity_credits' => $creditsArr, ]); } public function getCreditIndex(): float { return $this->creditEnum()->creditIndex(); } public function getCalculatedInputCredit(): float { return $this->calculatedInputCredit; } /** * @throws Exception */ public function hasCreditBalanceForInput(): bool { if ($this->isUnlimitedCredit()) { return true; } return $this->creditBalance() > $this->getCalculatedInputCredit(); } public function setCalculatedInputCredit($value = 0.0): static { $this->calculatedInputCredit = $value; return $this; } } Concerns/HasModel.php000064400000002521152665637620010545 0ustar00getEntity($fresh)?->firstWhere('key.value', value: $this->name()); } private function getEntity(?bool $fresh = false): ?Collection { $ttl = Helper::appIsNotDemo() ? 10 : 600; // If fresh is true, bypass the cache and fetch directly from the database if ($fresh) { $validEngines = collect(EntityEnum::cases())->pluck('value'); Entity::whereNotIn('key', $validEngines)->delete(); return Entity::whereIn('key', $validEngines)->get(); } // Otherwise, use the cache to store/retrieve the entities return Cache::remember('entities', $ttl, static function () { $validEngines = collect(EntityEnum::cases())->pluck('value'); Entity::whereNotIn('key', $validEngines)->delete(); return Entity::whereIn('key', $validEngines)->get(); }); } } Concerns/Calculate/HasSpeechToText.php000064400000000465152665637620013766 0ustar00getInput(), -1, PREG_SPLIT_NO_EMPTY)); return $wordCount * $this->getCreditIndex(); } } Concerns/Calculate/HasTextToSpeech.php000064400000000412152665637620013756 0ustar00getInputVoiceCount(); return $voiceCount * $this->getCreditIndex(); } } Concerns/Calculate/HasVisionPreview.php000064400000000466152665637620014221 0ustar00getInput(), -1, PREG_SPLIT_NO_EMPTY)); return $wordCount * $this->getCreditIndex(); } } Concerns/Calculate/HasTextToVideo.php000064400000000411152665637620013614 0ustar00getInputVideoCount(); return $videoCount * $this->getCreditIndex(); } } Concerns/Calculate/HasPlagiarism.php000064400000000554152665637620013476 0ustar00getInput(), -1, PREG_SPLIT_NO_EMPTY)); return $wordCount * $this->getCreditIndex(); } } Concerns/Calculate/HasPresentation.php000064400000000441152665637620014054 0ustar00getInputPresentation() * $this->getCreditIndex(); } } Concerns/Calculate/HasMinutes.php000064400000000335152665637620013027 0ustar00getInputMinute() * $this->getCreditIndex(); } } Concerns/Calculate/HasVideoToVideo.php000064400000000412152665637620013737 0ustar00getInputVideoCount(); return $videoCount * $this->getCreditIndex(); } } Concerns/Calculate/HasWords.php000064400000000456152665637620012505 0ustar00getInput(), -1, PREG_SPLIT_NO_EMPTY)); return $wordCount * $this->getCreditIndex(); } } Concerns/Calculate/HasCharacters.php000064400000000454152665637620013464 0ustar00getInput())->length(); return $charCount * $this->getCreditIndex(); } } Concerns/Calculate/HasImageToVideo.php000064400000000412152665637620013713 0ustar00getInputVideoCount(); return $videoCount * $this->getCreditIndex(); } } Concerns/Calculate/HasImages.php000064400000000404152665637620012605 0ustar00getInputImageCount(); return $imageCount * $this->getCreditIndex(); } } Concerns/Calculate/HasSecond.php000064400000000334152665637620012615 0ustar00getInputSecond() * $this->getCreditIndex(); } } BaseDriver.php000064400000010307152665637620007326 0ustar00enum()->engine(); } public function engineDriver(): EngineDriverInterface { return Engine::driver($this->enum()->engine()); } protected function setUser(?User $user): static { $this->user = $user; return $this; } protected function setGuest(bool $condition = true): static { $this->guest = $condition; return $this; } public function ensureUserProvided(): void { if (! isset($this->user)) { throw new RuntimeException('User is not provided'); } } public function ensurePlanProvided(): void { if (! isset($this->plan)) { throw new RuntimeException('Plan is not provided'); } } public function ensureTeamProvided(): void { if (! isset($this->team)) { throw new RuntimeException('Team is not provided'); } } private function setLastUsedUserId(?int $id): static { $this->lastUsedUserId = $id; return $this; } public function forUser(null|int|User $user): static { $userModel = is_int($user) ? User::findOrFail($user) : $user; return $this->setUser($userModel)->createDriverReqsIfNeeded(false); } public function forPlan(?Plan $plan): static { $this->plan = $plan; return $this; } public function forTeam(?Team $team): static { $this->team = $team; return $this; } public function forGuest(): static { $this->setGuest(true); return $this; } protected function forCurrentUser(): static { $user = auth()->user(); if (! $user) { throw new RuntimeException('User is not authenticated'); } return $this->forUser($user); } protected function createDriverUserReqsIfNeeded(bool $forCurrentUser = true): static { if ($forCurrentUser) { $userId = $this->forCurrentUser()->getUser()->id; } else { $userId = $this->getUser()?->id; } if ($this->lastUsedUserId !== $userId) { $this->createDriverUserReqs($userId); } return $this; } public function createDriverReqsIfNeeded(bool $forCurrentUser = true): static { $self = $this->createDriverReqs(); if (! $forCurrentUser || auth()->check()) { $self->createDriverUserReqsIfNeeded($forCurrentUser); } return $self; } private function createDriverReqs(): static { return $this; } private function createDriverUserReqs(?int $userId): static { $this->setLastUsedUserId($userId); return $this; } public function label(): string { return $this->enum()->label(); } public function name(): string { return $this->enum()->value; } public function creditKey(): string { return $this->creditEnum()->slug(); } public function calculateCredit(): static { if (! $this->guest) { $this->ensureUserProvided(); } $this->calculatedInputCredit = $this->calculate(); return $this; } public function getUser(): ?User { return $this->user; } } EntityServiceProvider.php000064400000002062152665637620011607 0ustar00app->singleton(EntityManager::class, function ($app) { return new EntityManager($app); }); $this->app->alias(EntityManager::class, 'ai.entity'); } public function boot(): void { $this->registerMixins(); $entity = $this->app->make(EntityManager::class); foreach (EntityEnum::cases() as $value) { $entity->extend($value->value, function ($app) use ($value) { $class = $value->driverClass(); return new $class; }); } } /** * @throws ReflectionException */ private function registerMixins(): void { \Illuminate\Support\Collection::mixin(new EntityCollectionMixin); } } Contracts/Input/WithInputVoiceInterface.php000064400000000351152665637620015077 0ustar00