camel-ai 0.2.48__py3-none-any.whl → 0.2.50__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of camel-ai might be problematic. Click here for more details.

camel/types/enums.py CHANGED
@@ -149,6 +149,18 @@ class ModelType(UnifiedModelType, Enum):
149
149
  CLAUDE_3_5_HAIKU = "claude-3-5-haiku-latest"
150
150
  CLAUDE_3_7_SONNET = "claude-3-7-sonnet-latest"
151
151
 
152
+ # Netmind models
153
+ NETMIND_LLAMA_4_MAVERICK_17B_128E_INSTRUCT = (
154
+ "meta-llama/Llama-4-Maverick-17B-128E-Instruct"
155
+ )
156
+ NETMIND_LLAMA_4_SCOUT_17B_16E_INSTRUCT = (
157
+ "meta-llama/Llama-4-Scout-17B-16E-Instruct"
158
+ )
159
+ NETMIND_DEEPSEEK_R1 = "deepseek-ai/DeepSeek-R1"
160
+ NETMIND_DEEPSEEK_V3 = "deepseek-ai/DeepSeek-V3-0324"
161
+ NETMIND_DOUBAO_1_5_PRO = "doubao/Doubao-1.5-pro"
162
+ NETMIND_QWQ_32B = "Qwen/QwQ-32B"
163
+
152
164
  # Nvidia models
153
165
  NVIDIA_NEMOTRON_340B_INSTRUCT = "nvidia/nemotron-4-340b-instruct"
154
166
  NVIDIA_NEMOTRON_340B_REWARD = "nvidia/nemotron-4-340b-reward"
@@ -200,6 +212,10 @@ class ModelType(UnifiedModelType, Enum):
200
212
  QWEN_MAX = "qwen-max"
201
213
  QWEN_PLUS = "qwen-plus"
202
214
  QWEN_TURBO = "qwen-turbo"
215
+ QWEN_PLUS_LATEST = "qwen-plus-latest"
216
+ QWEN_PLUS_2025_04_28 = "qwen-plus-2025-04-28"
217
+ QWEN_TURBO_LATEST = "qwen-turbo-latest"
218
+ QWEN_TURBO_2025_04_28 = "qwen-turbo-2025-04-28"
203
219
  QWEN_LONG = "qwen-long"
204
220
  QWEN_VL_MAX = "qwen-vl-max"
205
221
  QWEN_VL_PLUS = "qwen-vl-plus"
@@ -258,6 +274,63 @@ class ModelType(UnifiedModelType, Enum):
258
274
  AIML_MIXTRAL_8X7B = "mistralai/Mixtral-8x7B-Instruct-v0.1"
259
275
  AIML_MISTRAL_7B_INSTRUCT = "mistralai/Mistral-7B-Instruct-v0.1"
260
276
 
