models.py 25 KB

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