models.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023
  1. from __future__ import annotations
  2. from dataclasses import dataclass
  3. from typing import Dict, List, Optional
  4. from .Provider import IterListProvider, ProviderType
  5. from .Provider import (
  6. ### No Auth Required ###
  7. Blackbox,
  8. Chatai,
  9. Cloudflare,
  10. Copilot,
  11. DeepInfraChat,
  12. Free2GPT,
  13. FreeGpt,
  14. HuggingSpace,
  15. Grok,
  16. DeepseekAI_JanusPro7b,
  17. DeepSeekAPI,
  18. ImageLabs,
  19. LambdaChat,
  20. OIVSCodeSer2,
  21. OIVSCodeSer0501,
  22. OpenAIFM,
  23. PerplexityLabs,
  24. PollinationsAI,
  25. PollinationsImage,
  26. TeachAnything,
  27. Together,
  28. Websim,
  29. WeWordle,
  30. Yqcloud,
  31. ### Needs Auth ###
  32. BingCreateImages,
  33. CopilotAccount,
  34. Gemini,
  35. GeminiPro,
  36. HuggingChat,
  37. HuggingFace,
  38. HuggingFaceMedia,
  39. HuggingFaceAPI,
  40. MetaAI,
  41. MicrosoftDesigner,
  42. OpenaiAccount,
  43. OpenaiChat,
  44. )
  45. class ModelRegistry:
  46. """Simplified registry for automatic model discovery"""
  47. _models: Dict[str, 'Model'] = {}
  48. _aliases: Dict[str, str] = {}
  49. @classmethod
  50. def register(cls, model: 'Model', aliases: List[str] = None):
  51. """Register a model and optional aliases"""
  52. if model.name:
  53. cls._models[model.name] = model
  54. if aliases:
  55. for alias in aliases:
  56. cls._aliases[alias] = model.name
  57. @classmethod
  58. def get(cls, name: str) -> Optional['Model']:
  59. """Get model by name or alias"""
  60. if name in cls._models:
  61. return cls._models[name]
  62. if name in cls._aliases:
  63. return cls._models[cls._aliases[name]]
  64. return None
  65. @classmethod
  66. def all_models(cls) -> Dict[str, 'Model']:
  67. """Get all registered models"""
  68. return cls._models.copy()
  69. @classmethod
  70. def clear(cls):
  71. """Clear registry (for testing)"""
  72. cls._models.clear()
  73. cls._aliases.clear()
  74. @classmethod
  75. def list_models_by_provider(cls, provider_name: str) -> List[str]:
  76. """List all models that use specific provider"""
  77. return [name for name, model in cls._models.items()
  78. if provider_name in str(model.best_provider)]
  79. @classmethod
  80. def validate_all_models(cls) -> Dict[str, List[str]]:
  81. """Validate all models and return issues"""
  82. issues = {}
  83. for name, model in cls._models.items():
  84. model_issues = []
  85. if not model.name:
  86. model_issues.append("Empty name")
  87. if not model.base_provider:
  88. model_issues.append("Empty base_provider")
  89. if model.best_provider is None:
  90. model_issues.append("No best_provider")
  91. if model_issues:
  92. issues[name] = model_issues
  93. return issues
  94. @dataclass(unsafe_hash=True)
  95. class Model:
  96. """
  97. Represents a machine learning model configuration.
  98. Attributes:
  99. name (str): Name of the model.
  100. base_provider (str): Default provider for the model.
  101. best_provider (ProviderType): The preferred provider for the model, typically with retry logic.
  102. """
  103. name: str
  104. base_provider: str
  105. best_provider: ProviderType = None
  106. def __post_init__(self):
  107. """Auto-register model after initialization"""
  108. if self.name:
  109. ModelRegistry.register(self)
  110. @staticmethod
  111. def __all__() -> list[str]:
  112. """Returns a list of all model names."""
  113. return list(ModelRegistry.all_models().keys())
  114. class ImageModel(Model):
  115. pass
  116. class AudioModel(Model):
  117. pass
  118. class VideoModel(Model):
  119. pass
  120. class VisionModel(Model):
  121. pass
  122. ### Default ###
  123. default = Model(
  124. name = "",
  125. base_provider = "",
  126. best_provider = IterListProvider([
  127. OIVSCodeSer0501,
  128. OIVSCodeSer2,
  129. Blackbox,
  130. Copilot,
  131. DeepInfraChat,
  132. LambdaChat,
  133. PollinationsAI,
  134. Together,
  135. Free2GPT,
  136. FreeGpt,
  137. Chatai,
  138. WeWordle,
  139. OpenaiChat,
  140. Cloudflare,
  141. ])
  142. )
  143. default_vision = VisionModel(
  144. name = "",
  145. base_provider = "",
  146. best_provider = IterListProvider([
  147. Blackbox,
  148. DeepInfraChat,
  149. OIVSCodeSer2,
  150. OIVSCodeSer0501,
  151. PollinationsAI,
  152. Together,
  153. HuggingSpace,
  154. GeminiPro,
  155. HuggingFaceAPI,
  156. CopilotAccount,
  157. OpenaiAccount,
  158. Gemini,
  159. ], shuffle=False)
  160. )
  161. # gpt-4
  162. gpt_4 = Model(
  163. name = 'gpt-4',
  164. base_provider = 'OpenAI',
  165. best_provider = IterListProvider([Blackbox, PollinationsAI, Copilot, Yqcloud, WeWordle, OpenaiChat])
  166. )
  167. # gpt-4o
  168. gpt_4o = VisionModel(
  169. name = 'gpt-4o',
  170. base_provider = 'OpenAI',
  171. best_provider = IterListProvider([Blackbox, PollinationsAI, OpenaiChat])
  172. )
  173. gpt_4o_mini = Model(
  174. name = 'gpt-4o-mini',
  175. base_provider = 'OpenAI',
  176. best_provider = IterListProvider([Blackbox, OIVSCodeSer2, PollinationsAI, Chatai, OpenaiChat])
  177. )
  178. gpt_4o_mini_audio = AudioModel(
  179. name = 'gpt-4o-mini-audio',
  180. base_provider = 'OpenAI',
  181. best_provider = PollinationsAI
  182. )
  183. gpt_4o_mini_tts = AudioModel(
  184. name = 'gpt-4o-mini-tts',
  185. base_provider = 'OpenAI',
  186. best_provider = OpenAIFM
  187. )
  188. # o1
  189. o1 = Model(
  190. name = 'o1',
  191. base_provider = 'OpenAI',
  192. best_provider = IterListProvider([Copilot, OpenaiAccount])
  193. )
  194. o1_mini = Model(
  195. name = 'o1-mini',
  196. base_provider = 'OpenAI',
  197. best_provider = OpenaiAccount
  198. )
  199. # o3
  200. o3_mini = Model(
  201. name = 'o3-mini',
  202. base_provider = 'OpenAI',
  203. best_provider = OpenaiChat
  204. )
  205. o3_mini_high = Model(
  206. name = 'o3-mini-high',
  207. base_provider = 'OpenAI',
  208. best_provider = OpenaiAccount
  209. )
  210. # o4
  211. o4_mini = Model(
  212. name = 'o4-mini',
  213. base_provider = 'OpenAI',
  214. best_provider = IterListProvider([PollinationsAI, OpenaiChat])
  215. )
  216. o4_mini_high = Model(
  217. name = 'o4-mini-high',
  218. base_provider = 'OpenAI',
  219. best_provider = OpenaiChat
  220. )
  221. # gpt-4.1
  222. gpt_4_1 = Model(
  223. name = 'gpt-4.1',
  224. base_provider = 'OpenAI',
  225. best_provider = IterListProvider([PollinationsAI, OpenaiChat])
  226. )
  227. gpt_4_1_mini = Model(
  228. name = 'gpt-4.1-mini',
  229. base_provider = 'OpenAI',
  230. best_provider = IterListProvider([Blackbox, OIVSCodeSer0501, PollinationsAI])
  231. )
  232. gpt_4_1_nano = Model(
  233. name = 'gpt-4.1-nano',
  234. base_provider = 'OpenAI',
  235. best_provider = IterListProvider([Blackbox, PollinationsAI])
  236. )
  237. gpt_4_5 = Model(
  238. name = 'gpt-4.5',
  239. base_provider = 'OpenAI',
  240. best_provider = OpenaiChat
  241. )
  242. # dall-e
  243. dall_e_3 = ImageModel(
  244. name = 'dall-e-3',
  245. base_provider = 'OpenAI',
  246. best_provider = IterListProvider([CopilotAccount, OpenaiAccount, MicrosoftDesigner, BingCreateImages])
  247. )
  248. gpt_image = ImageModel(
  249. name = 'gpt-image',
  250. base_provider = 'OpenAI',
  251. best_provider = IterListProvider([PollinationsImage])
  252. )
  253. ### Meta ###
  254. meta = Model(
  255. name = "meta-ai",
  256. base_provider = "Meta",
  257. best_provider = MetaAI
  258. )
  259. # llama 2
  260. llama_2_7b = Model(
  261. name = "llama-2-7b",
  262. base_provider = "Meta Llama",
  263. best_provider = IterListProvider([Cloudflare])
  264. )
  265. llama_2_70b = Model(
  266. name = "llama-2-70b",
  267. base_provider = "Meta Llama",
  268. best_provider = Together
  269. )
  270. # llama-3
  271. llama_3_8b = Model(
  272. name = "llama-3-8b",
  273. base_provider = "Meta Llama",
  274. best_provider = IterListProvider([Together, Cloudflare])
  275. )
  276. llama_3_70b = Model(
  277. name = "llama-3-70b",
  278. base_provider = "Meta Llama",
  279. best_provider = IterListProvider([Together])
  280. )
  281. # llama-3.1
  282. llama_3_1_8b = Model(
  283. name = "llama-3.1-8b",
  284. base_provider = "Meta Llama",
  285. best_provider = IterListProvider([DeepInfraChat, Together, Cloudflare])
  286. )
  287. llama_3_1_70b = Model(
  288. name = "llama-3.1-70b",
  289. base_provider = "Meta Llama",
  290. best_provider = Together
  291. )
  292. llama_3_1_405b = Model(
  293. name = "llama-3.1-405b",
  294. base_provider = "Meta Llama",
  295. best_provider = Together
  296. )
  297. # llama-3.2
  298. llama_3_2_1b = Model(
  299. name = "llama-3.2-1b",
  300. base_provider = "Meta Llama",
  301. best_provider = Cloudflare
  302. )
  303. llama_3_2_3b = Model(
  304. name = "llama-3.2-3b",
  305. base_provider = "Meta Llama",
  306. best_provider = Together
  307. )
  308. llama_3_2_11b = VisionModel(
  309. name = "llama-3.2-11b",
  310. base_provider = "Meta Llama",
  311. best_provider = IterListProvider([Together, HuggingChat, HuggingFace])
  312. )
  313. llama_3_2_90b = Model(
  314. name = "llama-3.2-90b",
  315. base_provider = "Meta Llama",
  316. best_provider = IterListProvider([DeepInfraChat, Together])
  317. )
  318. # llama-3.3
  319. llama_3_3_70b = Model(
  320. name = "llama-3.3-70b",
  321. base_provider = "Meta Llama",
  322. best_provider = IterListProvider([DeepInfraChat, LambdaChat, PollinationsAI, Together, HuggingChat, HuggingFace])
  323. )
  324. # llama-4
  325. llama_4_scout = Model(
  326. name = "llama-4-scout",
  327. base_provider = "Meta Llama",
  328. best_provider = IterListProvider([DeepInfraChat, LambdaChat, PollinationsAI, Together, Cloudflare])
  329. )
  330. llama_4_maverick = Model(
  331. name = "llama-4-maverick",
  332. base_provider = "Meta Llama",
  333. best_provider = IterListProvider([DeepInfraChat, LambdaChat, Together])
  334. )
  335. ### MistralAI ###
  336. mistral_7b = Model(
  337. name = "mistral-7b",
  338. base_provider = "Mistral AI",
  339. best_provider = Together
  340. )
  341. mixtral_8x7b = Model(
  342. name = "mixtral-8x7b",
  343. base_provider = "Mistral AI",
  344. best_provider = Together
  345. )
  346. mixtral_8x22b = Model(
  347. name = "mixtral-8x22b",
  348. base_provider = "Mistral AI",
  349. best_provider = DeepInfraChat
  350. )
  351. mistral_nemo = Model(
  352. name = "mistral-nemo",
  353. base_provider = "Mistral AI",
  354. best_provider = IterListProvider([HuggingChat, HuggingFace])
  355. )
  356. mistral_small_24b = Model(
  357. name = "mistral-small-24b",
  358. base_provider = "Mistral AI",
  359. best_provider = IterListProvider([DeepInfraChat, Together])
  360. )
  361. mistral_small_3_1_24b = Model(
  362. name = "mistral-small-3.1-24b",
  363. base_provider = "Mistral AI",
  364. best_provider = PollinationsAI
  365. )
  366. ### NousResearch ###
  367. # hermes-2
  368. hermes_2_dpo = Model(
  369. name = "hermes-2-dpo",
  370. base_provider = "NousResearch",
  371. best_provider = Together
  372. )
  373. # phi-3.5
  374. phi_3_5_mini = Model(
  375. name = "phi-3.5-mini",
  376. base_provider = "Microsoft",
  377. best_provider = HuggingChat
  378. )
  379. # phi-4
  380. phi_4 = Model(
  381. name = "phi-4",
  382. base_provider = "Microsoft",
  383. best_provider = IterListProvider([DeepInfraChat, PollinationsAI, HuggingSpace])
  384. )
  385. phi_4_multimodal = VisionModel(
  386. name = "phi-4-multimodal",
  387. base_provider = "Microsoft",
  388. best_provider = IterListProvider([DeepInfraChat, HuggingSpace])
  389. )
  390. phi_4_reasoning_plus = Model(
  391. name = "phi-4-reasoning-plus",
  392. base_provider = "Microsoft",
  393. best_provider = DeepInfraChat
  394. )
  395. # wizardlm
  396. wizardlm_2_7b = Model(
  397. name = 'wizardlm-2-7b',
  398. base_provider = 'Microsoft',
  399. best_provider = DeepInfraChat
  400. )
  401. wizardlm_2_8x22b = Model(
  402. name = 'wizardlm-2-8x22b',
  403. base_provider = 'Microsoft',
  404. best_provider = DeepInfraChat
  405. )
  406. ### Google DeepMind ###
  407. # gemini
  408. gemini = Model(
  409. name = 'gemini-2.0',
  410. base_provider = 'Google',
  411. best_provider = Gemini
  412. )
  413. # gemini-1.5
  414. gemini_1_5_flash = Model(
  415. name = 'gemini-1.5-flash',
  416. base_provider = 'Google',
  417. best_provider = IterListProvider([Free2GPT, FreeGpt, TeachAnything, Websim])
  418. )
  419. gemini_1_5_pro = Model(
  420. name = 'gemini-1.5-pro',
  421. base_provider = 'Google',
  422. best_provider = IterListProvider([Free2GPT, FreeGpt, TeachAnything, Websim])
  423. )
  424. # gemini-2.0
  425. gemini_2_0_flash = Model(
  426. name = 'gemini-2.0-flash',
  427. base_provider = 'Google',
  428. best_provider = IterListProvider([Gemini, GeminiPro])
  429. )
  430. gemini_2_0_flash_thinking = Model(
  431. name = 'gemini-2.0-flash-thinking',
  432. base_provider = 'Google',
  433. best_provider = IterListProvider([Gemini, GeminiPro])
  434. )
  435. gemini_2_0_flash_thinking_with_apps = Model(
  436. name = 'gemini-2.0-flash-thinking-with-apps',
  437. base_provider = 'Google',
  438. best_provider = Gemini
  439. )
  440. # gemini-2.5
  441. gemini_2_5_flash = Model(
  442. name = 'gemini-2.5-flash',
  443. base_provider = 'Google',
  444. best_provider = IterListProvider([Gemini, GeminiPro])
  445. )
  446. gemini_2_5_pro = Model(
  447. name = 'gemini-2.5-pro',
  448. base_provider = 'Google',
  449. best_provider = IterListProvider([Gemini])
  450. )
  451. # gemma-2
  452. gemma_2_27b = Model(
  453. name = 'gemma-2-27b',
  454. base_provider = 'Google',
  455. best_provider = Together
  456. )
  457. # gemma-3
  458. gemma_3_12b = Model(
  459. name = 'gemma-3-12b',
  460. base_provider = 'Google',
  461. best_provider = DeepInfraChat
  462. )
  463. gemma_3_27b = Model(
  464. name = 'gemma-3-27b',
  465. base_provider = 'Google',
  466. best_provider = DeepInfraChat
  467. )
  468. ### Blackbox AI ###
  469. blackboxai = Model(
  470. name = 'blackboxai',
  471. base_provider = 'Blackbox AI',
  472. best_provider = Blackbox
  473. )
  474. ### CohereForAI ###
  475. command_r = Model(
  476. name = 'command-r',
  477. base_provider = 'CohereForAI',
  478. best_provider = HuggingSpace
  479. )
  480. command_r_plus = Model(
  481. name = 'command-r-plus',
  482. base_provider = 'CohereForAI',
  483. best_provider = IterListProvider([HuggingSpace, HuggingChat])
  484. )
  485. command_r7b = Model(
  486. name = 'command-r7b',
  487. base_provider = 'CohereForAI',
  488. best_provider = HuggingSpace
  489. )
  490. command_a = Model(
  491. name = 'command-a',
  492. base_provider = 'CohereForAI',
  493. best_provider = HuggingSpace
  494. )
  495. ### Qwen ###
  496. # qwen-1.5
  497. qwen_1_5_7b = Model(
  498. name = 'qwen-1.5-7b',
  499. base_provider = 'Qwen',
  500. best_provider = Cloudflare
  501. )
  502. # qwen-2
  503. qwen_2_72b = Model(
  504. name = 'qwen-2-72b',
  505. base_provider = 'Qwen',
  506. best_provider = IterListProvider([DeepInfraChat, HuggingSpace, Together])
  507. )
  508. qwen_2_vl_7b = VisionModel(
  509. name = "qwen-2-vl-7b",
  510. base_provider = 'Qwen',
  511. best_provider = HuggingFaceAPI
  512. )
  513. qwen_2_vl_72b = VisionModel(
  514. name = "qwen-2-vl-72b",
  515. base_provider = 'Qwen',
  516. best_provider = Together
  517. )
  518. # qwen-2.5
  519. qwen_2_5 = Model(
  520. name = 'qwen-2.5',
  521. base_provider = 'Qwen',
  522. best_provider = HuggingSpace
  523. )
  524. qwen_2_5_7b = Model(
  525. name = 'qwen-2.5-7b',
  526. base_provider = 'Qwen',
  527. best_provider = Together
  528. )
  529. qwen_2_5_72b = Model(
  530. name = 'qwen-2.5-72b',
  531. base_provider = 'Qwen',
  532. best_provider = Together
  533. )
  534. qwen_2_5_coder_32b = Model(
  535. name = 'qwen-2.5-coder-32b',
  536. base_provider = 'Qwen',
  537. best_provider = IterListProvider([PollinationsAI, LambdaChat, Together, HuggingChat])
  538. )
  539. qwen_2_5_1m = Model(
  540. name = 'qwen-2.5-1m',
  541. base_provider = 'Qwen',
  542. best_provider = HuggingSpace
  543. )
  544. qwen_2_5_max = Model(
  545. name = 'qwen-2.5-max',
  546. base_provider = 'Qwen',
  547. best_provider = HuggingSpace
  548. )
  549. qwen_2_5_vl_72b = Model(
  550. name = 'qwen-2.5-vl-72b',
  551. base_provider = 'Qwen',
  552. best_provider = Together
  553. )
  554. # qwen3
  555. qwen_3_235b = Model(
  556. name = 'qwen-3-235b',
  557. base_provider = 'Qwen',
  558. best_provider = IterListProvider([DeepInfraChat, Together, HuggingSpace])
  559. )
  560. qwen_3_32b = Model(
  561. name = 'qwen-3-32b',
  562. base_provider = 'Qwen',
  563. best_provider = IterListProvider([DeepInfraChat, LambdaChat, HuggingSpace])
  564. )
  565. qwen_3_30b = Model(
  566. name = 'qwen-3-30b',
  567. base_provider = 'Qwen',
  568. best_provider = IterListProvider([DeepInfraChat, HuggingSpace])
  569. )
  570. qwen_3_14b = Model(
  571. name = 'qwen-3-14b',
  572. base_provider = 'Qwen',
  573. best_provider = IterListProvider([DeepInfraChat, HuggingSpace])
  574. )
  575. qwen_3_4b = Model(
  576. name = 'qwen-3-4b',
  577. base_provider = 'Qwen',
  578. best_provider = HuggingSpace
  579. )
  580. qwen_3_1_7b = Model(
  581. name = 'qwen-3-1.7b',
  582. base_provider = 'Qwen',
  583. best_provider = HuggingSpace
  584. )
  585. qwen_3_0_6b = Model(
  586. name = 'qwen-3-0.6b',
  587. base_provider = 'Qwen',
  588. best_provider = HuggingSpace
  589. )
  590. ### qwq/qvq ###
  591. qwq_32b = Model(
  592. name = 'qwq-32b',
  593. base_provider = 'Qwen',
  594. best_provider = IterListProvider([DeepInfraChat, Together, HuggingChat])
  595. )
  596. ### DeepSeek ###
  597. # deepseek-v3
  598. deepseek_v3 = Model(
  599. name = 'deepseek-v3',
  600. base_provider = 'DeepSeek',
  601. best_provider = IterListProvider([DeepInfraChat, PollinationsAI, Together])
  602. )
  603. # deepseek-r1
  604. deepseek_r1 = Model(
  605. name = 'deepseek-r1',
  606. base_provider = 'DeepSeek',
  607. best_provider = IterListProvider([DeepInfraChat, LambdaChat, PollinationsAI, Together, HuggingChat, HuggingFace])
  608. )
  609. deepseek_r1_turbo = Model(
  610. name = 'deepseek-r1-turbo',
  611. base_provider = 'DeepSeek',
  612. best_provider = DeepInfraChat
  613. )
  614. deepseek_r1_distill_llama_70b = Model(
  615. name = 'deepseek-r1-distill-llama-70b',
  616. base_provider = 'DeepSeek',
  617. best_provider = IterListProvider([DeepInfraChat, Together])
  618. )
  619. deepseek_r1_distill_qwen_1_5b = Model(
  620. name = 'deepseek-r1-distill-qwen-1.5b',
  621. base_provider = 'DeepSeek',
  622. best_provider = Together
  623. )
  624. deepseek_r1_distill_qwen_14b = Model(
  625. name = 'deepseek-r1-distill-qwen-14b',
  626. base_provider = 'DeepSeek',
  627. best_provider = Together
  628. )
  629. deepseek_r1_distill_qwen_32b = Model(
  630. name = 'deepseek-r1-distill-qwen-32b',
  631. base_provider = 'DeepSeek',
  632. best_provider = IterListProvider([DeepInfraChat])
  633. )
  634. # deepseek-v2
  635. deepseek_prover_v2 = Model(
  636. name = 'deepseek-prover-v2',
  637. base_provider = 'DeepSeek',
  638. best_provider = DeepInfraChat
  639. )
  640. deepseek_prover_v2_671b = Model(
  641. name = 'deepseek-prover-v2-671b',
  642. base_provider = 'DeepSeek',
  643. best_provider = DeepInfraChat
  644. )
  645. # deepseek-v3-0324
  646. deepseek_v3_0324 = Model(
  647. name = 'deepseek-v3-0324',
  648. base_provider = 'DeepSeek',
  649. best_provider = IterListProvider([DeepInfraChat, LambdaChat, PollinationsAI])
  650. )
  651. # deepseek-r1-0528
  652. deepseek_r1_0528 = Model(
  653. name = 'deepseek-r1-0528',
  654. base_provider = 'DeepSeek',
  655. best_provider = IterListProvider([DeepInfraChat, LambdaChat])
  656. )
  657. # janus
  658. janus_pro_7b = VisionModel(
  659. name = DeepseekAI_JanusPro7b.default_model,
  660. base_provider = 'DeepSeek',
  661. best_provider = DeepseekAI_JanusPro7b
  662. )
  663. ### x.ai ###
  664. grok_2 = Model(
  665. name = 'grok-2',
  666. base_provider = 'x.ai',
  667. best_provider = Grok
  668. )
  669. grok_3 = Model(
  670. name = 'grok-3',
  671. base_provider = 'x.ai',
  672. best_provider = Grok
  673. )
  674. grok_3_mini = Model(
  675. name = 'grok-3-mini',
  676. base_provider = 'x.ai',
  677. best_provider = PollinationsAI
  678. )
  679. grok_3_r1 = Model(
  680. name = 'grok-3-r1',
  681. base_provider = 'x.ai',
  682. best_provider = Grok
  683. )
  684. ### Perplexity AI ###
  685. sonar = Model(
  686. name = 'sonar',
  687. base_provider = 'Perplexity AI',
  688. best_provider = PerplexityLabs
  689. )
  690. sonar_pro = Model(
  691. name = 'sonar-pro',
  692. base_provider = 'Perplexity AI',
  693. best_provider = PerplexityLabs
  694. )
  695. sonar_reasoning = Model(
  696. name = 'sonar-reasoning',
  697. base_provider = 'Perplexity AI',
  698. best_provider = PerplexityLabs
  699. )
  700. sonar_reasoning_pro = Model(
  701. name = 'sonar-reasoning-pro',
  702. base_provider = 'Perplexity AI',
  703. best_provider = PerplexityLabs
  704. )
  705. r1_1776 = Model(
  706. name = 'r1-1776',
  707. base_provider = 'Perplexity AI',
  708. best_provider = IterListProvider([Together, PerplexityLabs])
  709. )
  710. ### Nvidia ###
  711. nemotron_70b = Model(
  712. name = 'nemotron-70b',
  713. base_provider = 'Nvidia',
  714. best_provider = IterListProvider([LambdaChat, Together, HuggingChat, HuggingFace])
  715. )
  716. ### Cognitive Computations ###
  717. # dolphin-2
  718. dolphin_2_6 = Model(
  719. name = "dolphin-2.6",
  720. base_provider = "Cognitive Computations",
  721. best_provider = DeepInfraChat
  722. )
  723. dolphin_2_9 = Model(
  724. name = "dolphin-2.9",
  725. base_provider = "Cognitive Computations",
  726. best_provider = DeepInfraChat
  727. )
  728. ### DeepInfra ###
  729. airoboros_70b = Model(
  730. name = "airoboros-70b",
  731. base_provider = "DeepInfra",
  732. best_provider = DeepInfraChat
  733. )
  734. ### Lizpreciatior ###
  735. lzlv_70b = Model(
  736. name = "lzlv-70b",
  737. base_provider = "Lizpreciatior",
  738. best_provider = DeepInfraChat
  739. )
  740. ### Liquid AI ###
  741. lfm_40b = Model(
  742. name = "lfm-40b",
  743. base_provider = "Liquid AI",
  744. best_provider = LambdaChat
  745. )
  746. ### Uncensored AI ###
  747. evil = Model(
  748. name = 'evil',
  749. base_provider = 'Evil Mode - Experimental',
  750. best_provider = PollinationsAI
  751. )
  752. sdxl_turbo = ImageModel(
  753. name = 'sdxl-turbo',
  754. base_provider = 'Stability AI',
  755. best_provider = IterListProvider([HuggingFaceMedia, PollinationsImage, ImageLabs])
  756. )
  757. sd_3_5_large = ImageModel(
  758. name = 'sd-3.5-large',
  759. base_provider = 'Stability AI',
  760. best_provider = IterListProvider([HuggingFaceMedia, HuggingSpace])
  761. )
  762. ### Black Forest Labs ###
  763. flux = ImageModel(
  764. name = 'flux',
  765. base_provider = 'Black Forest Labs',
  766. best_provider = IterListProvider([HuggingFaceMedia, PollinationsImage, Websim, Together, HuggingSpace])
  767. )
  768. flux_pro = ImageModel(
  769. name = 'flux-pro',
  770. base_provider = 'Black Forest Labs',
  771. best_provider = IterListProvider([PollinationsImage, Together])
  772. )
  773. flux_dev = ImageModel(
  774. name = 'flux-dev',
  775. base_provider = 'Black Forest Labs',
  776. best_provider = IterListProvider([PollinationsImage, HuggingSpace, Together, HuggingChat, HuggingFace])
  777. )
  778. flux_schnell = ImageModel(
  779. name = 'flux-schnell',
  780. base_provider = 'Black Forest Labs',
  781. best_provider = IterListProvider([PollinationsImage, Together, HuggingChat, HuggingFace])
  782. )
  783. flux_redux = ImageModel(
  784. name = 'flux-redux',
  785. base_provider = 'Black Forest Labs',
  786. best_provider = Together
  787. )
  788. flux_depth = ImageModel(
  789. name = 'flux-depth',
  790. base_provider = 'Black Forest Labs',
  791. best_provider = Together
  792. )
  793. flux_canny = ImageModel(
  794. name = 'flux-canny',
  795. base_provider = 'Black Forest Labs',
  796. best_provider = Together
  797. )
  798. flux_kontext_max = ImageModel(
  799. name = 'flux-kontext-max',
  800. base_provider = 'Black Forest Labs',
  801. best_provider = Together
  802. )
  803. flux_dev_lora = ImageModel(
  804. name = 'flux-dev-lora',
  805. base_provider = 'Black Forest Labs',
  806. best_provider = Together
  807. )
  808. flux_kontext_pro = ImageModel(
  809. name = 'flux-kontext-pro',
  810. base_provider = 'Black Forest Labs',
  811. best_provider = Together
  812. )
  813. class ModelUtils:
  814. """
  815. Utility class for mapping string identifiers to Model instances.
  816. Now uses automatic discovery instead of manual mapping.
  817. """
  818. convert: Dict[str, Model] = {}
  819. @classmethod
  820. def refresh(cls):
  821. """Refresh the model registry and update convert"""
  822. cls.convert = ModelRegistry.all_models()
  823. @classmethod
  824. def get_model(cls, name: str) -> Optional[Model]:
  825. """Get model by name or alias"""
  826. return ModelRegistry.get(name)
  827. @classmethod
  828. def register_alias(cls, alias: str, model_name: str):
  829. """Register an alias for a model"""
  830. ModelRegistry._aliases[alias] = model_name
  831. # Register special aliases after all models are created
  832. ModelRegistry._aliases["gemini"] = "gemini-2.0"
  833. # Fill the convert dictionary
  834. ModelUtils.convert = ModelRegistry.all_models()
  835. # Demo models configuration
  836. demo_models = {
  837. llama_3_2_11b.name: [llama_3_2_11b, [HuggingChat]],
  838. qwen_2_vl_7b.name: [qwen_2_vl_7b, [HuggingFaceAPI]],
  839. deepseek_r1.name: [deepseek_r1, [HuggingFace, PollinationsAI]],
  840. janus_pro_7b.name: [janus_pro_7b, [HuggingSpace]],
  841. command_r.name: [command_r, [HuggingSpace]],
  842. command_r_plus.name: [command_r_plus, [HuggingSpace]],
  843. command_r7b.name: [command_r7b, [HuggingSpace]],
  844. qwen_2_5_coder_32b.name: [qwen_2_5_coder_32b, [HuggingFace]],
  845. qwq_32b.name: [qwq_32b, [HuggingFace]],
  846. llama_3_3_70b.name: [llama_3_3_70b, [HuggingFace]],
  847. sd_3_5_large.name: [sd_3_5_large, [HuggingSpace, HuggingFace]],
  848. flux_dev.name: [flux_dev, [PollinationsImage, HuggingFace, HuggingSpace]],
  849. flux_schnell.name: [flux_schnell, [PollinationsImage, HuggingFace, HuggingSpace]],
  850. }
  851. # Create a list of all models and their providers
  852. def _get_working_providers(model: Model) -> List:
  853. """Get list of working providers for a model"""
  854. if model.best_provider is None:
  855. return []
  856. if isinstance(model.best_provider, IterListProvider):
  857. return [p for p in model.best_provider.providers if p.working]
  858. return [model.best_provider] if model.best_provider.working else []
  859. # Generate __models__ using the auto-discovered models
  860. __models__ = {
  861. name: (model, _get_working_providers(model))
  862. for name, model in ModelRegistry.all_models().items()
  863. if name and _get_working_providers(model)
  864. }
  865. # Generate _all_models list
  866. _all_models = list(__models__.keys())
  867. # Backward compatibility - ensure Model.__all__() returns the correct list
  868. Model.__all__ = staticmethod(lambda: _all_models)