277
+ # Novita platform models support tool calling
278
+ NOVITA_LLAMA_4_MAVERICK_17B = (
279
+ "meta-llama/llama-4-maverick-17b-128e-instruct-fp8"
280
+ )
281
+ NOVITA_LLAMA_4_SCOUT_17B = "meta-llama/llama-4-scout-17b-16e-instruct"
282
+ NOVITA_DEEPSEEK_V3_0324 = "deepseek/deepseek-v3-0324"
283
+ NOVITA_QWEN_2_5_V1_72B = "qwen/qwen2.5-vl-72b-instruct"
284
+ NOVITA_DEEPSEEK_V3_TURBO = "deepseek/deepseek-v3-turbo"
285
+ NOVITA_DEEPSEEK_R1_TURBO = "deepseek/deepseek-r1-turbo"
286
+ NOVITA_GEMMA_3_27B_IT = "google/gemma-3-27b-it"
287
+ NOVITA_QWEN_32B = "qwen/qwq-32b"
288
+ NOVITA_L3_8B_STHENO_V3_2 = "Sao10K/L3-8B-Stheno-v3.2"
289
+ NOVITA_MYTHOMAX_L2_13B = "gryphe/mythomax-l2-13b"
290
+ NOVITA_DEEPSEEK_R1_DISTILL_LLAMA_8B = (
291
+ "deepseek/deepseek-r1-distill-llama-8b"
292
+ )
293
+ NOVITA_DEEPSEEK_V3 = "deepseek/deepseek_v3"
294
+ NOVITA_LLAMA_3_1_8B = "meta-llama/llama-3.1-8b-instruct"
295
+ NOVITA_DEEPSEEK_R1_DISTILL_QWEN_14B = (
296
+ "deepseek/deepseek-r1-distill-qwen-14b"
297
+ )
298
+ NOVITA_LLAMA_3_3_70B = "meta-llama/llama-3.3-70b-instruct"
299
+ NOVITA_QWEN_2_5_72B = "qwen/qwen-2.5-72b-instruct"
300
+ NOVITA_MISTRAL_NEMO = "mistralai/mistral-nemo"
301
+ NOVITA_DEEPSEEK_R1_DISTILL_QWEN_32B = (
302
+ "deepseek/deepseek-r1-distill-qwen-32b"
303
+ )
304
+ NOVITA_LLAMA_3_8B = "meta-llama/llama-3-8b-instruct"
305
+ NOVITA_WIZARDLM_2_8X22B = "microsoft/wizardlm-2-8x22b"
306
+ NOVITA_DEEPSEEK_R1_DISTILL_LLAMA_70B = (
307
+ "deepseek/deepseek-r1-distill-llama-70b"
308
+ )
309
+ NOVITA_LLAMA_3_1_70B = "meta-llama/llama-3.1-70b-instruct"
310
+ NOVITA_GEMMA_2_9B_IT = "google/gemma-2-9b-it"
311
+ NOVITA_MISTRAL_7B = "mistralai/mistral-7b-instruct"
312
+ NOVITA_LLAMA_3_70B = "meta-llama/llama-3-70b-instruct"
313
+ NOVITA_DEEPSEEK_R1 = "deepseek/deepseek-r1"
314
+ NOVITA_HERMES_2_PRO_LLAMA_3_8B = "nousresearch/hermes-2-pro-llama-3-8b"
315
+ NOVITA_L3_70B_EURYALE_V2_1 = "sao10k/l3-70b-euryale-v2.1"
316
+ NOVITA_DOLPHIN_MIXTRAL_8X22B = (
317
+ "cognitivecomputations/dolphin-mixtral-8x22b"
318
+ )
319
+ NOVITA_AIROBOROS_L2_70B = "jondurbin/airoboros-l2-70b"
320
+ NOVITA_MIDNIGHT_ROSE_70B = "sophosympatheia/midnight-rose-70b"
321
+ NOVITA_L3_8B_LUNARIS = "sao10k/l3-8b-lunaris"
322
+ NOVITA_GLM_4_9B_0414 = "thudm/glm-4-9b-0414"
323
+ NOVITA_GLM_Z1_9B_0414 = "thudm/glm-z1-9b-0414"
324
+ NOVITA_GLM_Z1_32B_0414 = "thudm/glm-z1-32b-0414"
325
+ NOVITA_GLM_4_32B_0414 = "thudm/glm-4-32b-0414"
326
+ NOVITA_GLM_Z1_RUMINATION_32B_0414 = "thudm/glm-z1-rumination-32b-0414"
327
+ NOVITA_QWEN_2_5_7B = "qwen/qwen2.5-7b-instruct"
328
+ NOVITA_LLAMA_3_2_1B = "meta-llama/llama-3.2-1b-instruct"
329
+ NOVITA_LLAMA_3_2_11B_VISION = "meta-llama/llama-3.2-11b-vision-instruct"
330
+ NOVITA_LLAMA_3_2_3B = "meta-llama/llama-3.2-3b-instruct"
331
+ NOVITA_LLAMA_3_1_8B_BF16 = "meta-llama/llama-3.1-8b-instruct-bf16"
332
+ NOVITA_L31_70B_EURYALE_V2_2 = "sao10k/l31-70b-euryale-v2.2"
333
+
261
334
  # ModelScope models support tool calling
262
335
  MODELSCOPE_QWEN_2_5_7B_INSTRUCT = "Qwen/Qwen2.5-7B-Instruct"
263
336
  MODELSCOPE_QWEN_2_5_14B_INSTRUCT = "Qwen/Qwen2.5-14B-Instruct"
@@ -266,6 +339,8 @@ class ModelType(UnifiedModelType, Enum):
266
339
  MODELSCOPE_QWEN_2_5_CODER_7B_INSTRUCT = "Qwen/Qwen2.5-Coder-7B-Instruct"
267
340
  MODELSCOPE_QWEN_2_5_CODER_14B_INSTRUCT = "Qwen/Qwen2.5-Coder-14B-Instruct"
268
341
  MODELSCOPE_QWEN_2_5_CODER_32B_INSTRUCT = "Qwen/Qwen2.5-Coder-32B-Instruct"
342
+ MODELSCOPE_QWEN_3_235B_A22B = "Qwen/Qwen3-235B-A22B"
343
+ MODELSCOPE_QWEN_3_32B = "Qwen/Qwen3-32B"
269
344
  MODELSCOPE_QWQ_32B = "Qwen/QwQ-32B"
270
345
  MODELSCOPE_QWQ_32B_PREVIEW = "Qwen/QwQ-32B-Preview"
271
346
  MODELSCOPE_LLAMA_3_1_8B_INSTRUCT = (
@@ -281,6 +356,22 @@ class ModelType(UnifiedModelType, Enum):
281
356
  MODELSCOPE_MINISTRAL_8B_INSTRUCT = "mistralai/Ministral-8B-Instruct-2410"
282
357
  MODELSCOPE_DEEPSEEK_V3_0324 = "deepseek-ai/DeepSeek-V3-0324"
283
358
 
359
+ # WatsonX models
360
+ WATSONX_GRANITE_3_8B_INSTRUCT = "ibm/granite-3-8b-instruct"
361
+ WATSONX_LLAMA_3_3_70B_INSTRUCT = "meta-llama/llama-3-3-70b-instruct"
362
+ WATSONX_LLAMA_3_2_1B_INSTRUCT = "meta-llama/llama-3-2-1b-instruct"
363
+ WATSONX_LLAMA_3_2_3B_INSTRUCT = "meta-llama/llama-3-2-3b-instruct"
364
+ WATSONX_LLAMA_3_2_11B_VISION_INSTRUCT = (
365
+ "meta-llama/llama-3-2-11b-vision-instruct"
366
+ )
367
+ WATSONX_LLAMA_3_2_90B_VISION_INSTRUCT = (
368
+ "meta-llama/llama-3-2-90b-vision-instruct"
369
+ )
370
+ WATSONX_LLAMA_GUARD_3_11B_VISION_INSTRUCT = (
371
+ "meta-llama/llama-guard-3-11b-vision-instruct"
372
+ )
373
+ WATSONX_MISTRAL_LARGE = "mistralai/mistral-large"
374
+
284
375
  def __str__(self):
285
376
  return self.value
286
377
 
@@ -333,6 +424,7 @@ class ModelType(UnifiedModelType, Enum):
333
424
  self.is_zhipuai,
334
425
  self.is_aiml,
335
426
  self.is_azure_openai,
427
+ self.is_novita,
336
428
  ]
337
429
  )
338
430
 
@@ -597,6 +689,10 @@ class ModelType(UnifiedModelType, Enum):
597
689
  ModelType.QWEN_QWQ_32B,
598
690
  ModelType.QWEN_QVQ_72B,
599
691
  ModelType.QWEN_QWQ_PLUS,
692
+ ModelType.QWEN_PLUS_LATEST,
693
+ ModelType.QWEN_PLUS_2025_04_28,
694
+ ModelType.QWEN_TURBO_LATEST,
695
+ ModelType.QWEN_TURBO_2025_04_28,
600
696
  }
601
697
 
602
698
  @property
@@ -606,6 +702,17 @@ class ModelType(UnifiedModelType, Enum):
606
702
  ModelType.DEEPSEEK_REASONER,
607
703
  }
608
704
 
705
+ @property
706
+ def is_netmind(self) -> bool:
707
+ return self in {
708
+ ModelType.NETMIND_LLAMA_4_MAVERICK_17B_128E_INSTRUCT,
709
+ ModelType.NETMIND_LLAMA_4_SCOUT_17B_16E_INSTRUCT,
710
+ ModelType.NETMIND_DEEPSEEK_R1,
711
+ ModelType.NETMIND_DEEPSEEK_V3,
712
+ ModelType.NETMIND_DOUBAO_1_5_PRO,
713
+ ModelType.NETMIND_QWQ_32B,
714
+ }
715
+
609
716
  @property
610
717
  def is_ppio(self) -> bool:
611
718
  return self in {
@@ -641,6 +748,8 @@ class ModelType(UnifiedModelType, Enum):
641
748
  ModelType.MODELSCOPE_QWEN_2_5_CODER_7B_INSTRUCT,
642
749
  ModelType.MODELSCOPE_QWEN_2_5_CODER_14B_INSTRUCT,
643
750
  ModelType.MODELSCOPE_QWEN_2_5_CODER_32B_INSTRUCT,
751
+ ModelType.MODELSCOPE_QWEN_3_235B_A22B,
752
+ ModelType.MODELSCOPE_QWEN_3_32B,
644
753
  ModelType.MODELSCOPE_QWQ_32B,
645
754
  ModelType.MODELSCOPE_QWQ_32B_PREVIEW,
646
755
  ModelType.MODELSCOPE_LLAMA_3_1_8B_INSTRUCT,
@@ -690,6 +799,67 @@ class ModelType(UnifiedModelType, Enum):
690
799
  ModelType.SILICONFLOW_PRO_THUDM_GLM_4_9B_CHAT,
691
800
  }
692
801
 
802
+ @property
803
+ def is_watsonx(self) -> bool:
804
+ return self in {
805
+ ModelType.WATSONX_GRANITE_3_8B_INSTRUCT,
806
+ ModelType.WATSONX_LLAMA_3_3_70B_INSTRUCT,
807
+ ModelType.WATSONX_LLAMA_3_2_1B_INSTRUCT,
808
+ ModelType.WATSONX_LLAMA_3_2_3B_INSTRUCT,
809
+ ModelType.WATSONX_LLAMA_3_2_11B_VISION_INSTRUCT,
810
+ ModelType.WATSONX_LLAMA_3_2_90B_VISION_INSTRUCT,
811
+ ModelType.WATSONX_LLAMA_GUARD_3_11B_VISION_INSTRUCT,
812
+ ModelType.WATSONX_MISTRAL_LARGE,
813
+ }
814
+
815
+ @property
816
+ def is_novita(self) -> bool:
817
+ return self in {
818
+ ModelType.NOVITA_LLAMA_4_MAVERICK_17B,
819
+ ModelType.NOVITA_LLAMA_4_SCOUT_17B,
820
+ ModelType.NOVITA_DEEPSEEK_V3_0324,
821
+ ModelType.NOVITA_QWEN_2_5_V1_72B,
822
+ ModelType.NOVITA_DEEPSEEK_V3_TURBO,
823
+ ModelType.NOVITA_DEEPSEEK_R1_TURBO,
824
+ ModelType.NOVITA_GEMMA_3_27B_IT,
825
+ ModelType.NOVITA_QWEN_32B,
826
+ ModelType.NOVITA_L3_8B_STHENO_V3_2,
827
+ ModelType.NOVITA_MYTHOMAX_L2_13B,
828
+ ModelType.NOVITA_DEEPSEEK_R1_DISTILL_LLAMA_8B,
829
+ ModelType.NOVITA_DEEPSEEK_V3,
830
+ ModelType.NOVITA_LLAMA_3_1_8B,
831
+ ModelType.NOVITA_DEEPSEEK_R1_DISTILL_QWEN_14B,
832
+ ModelType.NOVITA_LLAMA_3_3_70B,
833
+ ModelType.NOVITA_QWEN_2_5_72B,
834
+ ModelType.NOVITA_MISTRAL_NEMO,
835
+ ModelType.NOVITA_DEEPSEEK_R1_DISTILL_QWEN_32B,
836
+ ModelType.NOVITA_LLAMA_3_8B,
837
+ ModelType.NOVITA_WIZARDLM_2_8X22B,
838
+ ModelType.NOVITA_DEEPSEEK_R1_DISTILL_LLAMA_70B,
839
+ ModelType.NOVITA_LLAMA_3_1_70B,
840
+ ModelType.NOVITA_GEMMA_2_9B_IT,
841
+ ModelType.NOVITA_MISTRAL_7B,
842
+ ModelType.NOVITA_LLAMA_3_70B,
843
+ ModelType.NOVITA_DEEPSEEK_R1,
844
+ ModelType.NOVITA_HERMES_2_PRO_LLAMA_3_8B,
845
+ ModelType.NOVITA_L3_70B_EURYALE_V2_1,
846
+ ModelType.NOVITA_DOLPHIN_MIXTRAL_8X22B,
847
+ ModelType.NOVITA_AIROBOROS_L2_70B,
848
+ ModelType.NOVITA_MIDNIGHT_ROSE_70B,
849
+ ModelType.NOVITA_L3_8B_LUNARIS,
850
+ ModelType.NOVITA_GLM_4_9B_0414,
851
+ ModelType.NOVITA_GLM_Z1_9B_0414,
852
+ ModelType.NOVITA_GLM_Z1_32B_0414,
853
+ ModelType.NOVITA_GLM_4_32B_0414,
854
+ ModelType.NOVITA_GLM_Z1_RUMINATION_32B_0414,
855
+ ModelType.NOVITA_QWEN_2_5_7B,
856
+ ModelType.NOVITA_LLAMA_3_2_1B,
857
+ ModelType.NOVITA_LLAMA_3_2_11B_VISION,
858
+ ModelType.NOVITA_LLAMA_3_2_3B,
859
+ ModelType.NOVITA_LLAMA_3_1_8B_BF16,
860
+ ModelType.NOVITA_L31_70B_EURYALE_V2_2,
861
+ }
862
+
693
863
  @property
694
864
  def is_aiml(self) -> bool:
695
865
  return self in {
@@ -717,6 +887,9 @@ class ModelType(UnifiedModelType, Enum):
717
887
  ModelType.COHERE_COMMAND_LIGHT,
718
888
  ModelType.NVIDIA_NEMOTRON_340B_INSTRUCT,
719
889
  ModelType.NVIDIA_NEMOTRON_340B_REWARD,
890
+ ModelType.NOVITA_MYTHOMAX_L2_13B,
891
+ ModelType.NOVITA_AIROBOROS_L2_70B,
892
+ ModelType.NOVITA_MIDNIGHT_ROSE_70B,
720
893
  }:
721
894
  return 4_096
722
895
  elif self in {
@@ -738,12 +911,26 @@ class ModelType(UnifiedModelType, Enum):
738
911
  ModelType.LMSTUDIO_GEMMA_3_4B,
739
912
  ModelType.LMSTUDIO_GEMMA_3_12B,
740
913
  ModelType.LMSTUDIO_GEMMA_3_27B,
914
+ ModelType.WATSONX_GRANITE_3_8B_INSTRUCT,
915
+ ModelType.NOVITA_L3_8B_STHENO_V3_2,
916
+ ModelType.NOVITA_LLAMA_3_8B,
917
+ ModelType.NOVITA_GEMMA_2_9B_IT,
918
+ ModelType.NOVITA_LLAMA_3_70B,
919
+ ModelType.NOVITA_HERMES_2_PRO_LLAMA_3_8B,
920
+ ModelType.NOVITA_L3_70B_EURYALE_V2_1,
921
+ ModelType.NOVITA_L3_8B_LUNARIS,
922
+ ModelType.NOVITA_LLAMA_3_1_8B_BF16,
923
+ ModelType.NOVITA_L31_70B_EURYALE_V2_2,
741
924
  }:
742
925
  return 8_192
743
926
  elif self in {
744
927
  ModelType.PPIO_BAICHUAN_2_13B_CHAT,
745
928
  }:
746
929
  return 14_336
930
+ elif self in {
931
+ ModelType.NOVITA_DOLPHIN_MIXTRAL_8X22B,
932
+ }:
933
+ return 16_000
747
934
  elif self in {
748
935
  ModelType.GPT_3_5_TURBO,
749
936
  ModelType.YI_LIGHTNING,
@@ -757,8 +944,23 @@ class ModelType(UnifiedModelType, Enum):
757
944
  ModelType.GLM_4V_PLUS_0111,
758
945
  ModelType.GLM_ZERO_PREVIEW,
759
946
  ModelType.PPIO_YI_1_5_34B_CHAT,
947
+ ModelType.NOVITA_LLAMA_3_1_8B,
760
948
  }:
761
949
  return 16_384
950
+ elif self in {
951
+ ModelType.NETMIND_DOUBAO_1_5_PRO,
952
+ ModelType.NOVITA_GEMMA_3_27B_IT,
953
+ ModelType.NOVITA_DEEPSEEK_R1_DISTILL_LLAMA_8B,
954
+ ModelType.NOVITA_QWEN_2_5_72B,
955
+ ModelType.NOVITA_DEEPSEEK_R1_DISTILL_LLAMA_70B,
956
+ ModelType.NOVITA_GLM_4_9B_0414,
957
+ ModelType.NOVITA_GLM_Z1_9B_0414,
958
+ ModelType.NOVITA_GLM_Z1_32B_0414,
959
+ ModelType.NOVITA_GLM_4_32B_0414,
960
+ ModelType.NOVITA_GLM_Z1_RUMINATION_32B_0414,
961
+ ModelType.NOVITA_QWEN_2_5_7B,
962
+ }:
963
+ return 32_000
762
964
  elif self in {
763
965
  ModelType.MISTRAL_CODESTRAL,
764
966
  ModelType.MISTRAL_7B,
@@ -792,6 +994,8 @@ class ModelType(UnifiedModelType, Enum):
792
994
  ModelType.MODELSCOPE_QWEN_2_5_CODER_7B_INSTRUCT,
793
995
  ModelType.MODELSCOPE_QWEN_2_5_CODER_14B_INSTRUCT,
794
996
  ModelType.MODELSCOPE_QWEN_2_5_CODER_32B_INSTRUCT,
997
+ ModelType.MODELSCOPE_QWEN_3_235B_A22B,
998
+ ModelType.MODELSCOPE_QWEN_3_32B,
795
999
  ModelType.MODELSCOPE_QWQ_32B,
796
1000
  ModelType.MODELSCOPE_QWQ_32B_PREVIEW,
797
1001
  ModelType.MODELSCOPE_LLAMA_3_1_8B_INSTRUCT,
@@ -801,6 +1005,12 @@ class ModelType(UnifiedModelType, Enum):
801
1005
  ModelType.MODELSCOPE_MINISTRAL_8B_INSTRUCT,
802
1006
  ModelType.MODELSCOPE_DEEPSEEK_V3_0324,
803
1007
  ModelType.OPENROUTER_LLAMA_3_1_405B,
1008
+ ModelType.WATSONX_MISTRAL_LARGE,
1009
+ ModelType.NOVITA_QWEN_32B,
1010
+ ModelType.NOVITA_LLAMA_3_1_70B,
1011
+ ModelType.NOVITA_MISTRAL_7B,
1012
+ ModelType.NOVITA_LLAMA_3_2_11B_VISION,
1013
+ ModelType.NOVITA_LLAMA_3_2_3B,
804
1014
  }:
805
1015
  return 32_768
806
1016
  elif self in {
@@ -814,8 +1024,23 @@ class ModelType(UnifiedModelType, Enum):
814
1024
  ModelType.PPIO_DEEPSEEK_R1,
815
1025
  ModelType.PPIO_DEEPSEEK_V3,
816
1026
  ModelType.AWS_DEEPSEEK_R1,
1027
+ ModelType.NETMIND_QWQ_32B,
1028
+ ModelType.NOVITA_DEEPSEEK_V3_TURBO,
1029
+ ModelType.NOVITA_DEEPSEEK_R1_TURBO,
1030
+ ModelType.NOVITA_DEEPSEEK_V3,
1031
+ ModelType.NOVITA_DEEPSEEK_R1_DISTILL_QWEN_14B,
1032
+ ModelType.NOVITA_DEEPSEEK_R1_DISTILL_QWEN_32B,
1033
+ ModelType.NOVITA_DEEPSEEK_R1,
817
1034
  }:
818
1035
  return 64_000
1036
+ elif self in {
1037
+ ModelType.NOVITA_WIZARDLM_2_8X22B,
1038
+ }:
1039
+ return 65_535
1040
+ elif self in {
1041
+ ModelType.NOVITA_QWEN_2_5_V1_72B,
1042
+ }:
1043
+ return 96_000
819
1044
  elif self in {
820
1045
  ModelType.CLAUDE_2_0,
821
1046
  ModelType.CLAUDE_INSTANT_1_2,
@@ -863,13 +1088,24 @@ class ModelType(UnifiedModelType, Enum):
863
1088
  ModelType.AWS_LLAMA_3_3_70B_INSTRUCT,
864
1089
  ModelType.AWS_LLAMA_3_2_90B_INSTRUCT,
865
1090
  ModelType.AWS_LLAMA_3_2_11B_INSTRUCT,
1091
+ ModelType.NETMIND_DEEPSEEK_R1,
1092
+ ModelType.NETMIND_DEEPSEEK_V3,
1093
+ ModelType.NOVITA_DEEPSEEK_V3_0324,
866
1094
  }:
867
1095
  return 128_000
1096
+ elif self in {
1097
+ ModelType.NOVITA_LLAMA_3_2_1B,
1098
+ }:
1099
+ return 131_000
868
1100
  elif self in {
869
1101
  ModelType.GROQ_LLAMA_3_1_8B,
870
1102
  ModelType.QWEN_PLUS,
871
1103
  ModelType.QWEN_TURBO,
872
1104
  ModelType.QWEN_CODER_TURBO,
1105
+ ModelType.QWEN_PLUS_LATEST,
1106
+ ModelType.QWEN_PLUS_2025_04_28,
1107
+ ModelType.QWEN_TURBO_LATEST,
1108
+ ModelType.QWEN_TURBO_2025_04_28,
873
1109
  ModelType.TOGETHER_LLAMA_3_1_8B,
874
1110
  ModelType.TOGETHER_LLAMA_3_1_70B,
875
1111
  ModelType.TOGETHER_LLAMA_3_1_405B,
@@ -880,6 +1116,15 @@ class ModelType(UnifiedModelType, Enum):
880
1116
  ModelType.OPENROUTER_LLAMA_3_1_70B,
881
1117
  ModelType.PPIO_LLAMA_3_3_70B,
882
1118
  ModelType.OPENROUTER_LLAMA_4_SCOUT,
1119
+ ModelType.WATSONX_LLAMA_3_3_70B_INSTRUCT,
1120
+ ModelType.WATSONX_LLAMA_3_2_1B_INSTRUCT,
1121
+ ModelType.WATSONX_LLAMA_3_2_3B_INSTRUCT,
1122
+ ModelType.WATSONX_LLAMA_3_2_11B_VISION_INSTRUCT,
1123
+ ModelType.WATSONX_LLAMA_3_2_90B_VISION_INSTRUCT,
1124
+ ModelType.WATSONX_LLAMA_GUARD_3_11B_VISION_INSTRUCT,
1125
+ ModelType.NOVITA_LLAMA_4_SCOUT_17B,
1126
+ ModelType.NOVITA_LLAMA_3_3_70B,
1127
+ ModelType.NOVITA_MISTRAL_NEMO,
883
1128
  }:
884
1129
  return 131_072
885
1130
  elif self in {
@@ -906,8 +1151,14 @@ class ModelType(UnifiedModelType, Enum):
906
1151
  ModelType.OPENROUTER_LLAMA_4_MAVERICK_FREE,
907
1152
  }:
908
1153
  return 256_000
1154
+
1155
+ elif self in {
1156
+ ModelType.NETMIND_LLAMA_4_SCOUT_17B_16E_INSTRUCT,
1157
+ }:
1158
+ return 320_000
909
1159
  elif self in {
910
1160
  ModelType.OPENROUTER_LLAMA_4_SCOUT_FREE,
1161
+ ModelType.NETMIND_LLAMA_4_MAVERICK_17B_128E_INSTRUCT,
911
1162
  }:
912
1163
  return 512_000
913
1164
  elif self in {
@@ -924,6 +1175,7 @@ class ModelType(UnifiedModelType, Enum):
924
1175
  ModelType.GPT_4_1,
925
1176
  ModelType.GPT_4_1_MINI,
926
1177
  ModelType.GPT_4_1_NANO,
1178
+ ModelType.NOVITA_LLAMA_4_MAVERICK_17B,
927
1179
  }:
928
1180
  return 1_048_576
929
1181
  elif self in {
@@ -1121,6 +1373,9 @@ class ModelPlatformType(Enum):
1121
1373
  SILICONFLOW = "siliconflow"
1122
1374
  AIML = "aiml"
1123
1375
  VOLCANO = "volcano"
1376
+ NETMIND = "netmind"
1377
+ NOVITA = "novita"
1378
+ WATSONX = "watsonx"
1124
1379
 
1125
1380
  @classmethod
1126
1381
  def from_name(cls, name):
@@ -1246,6 +1501,11 @@ class ModelPlatformType(Enum):
1246
1501
  r"""Returns whether this platform is DeepSeek."""
1247
1502
  return self is ModelPlatformType.DEEPSEEK
1248
1503
 
1504
+ @property
1505
+ def is_netmind(self) -> bool:
1506
+ r"""Returns whether this platform is Netmind."""
1507
+ return self is ModelPlatformType.NETMIND
1508
+
1249
1509
  @property
1250
1510
  def is_ppio(self) -> bool:
1251
1511
  r"""Returns whether this platform is PPIO."""
@@ -1281,6 +1541,11 @@ class ModelPlatformType(Enum):
1281
1541
  r"""Returns whether this platform is volcano."""
1282
1542
  return self is ModelPlatformType.VOLCANO
1283
1543
 
1544
+ @property
1545
+ def is_novita(self) -> bool:
1546
+ r"""Returns whether this platform is Novita."""
1547
+ return self is ModelPlatformType.NOVITA
1548
+
1284
1549
 
1285
1550
  class AudioModelType(Enum):
1286
1551
  TTS_1 = "tts-1"
@@ -113,6 +113,11 @@ class UnifiedModelType(str):
113
113
  r"""Returns whether the model is a Mistral model."""
114
114
  return True
115
115
 
116
+ @property
117
+ def is_netmind(self) -> bool:
118
+ r"""Returns whether the model is a Netmind model."""
119
+ return True
120
+
116
121
  @property
117
122
  def is_reka(self) -> bool:
118
123
  r"""Returns whether the model is a Reka model."""
@@ -148,6 +153,16 @@ class UnifiedModelType(str):
148
153
  r"""Returns whether this platform is Moonshot model."""
149
154
  return True
150
155
 
156
+ @property
157
+ def is_novita(self) -> bool:
158
+ r"""Returns whether the model is a Novita served model."""
159
+ return True
160
+
161
+ @property
162
+ def is_watsonx(self) -> bool:
163
+ r"""Returns whether the model is a WatsonX served model."""
164
+ return True
165
+
151
166
  @property
152
167
  def support_native_structured_output(self) -> bool:
153
168
  r"""Returns whether the model supports native structured output."""
camel/utils/__init__.py CHANGED
@@ -41,6 +41,7 @@ from .commons import (
41
41
  )
42
42
  from .constants import Constants
43
43
  from .deduplication import DeduplicationResult, deduplicate_internally
44
+ from .filename import sanitize_filename
44
45
  from .mcp import MCPServer
45
46
  from .response_format import get_pydantic_model
46
47
  from .token_counting import (
@@ -90,4 +91,5 @@ __all__ = [
90
91
  "BatchProcessor",
91
92
  "with_timeout",
92
93
  "MCPServer",
94
+ "sanitize_filename",
93
95
  ]
@@ -0,0 +1,80 @@
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
+ import platform
15
+ import re
16
+ import unicodedata
17
+
18
+ MAX_FILENAME_LENGTH = 255
19
+ WINDOWS_RESERVED = {
20
+ 'CON',
21
+ 'PRN',
22
+ 'AUX',
23
+ 'NUL',
24
+ 'COM1',
25
+ 'COM2',
26
+ 'COM3',
27
+ 'COM4',
28
+ 'LPT1',
29
+ 'LPT2',
30
+ 'LPT3',
31
+ }
32
+
33
+
34
+ def sanitize_filename(
35
+ url_name: str,
36
+ default: str = "index",
37
+ max_length: int = MAX_FILENAME_LENGTH,
38
+ ) -> str:
39
+ r"""Sanitize a URL path into a safe filename that is safe for
40
+ most platforms.
41
+
42
+ Args:
43
+ url_name (str): The URL path to sanitize.
44
+ default (str): Default name if sanitization results in empty string.
45
+ (default: :obj:`"index"`)
46
+ max_length (int): Maximum length of the filename.
47
+ (default: :obj:`MAX_FILENAME_LENGTH`)
48
+
49
+ Returns:
50
+ str: A sanitized filename safe for most platforms.
51
+ """
52
+ if max_length < 1:
53
+ raise ValueError(
54
+ f"`max_length` must be greater than " f"0, got {max_length}"
55
+ )
56
+
57
+ if not url_name:
58
+ return default
59
+
60
+ # Normalize Unicode characters by removing characters
61
+ # such as accents and special characters:
62
+ # café☕.txt -> cafe.txt
63
+ url_name = unicodedata.normalize('NFKD', url_name)
64
+ url_name = url_name.encode('ASCII', 'ignore').decode('ASCII')
65
+
66
+ # Replace special characters such as:
67
+ # Separators: my/file:name*.txt -> my_file_name.txt etc.
68
+ url_name = re.sub(r'[\\/:*?"<>|.]', '_', url_name)
69
+ url_name = re.sub(r'_+', '_', url_name) # Collapse multiple underscores
70
+ url_name = url_name.strip('_') # Remove leading/trailing underscores
71
+
72
+ # Handle empty result if all characters are invalid:
73
+ if not url_name:
74
+ return default
75
+
76
+ # Handle Windows reserved names
77
+ if platform.system() == "Windows" and url_name.upper() in WINDOWS_RESERVED:
78
+ url_name = f"_{url_name}"
79
+
80
+ return url_name[:max_length]
camel/utils/mcp.py CHANGED
@@ -69,7 +69,7 @@ class MCPServer:
69
69
  func = getattr(instance, name, None)
70
70
  if func is None or not callable(func):
71
71
  raise ValueError(
72
- f"Method {name} not found in class {cls.__name} or "
72
+ f"Method {name} not found in class {cls.__name__} or "
73
73
  "cannot be called."
74
74
  )
75
75
  wrapper = self.make_wrapper(func)
@@ -14,6 +14,7 @@
14
14
  from .base import BaseVerifier
15
15
  from .math_verifier import MathVerifier
16
16
  from .models import VerificationOutcome
17
+ from .physics_verifier import PhysicsVerifier
17
18
  from .python_verifier import PythonVerifier
18
19
 
19
20
  __all__ = [
@@ -21,4 +22,5 @@ __all__ = [
21
22
  "VerificationOutcome",
22
23
  "PythonVerifier",
23
24
  "MathVerifier",
25
+ "PhysicsVerifier",
24
26
  ]