ibm-watsonx-gov 1.3.3__cp313-cp313-macosx_11_0_arm64.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.
Files changed (353) hide show
  1. ibm_watsonx_gov/__init__.py +8 -0
  2. ibm_watsonx_gov/agent_catalog/__init__.py +8 -0
  3. ibm_watsonx_gov/agent_catalog/clients/__init__.py +14 -0
  4. ibm_watsonx_gov/agent_catalog/clients/ai_agent_client.py +333 -0
  5. ibm_watsonx_gov/agent_catalog/core/__init__.py +8 -0
  6. ibm_watsonx_gov/agent_catalog/core/agent_loader.py +202 -0
  7. ibm_watsonx_gov/agent_catalog/core/agents.py +134 -0
  8. ibm_watsonx_gov/agent_catalog/entities/__init__.py +8 -0
  9. ibm_watsonx_gov/agent_catalog/entities/ai_agent.py +599 -0
  10. ibm_watsonx_gov/agent_catalog/utils/__init__.py +8 -0
  11. ibm_watsonx_gov/agent_catalog/utils/constants.py +36 -0
  12. ibm_watsonx_gov/agent_catalog/utils/notebook_utils.py +70 -0
  13. ibm_watsonx_gov/ai_experiments/__init__.py +8 -0
  14. ibm_watsonx_gov/ai_experiments/ai_experiments_client.py +980 -0
  15. ibm_watsonx_gov/ai_experiments/utils/__init__.py +8 -0
  16. ibm_watsonx_gov/ai_experiments/utils/ai_experiment_utils.py +139 -0
  17. ibm_watsonx_gov/clients/__init__.py +0 -0
  18. ibm_watsonx_gov/clients/api_client.py +99 -0
  19. ibm_watsonx_gov/clients/segment_client.py +46 -0
  20. ibm_watsonx_gov/clients/usage_client.cpython-313-darwin.so +0 -0
  21. ibm_watsonx_gov/clients/wx_ai_client.py +87 -0
  22. ibm_watsonx_gov/config/__init__.py +14 -0
  23. ibm_watsonx_gov/config/agentic_ai_configuration.py +225 -0
  24. ibm_watsonx_gov/config/gen_ai_configuration.py +129 -0
  25. ibm_watsonx_gov/config/model_risk_configuration.py +173 -0
  26. ibm_watsonx_gov/config/predictive_ai_configuration.py +20 -0
  27. ibm_watsonx_gov/entities/__init__.py +8 -0
  28. ibm_watsonx_gov/entities/agentic_app.py +209 -0
  29. ibm_watsonx_gov/entities/agentic_evaluation_result.py +185 -0
  30. ibm_watsonx_gov/entities/ai_evaluation.py +290 -0
  31. ibm_watsonx_gov/entities/ai_experiment.py +419 -0
  32. ibm_watsonx_gov/entities/base_classes.py +134 -0
  33. ibm_watsonx_gov/entities/container.py +54 -0
  34. ibm_watsonx_gov/entities/credentials.py +633 -0
  35. ibm_watsonx_gov/entities/criteria.py +508 -0
  36. ibm_watsonx_gov/entities/enums.py +274 -0
  37. ibm_watsonx_gov/entities/evaluation_result.py +444 -0
  38. ibm_watsonx_gov/entities/foundation_model.py +490 -0
  39. ibm_watsonx_gov/entities/llm_judge.py +44 -0
  40. ibm_watsonx_gov/entities/locale.py +17 -0
  41. ibm_watsonx_gov/entities/mapping.py +49 -0
  42. ibm_watsonx_gov/entities/metric.py +211 -0
  43. ibm_watsonx_gov/entities/metric_threshold.py +36 -0
  44. ibm_watsonx_gov/entities/model_provider.py +329 -0
  45. ibm_watsonx_gov/entities/model_risk_result.py +43 -0
  46. ibm_watsonx_gov/entities/monitor.py +71 -0
  47. ibm_watsonx_gov/entities/prompt_setup.py +40 -0
  48. ibm_watsonx_gov/entities/state.py +22 -0
  49. ibm_watsonx_gov/entities/utils.py +99 -0
  50. ibm_watsonx_gov/evaluators/__init__.py +26 -0
  51. ibm_watsonx_gov/evaluators/agentic_evaluator.py +2725 -0
  52. ibm_watsonx_gov/evaluators/agentic_traces_evaluator.py +115 -0
  53. ibm_watsonx_gov/evaluators/base_evaluator.py +22 -0
  54. ibm_watsonx_gov/evaluators/impl/__init__.py +0 -0
  55. ibm_watsonx_gov/evaluators/impl/evaluate_metrics_impl.cpython-313-darwin.so +0 -0
  56. ibm_watsonx_gov/evaluators/impl/evaluate_model_risk_impl.cpython-313-darwin.so +0 -0
  57. ibm_watsonx_gov/evaluators/metrics_evaluator.py +187 -0
  58. ibm_watsonx_gov/evaluators/model_risk_evaluator.py +89 -0
  59. ibm_watsonx_gov/evaluators/traces_evaluator.py +93 -0
  60. ibm_watsonx_gov/metric_groups/answer_quality/answer_quality_decorator.py +66 -0
  61. ibm_watsonx_gov/metric_groups/content_safety/content_safety_decorator.py +76 -0
  62. ibm_watsonx_gov/metric_groups/readability/readability_decorator.py +59 -0
  63. ibm_watsonx_gov/metric_groups/retrieval_quality/retrieval_quality_decorator.py +63 -0
  64. ibm_watsonx_gov/metric_groups/usage/usage_decorator.py +58 -0
  65. ibm_watsonx_gov/metrics/__init__.py +74 -0
  66. ibm_watsonx_gov/metrics/answer_relevance/__init__.py +8 -0
  67. ibm_watsonx_gov/metrics/answer_relevance/answer_relevance_decorator.py +63 -0
  68. ibm_watsonx_gov/metrics/answer_relevance/answer_relevance_metric.py +260 -0
  69. ibm_watsonx_gov/metrics/answer_similarity/__init__.py +0 -0
  70. ibm_watsonx_gov/metrics/answer_similarity/answer_similarity_decorator.py +66 -0
  71. ibm_watsonx_gov/metrics/answer_similarity/answer_similarity_metric.py +219 -0
  72. ibm_watsonx_gov/metrics/average_precision/__init__.py +0 -0
  73. ibm_watsonx_gov/metrics/average_precision/average_precision_decorator.py +62 -0
  74. ibm_watsonx_gov/metrics/average_precision/average_precision_metric.py +174 -0
  75. ibm_watsonx_gov/metrics/base_metric_decorator.py +193 -0
  76. ibm_watsonx_gov/metrics/context_relevance/__init__.py +8 -0
  77. ibm_watsonx_gov/metrics/context_relevance/context_relevance_decorator.py +60 -0
  78. ibm_watsonx_gov/metrics/context_relevance/context_relevance_metric.py +414 -0
  79. ibm_watsonx_gov/metrics/cost/__init__.py +8 -0
  80. ibm_watsonx_gov/metrics/cost/cost_decorator.py +58 -0
  81. ibm_watsonx_gov/metrics/cost/cost_metric.py +155 -0
  82. ibm_watsonx_gov/metrics/duration/__init__.py +8 -0
  83. ibm_watsonx_gov/metrics/duration/duration_decorator.py +59 -0
  84. ibm_watsonx_gov/metrics/duration/duration_metric.py +111 -0
  85. ibm_watsonx_gov/metrics/evasiveness/__init__.py +8 -0
  86. ibm_watsonx_gov/metrics/evasiveness/evasiveness_decorator.py +61 -0
  87. ibm_watsonx_gov/metrics/evasiveness/evasiveness_metric.py +103 -0
  88. ibm_watsonx_gov/metrics/faithfulness/__init__.py +8 -0
  89. ibm_watsonx_gov/metrics/faithfulness/faithfulness_decorator.py +65 -0
  90. ibm_watsonx_gov/metrics/faithfulness/faithfulness_metric.py +254 -0
  91. ibm_watsonx_gov/metrics/hap/__init__.py +16 -0
  92. ibm_watsonx_gov/metrics/hap/hap_decorator.py +58 -0
  93. ibm_watsonx_gov/metrics/hap/hap_metric.py +98 -0
  94. ibm_watsonx_gov/metrics/hap/input_hap_metric.py +104 -0
  95. ibm_watsonx_gov/metrics/hap/output_hap_metric.py +110 -0
  96. ibm_watsonx_gov/metrics/harm/__init__.py +8 -0
  97. ibm_watsonx_gov/metrics/harm/harm_decorator.py +60 -0
  98. ibm_watsonx_gov/metrics/harm/harm_metric.py +103 -0
  99. ibm_watsonx_gov/metrics/harm_engagement/__init__.py +8 -0
  100. ibm_watsonx_gov/metrics/harm_engagement/harm_engagement_decorator.py +61 -0
  101. ibm_watsonx_gov/metrics/harm_engagement/harm_engagement_metric.py +103 -0
  102. ibm_watsonx_gov/metrics/hit_rate/__init__.py +0 -0
  103. ibm_watsonx_gov/metrics/hit_rate/hit_rate_decorator.py +59 -0
  104. ibm_watsonx_gov/metrics/hit_rate/hit_rate_metric.py +167 -0
  105. ibm_watsonx_gov/metrics/input_token_count/__init__.py +8 -0
  106. ibm_watsonx_gov/metrics/input_token_count/input_token_count_decorator.py +58 -0
  107. ibm_watsonx_gov/metrics/input_token_count/input_token_count_metric.py +112 -0
  108. ibm_watsonx_gov/metrics/jailbreak/__init__.py +8 -0
  109. ibm_watsonx_gov/metrics/jailbreak/jailbreak_decorator.py +60 -0
  110. ibm_watsonx_gov/metrics/jailbreak/jailbreak_metric.py +103 -0
  111. ibm_watsonx_gov/metrics/keyword_detection/keyword_detection_decorator.py +58 -0
  112. ibm_watsonx_gov/metrics/keyword_detection/keyword_detection_metric.py +111 -0
  113. ibm_watsonx_gov/metrics/llm_validation/__init__.py +8 -0
  114. ibm_watsonx_gov/metrics/llm_validation/evaluation_criteria.py +84 -0
  115. ibm_watsonx_gov/metrics/llm_validation/llm_validation_constants.py +24 -0
  116. ibm_watsonx_gov/metrics/llm_validation/llm_validation_decorator.py +54 -0
  117. ibm_watsonx_gov/metrics/llm_validation/llm_validation_impl.py +525 -0
  118. ibm_watsonx_gov/metrics/llm_validation/llm_validation_metric.py +258 -0
  119. ibm_watsonx_gov/metrics/llm_validation/llm_validation_prompts.py +106 -0
  120. ibm_watsonx_gov/metrics/llmaj/__init__.py +0 -0
  121. ibm_watsonx_gov/metrics/llmaj/llmaj_metric.py +298 -0
  122. ibm_watsonx_gov/metrics/ndcg/__init__.py +0 -0
  123. ibm_watsonx_gov/metrics/ndcg/ndcg_decorator.py +61 -0
  124. ibm_watsonx_gov/metrics/ndcg/ndcg_metric.py +166 -0
  125. ibm_watsonx_gov/metrics/output_token_count/__init__.py +8 -0
  126. ibm_watsonx_gov/metrics/output_token_count/output_token_count_decorator.py +58 -0
  127. ibm_watsonx_gov/metrics/output_token_count/output_token_count_metric.py +112 -0
  128. ibm_watsonx_gov/metrics/pii/__init__.py +16 -0
  129. ibm_watsonx_gov/metrics/pii/input_pii_metric.py +102 -0
  130. ibm_watsonx_gov/metrics/pii/output_pii_metric.py +107 -0
  131. ibm_watsonx_gov/metrics/pii/pii_decorator.py +59 -0
  132. ibm_watsonx_gov/metrics/pii/pii_metric.py +96 -0
  133. ibm_watsonx_gov/metrics/profanity/__init__.py +8 -0
  134. ibm_watsonx_gov/metrics/profanity/profanity_decorator.py +60 -0
  135. ibm_watsonx_gov/metrics/profanity/profanity_metric.py +103 -0
  136. ibm_watsonx_gov/metrics/prompt_safety_risk/__init__.py +8 -0
  137. ibm_watsonx_gov/metrics/prompt_safety_risk/prompt_safety_risk_decorator.py +57 -0
  138. ibm_watsonx_gov/metrics/prompt_safety_risk/prompt_safety_risk_metric.py +128 -0
  139. ibm_watsonx_gov/metrics/reciprocal_rank/__init__.py +0 -0
  140. ibm_watsonx_gov/metrics/reciprocal_rank/reciprocal_rank_decorator.py +62 -0
  141. ibm_watsonx_gov/metrics/reciprocal_rank/reciprocal_rank_metric.py +162 -0
  142. ibm_watsonx_gov/metrics/regex_detection/regex_detection_decorator.py +58 -0
  143. ibm_watsonx_gov/metrics/regex_detection/regex_detection_metric.py +106 -0
  144. ibm_watsonx_gov/metrics/retrieval_precision/__init__.py +0 -0
  145. ibm_watsonx_gov/metrics/retrieval_precision/retrieval_precision_decorator.py +62 -0
  146. ibm_watsonx_gov/metrics/retrieval_precision/retrieval_precision_metric.py +170 -0
  147. ibm_watsonx_gov/metrics/sexual_content/__init__.py +8 -0
  148. ibm_watsonx_gov/metrics/sexual_content/sexual_content_decorator.py +61 -0
  149. ibm_watsonx_gov/metrics/sexual_content/sexual_content_metric.py +103 -0
  150. ibm_watsonx_gov/metrics/social_bias/__init__.py +8 -0
  151. ibm_watsonx_gov/metrics/social_bias/social_bias_decorator.py +62 -0
  152. ibm_watsonx_gov/metrics/social_bias/social_bias_metric.py +103 -0
  153. ibm_watsonx_gov/metrics/status/__init__.py +0 -0
  154. ibm_watsonx_gov/metrics/status/status_metric.py +113 -0
  155. ibm_watsonx_gov/metrics/text_grade_level/__init__.py +8 -0
  156. ibm_watsonx_gov/metrics/text_grade_level/text_grade_level_decorator.py +59 -0
  157. ibm_watsonx_gov/metrics/text_grade_level/text_grade_level_metric.py +127 -0
  158. ibm_watsonx_gov/metrics/text_reading_ease/__init__.py +8 -0
  159. ibm_watsonx_gov/metrics/text_reading_ease/text_reading_ease_decorator.py +59 -0
  160. ibm_watsonx_gov/metrics/text_reading_ease/text_reading_ease_metric.py +123 -0
  161. ibm_watsonx_gov/metrics/tool_call_accuracy/__init__.py +0 -0
  162. ibm_watsonx_gov/metrics/tool_call_accuracy/tool_call_accuracy_decorator.py +67 -0
  163. ibm_watsonx_gov/metrics/tool_call_accuracy/tool_call_accuracy_metric.py +162 -0
  164. ibm_watsonx_gov/metrics/tool_call_parameter_accuracy/__init__.py +0 -0
  165. ibm_watsonx_gov/metrics/tool_call_parameter_accuracy/tool_call_parameter_accuracy_decorator.py +68 -0
  166. ibm_watsonx_gov/metrics/tool_call_parameter_accuracy/tool_call_parameter_accuracy_metric.py +151 -0
  167. ibm_watsonx_gov/metrics/tool_call_relevance/__init__.py +0 -0
  168. ibm_watsonx_gov/metrics/tool_call_relevance/tool_call_relevance_decorator.py +71 -0
  169. ibm_watsonx_gov/metrics/tool_call_relevance/tool_call_relevance_metric.py +166 -0
  170. ibm_watsonx_gov/metrics/tool_call_syntactic_accuracy/__init__.py +0 -0
  171. ibm_watsonx_gov/metrics/tool_call_syntactic_accuracy/tool_call_syntactic_accuracy_decorator.py +66 -0
  172. ibm_watsonx_gov/metrics/tool_call_syntactic_accuracy/tool_call_syntactic_accuracy_metric.py +121 -0
  173. ibm_watsonx_gov/metrics/topic_relevance/__init__.py +8 -0
  174. ibm_watsonx_gov/metrics/topic_relevance/topic_relevance_decorator.py +57 -0
  175. ibm_watsonx_gov/metrics/topic_relevance/topic_relevance_metric.py +106 -0
  176. ibm_watsonx_gov/metrics/unethical_behavior/__init__.py +8 -0
  177. ibm_watsonx_gov/metrics/unethical_behavior/unethical_behavior_decorator.py +61 -0
  178. ibm_watsonx_gov/metrics/unethical_behavior/unethical_behavior_metric.py +103 -0
  179. ibm_watsonx_gov/metrics/unsuccessful_requests/__init__.py +0 -0
  180. ibm_watsonx_gov/metrics/unsuccessful_requests/unsuccessful_requests_decorator.py +66 -0
  181. ibm_watsonx_gov/metrics/unsuccessful_requests/unsuccessful_requests_metric.py +128 -0
  182. ibm_watsonx_gov/metrics/user_id/__init__.py +0 -0
  183. ibm_watsonx_gov/metrics/user_id/user_id_metric.py +111 -0
  184. ibm_watsonx_gov/metrics/utils.py +440 -0
  185. ibm_watsonx_gov/metrics/violence/__init__.py +8 -0
  186. ibm_watsonx_gov/metrics/violence/violence_decorator.py +60 -0
  187. ibm_watsonx_gov/metrics/violence/violence_metric.py +103 -0
  188. ibm_watsonx_gov/prompt_evaluator/__init__.py +9 -0
  189. ibm_watsonx_gov/prompt_evaluator/impl/__init__.py +8 -0
  190. ibm_watsonx_gov/prompt_evaluator/impl/prompt_evaluator_impl.py +554 -0
  191. ibm_watsonx_gov/prompt_evaluator/impl/pta_lifecycle_evaluator.py +2332 -0
  192. ibm_watsonx_gov/prompt_evaluator/prompt_evaluator.py +262 -0
  193. ibm_watsonx_gov/providers/__init__.py +8 -0
  194. ibm_watsonx_gov/providers/detectors_provider.cpython-313-darwin.so +0 -0
  195. ibm_watsonx_gov/providers/detectors_provider.py +415 -0
  196. ibm_watsonx_gov/providers/eval_assist_provider.cpython-313-darwin.so +0 -0
  197. ibm_watsonx_gov/providers/eval_assist_provider.py +266 -0
  198. ibm_watsonx_gov/providers/inference_engines/__init__.py +0 -0
  199. ibm_watsonx_gov/providers/inference_engines/custom_inference_engine.py +165 -0
  200. ibm_watsonx_gov/providers/inference_engines/portkey_inference_engine.py +57 -0
  201. ibm_watsonx_gov/providers/llmevalkit/__init__.py +0 -0
  202. ibm_watsonx_gov/providers/llmevalkit/ciso_agent/main.py +516 -0
  203. ibm_watsonx_gov/providers/llmevalkit/ciso_agent/preprocess_log.py +111 -0
  204. ibm_watsonx_gov/providers/llmevalkit/ciso_agent/utils.py +186 -0
  205. ibm_watsonx_gov/providers/llmevalkit/function_calling/README.md +411 -0
  206. ibm_watsonx_gov/providers/llmevalkit/function_calling/__init__.py +27 -0
  207. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/README.md +306 -0
  208. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/__init__.py +89 -0
  209. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/__init__.py +30 -0
  210. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/base.py +411 -0
  211. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/code_agent.py +1254 -0
  212. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/exact_match.py +134 -0
  213. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/fuzzy_string.py +104 -0
  214. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/hybrid.py +516 -0
  215. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/llm_judge.py +1882 -0
  216. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/pipeline.py +387 -0
  217. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/types.py +178 -0
  218. ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/utils.py +298 -0
  219. ibm_watsonx_gov/providers/llmevalkit/function_calling/consts.py +33 -0
  220. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/__init__.py +31 -0
  221. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/base.py +26 -0
  222. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_call/__init__.py +4 -0
  223. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_call/general.py +46 -0
  224. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_call/general_metrics.json +783 -0
  225. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_call/general_metrics_runtime.json +580 -0
  226. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_selection/__init__.py +6 -0
  227. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_selection/function_selection.py +28 -0
  228. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_selection/function_selection_metrics.json +599 -0
  229. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_selection/function_selection_metrics_runtime.json +477 -0
  230. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/loader.py +259 -0
  231. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/parameter/__init__.py +7 -0
  232. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/parameter/parameter.py +52 -0
  233. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/parameter/parameter_metrics.json +613 -0
  234. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/parameter/parameter_metrics_runtime.json +489 -0
  235. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/trajectory/__init__.py +7 -0
  236. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/trajectory/trajectory.py +43 -0
  237. ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/trajectory/trajectory_metrics.json +161 -0
  238. ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/__init__.py +0 -0
  239. ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/adapters.py +102 -0
  240. ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/pipeline.py +355 -0
  241. ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/semantic_checker.py +816 -0
  242. ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/static_checker.py +297 -0
  243. ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/transformation_prompts.py +509 -0
  244. ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/types.py +596 -0
  245. ibm_watsonx_gov/providers/llmevalkit/llm/README.md +375 -0
  246. ibm_watsonx_gov/providers/llmevalkit/llm/__init__.py +137 -0
  247. ibm_watsonx_gov/providers/llmevalkit/llm/base.py +426 -0
  248. ibm_watsonx_gov/providers/llmevalkit/llm/output_parser.py +364 -0
  249. ibm_watsonx_gov/providers/llmevalkit/llm/providers/__init__.py +0 -0
  250. ibm_watsonx_gov/providers/llmevalkit/llm/providers/consts.py +7 -0
  251. ibm_watsonx_gov/providers/llmevalkit/llm/providers/ibm_watsonx_ai/__init__.py +0 -0
  252. ibm_watsonx_gov/providers/llmevalkit/llm/providers/ibm_watsonx_ai/ibm_watsonx_ai.py +656 -0
  253. ibm_watsonx_gov/providers/llmevalkit/llm/providers/litellm/__init__.py +0 -0
  254. ibm_watsonx_gov/providers/llmevalkit/llm/providers/litellm/litellm.py +509 -0
  255. ibm_watsonx_gov/providers/llmevalkit/llm/providers/litellm/rits.py +224 -0
  256. ibm_watsonx_gov/providers/llmevalkit/llm/providers/litellm/watsonx.py +60 -0
  257. ibm_watsonx_gov/providers/llmevalkit/llm/providers/mock_llm_client.py +75 -0
  258. ibm_watsonx_gov/providers/llmevalkit/llm/providers/openai/__init__.py +0 -0
  259. ibm_watsonx_gov/providers/llmevalkit/llm/providers/openai/openai.py +639 -0
  260. ibm_watsonx_gov/providers/llmevalkit/llm/providers/wxo_ai_gateway/__init__.py +0 -0
  261. ibm_watsonx_gov/providers/llmevalkit/llm/providers/wxo_ai_gateway/wxo_ai_gateway.py +134 -0
  262. ibm_watsonx_gov/providers/llmevalkit/llm/providers/wxo_ai_gateway/wxo_ai_gateway_inference.py +214 -0
  263. ibm_watsonx_gov/providers/llmevalkit/llm/types.py +136 -0
  264. ibm_watsonx_gov/providers/llmevalkit/metrics/__init__.py +4 -0
  265. ibm_watsonx_gov/providers/llmevalkit/metrics/field.py +255 -0
  266. ibm_watsonx_gov/providers/llmevalkit/metrics/metric.py +332 -0
  267. ibm_watsonx_gov/providers/llmevalkit/metrics/metrics_runner.py +188 -0
  268. ibm_watsonx_gov/providers/llmevalkit/metrics/prompt.py +403 -0
  269. ibm_watsonx_gov/providers/llmevalkit/metrics/utils.py +46 -0
  270. ibm_watsonx_gov/providers/llmevalkit/prompt/__init__.py +0 -0
  271. ibm_watsonx_gov/providers/llmevalkit/prompt/runner.py +144 -0
  272. ibm_watsonx_gov/providers/tool_call_metric_provider.py +455 -0
  273. ibm_watsonx_gov/providers/unitxt_provider.cpython-313-darwin.so +0 -0
  274. ibm_watsonx_gov/tools/__init__.py +10 -0
  275. ibm_watsonx_gov/tools/clients/__init__.py +11 -0
  276. ibm_watsonx_gov/tools/clients/ai_tool_client.py +405 -0
  277. ibm_watsonx_gov/tools/clients/detector_client.py +82 -0
  278. ibm_watsonx_gov/tools/core/__init__.py +8 -0
  279. ibm_watsonx_gov/tools/core/tool_loader.py +237 -0
  280. ibm_watsonx_gov/tools/entities/__init__.py +8 -0
  281. ibm_watsonx_gov/tools/entities/ai_tools.py +435 -0
  282. ibm_watsonx_gov/tools/onboarding/create/answer_relevance_detector.json +57 -0
  283. ibm_watsonx_gov/tools/onboarding/create/chromadb_retrieval_tool.json +63 -0
  284. ibm_watsonx_gov/tools/onboarding/create/context_relevance_detector.json +57 -0
  285. ibm_watsonx_gov/tools/onboarding/create/duduckgo_search_tool.json +53 -0
  286. ibm_watsonx_gov/tools/onboarding/create/google_search_tool.json +62 -0
  287. ibm_watsonx_gov/tools/onboarding/create/hap_detector.json +70 -0
  288. ibm_watsonx_gov/tools/onboarding/create/jailbreak_detector.json +70 -0
  289. ibm_watsonx_gov/tools/onboarding/create/pii_detector.json +36 -0
  290. ibm_watsonx_gov/tools/onboarding/create/prompt_safety_risk_detector.json +69 -0
  291. ibm_watsonx_gov/tools/onboarding/create/topic_relevance_detector.json +57 -0
  292. ibm_watsonx_gov/tools/onboarding/create/weather_tool.json +39 -0
  293. ibm_watsonx_gov/tools/onboarding/create/webcrawler_tool.json +34 -0
  294. ibm_watsonx_gov/tools/onboarding/create/wikipedia_search_tool.json +53 -0
  295. ibm_watsonx_gov/tools/onboarding/delete/delete_tools.json +4 -0
  296. ibm_watsonx_gov/tools/onboarding/update/google_search_tool.json +38 -0
  297. ibm_watsonx_gov/tools/ootb/__init__.py +8 -0
  298. ibm_watsonx_gov/tools/ootb/detectors/__init__.py +8 -0
  299. ibm_watsonx_gov/tools/ootb/detectors/hap_detector_tool.py +109 -0
  300. ibm_watsonx_gov/tools/ootb/detectors/jailbreak_detector_tool.py +104 -0
  301. ibm_watsonx_gov/tools/ootb/detectors/pii_detector_tool.py +83 -0
  302. ibm_watsonx_gov/tools/ootb/detectors/prompt_safety_risk_detector_tool.py +111 -0
  303. ibm_watsonx_gov/tools/ootb/detectors/topic_relevance_detector_tool.py +101 -0
  304. ibm_watsonx_gov/tools/ootb/rag/__init__.py +8 -0
  305. ibm_watsonx_gov/tools/ootb/rag/answer_relevance_detector_tool.py +119 -0
  306. ibm_watsonx_gov/tools/ootb/rag/context_relevance_detector_tool.py +118 -0
  307. ibm_watsonx_gov/tools/ootb/search/__init__.py +8 -0
  308. ibm_watsonx_gov/tools/ootb/search/duckduckgo_search_tool.py +62 -0
  309. ibm_watsonx_gov/tools/ootb/search/google_search_tool.py +105 -0
  310. ibm_watsonx_gov/tools/ootb/search/weather_tool.py +95 -0
  311. ibm_watsonx_gov/tools/ootb/search/web_crawler_tool.py +69 -0
  312. ibm_watsonx_gov/tools/ootb/search/wikipedia_search_tool.py +63 -0
  313. ibm_watsonx_gov/tools/ootb/vectordb/__init__.py +8 -0
  314. ibm_watsonx_gov/tools/ootb/vectordb/chromadb_retriever_tool.py +111 -0
  315. ibm_watsonx_gov/tools/rest_api/__init__.py +10 -0
  316. ibm_watsonx_gov/tools/rest_api/restapi_tool.py +72 -0
  317. ibm_watsonx_gov/tools/schemas/__init__.py +10 -0
  318. ibm_watsonx_gov/tools/schemas/search_tool_schema.py +46 -0
  319. ibm_watsonx_gov/tools/schemas/vectordb_retrieval_schema.py +55 -0
  320. ibm_watsonx_gov/tools/utils/__init__.py +14 -0
  321. ibm_watsonx_gov/tools/utils/constants.py +69 -0
  322. ibm_watsonx_gov/tools/utils/display_utils.py +38 -0
  323. ibm_watsonx_gov/tools/utils/environment.py +108 -0
  324. ibm_watsonx_gov/tools/utils/package_utils.py +40 -0
  325. ibm_watsonx_gov/tools/utils/platform_url_mapping.cpython-313-darwin.so +0 -0
  326. ibm_watsonx_gov/tools/utils/python_utils.py +68 -0
  327. ibm_watsonx_gov/tools/utils/tool_utils.py +206 -0
  328. ibm_watsonx_gov/traces/__init__.py +8 -0
  329. ibm_watsonx_gov/traces/span_exporter.py +195 -0
  330. ibm_watsonx_gov/traces/span_node.py +251 -0
  331. ibm_watsonx_gov/traces/span_util.py +153 -0
  332. ibm_watsonx_gov/traces/trace_utils.py +1074 -0
  333. ibm_watsonx_gov/utils/__init__.py +8 -0
  334. ibm_watsonx_gov/utils/aggregation_util.py +346 -0
  335. ibm_watsonx_gov/utils/async_util.py +62 -0
  336. ibm_watsonx_gov/utils/authenticator.py +144 -0
  337. ibm_watsonx_gov/utils/constants.py +15 -0
  338. ibm_watsonx_gov/utils/errors.py +40 -0
  339. ibm_watsonx_gov/utils/gov_sdk_logger.py +39 -0
  340. ibm_watsonx_gov/utils/insights_generator.py +1285 -0
  341. ibm_watsonx_gov/utils/python_utils.py +425 -0
  342. ibm_watsonx_gov/utils/rest_util.py +73 -0
  343. ibm_watsonx_gov/utils/segment_batch_manager.py +162 -0
  344. ibm_watsonx_gov/utils/singleton_meta.py +25 -0
  345. ibm_watsonx_gov/utils/url_mapping.cpython-313-darwin.so +0 -0
  346. ibm_watsonx_gov/utils/validation_util.py +126 -0
  347. ibm_watsonx_gov/visualizations/__init__.py +13 -0
  348. ibm_watsonx_gov/visualizations/metric_descriptions.py +57 -0
  349. ibm_watsonx_gov/visualizations/model_insights.py +1304 -0
  350. ibm_watsonx_gov/visualizations/visualization_utils.py +75 -0
  351. ibm_watsonx_gov-1.3.3.dist-info/METADATA +93 -0
  352. ibm_watsonx_gov-1.3.3.dist-info/RECORD +353 -0
  353. ibm_watsonx_gov-1.3.3.dist-info/WHEEL +6 -0
@@ -0,0 +1,237 @@
1
+ # ----------------------------------------------------------------------------------------------------
2
+ # IBM Confidential
3
+ # Licensed Materials - Property of IBM
4
+ # 5737-H76, 5900-A3Q
5
+ # © Copyright IBM Corp. 2025 All Rights Reserved.
6
+ # US Government Users Restricted Rights - Use, duplication or disclosure restricted by
7
+ # GSA ADPSchedule Contract with IBM Corp.
8
+ # ----------------------------------------------------------------------------------------------------
9
+
10
+ import ast
11
+ from typing import Callable, Union
12
+
13
+ import pandas as pd
14
+ from langchain_core.tools import StructuredTool
15
+ from pydantic import BaseModel
16
+
17
+ from ibm_watsonx_gov.utils.python_utils import get
18
+
19
+ from ..clients import get_tool_info
20
+ from ..utils import (TOOL_REGISTRY, get_base64_decoding, get_pydantic_model,
21
+ validate_envs)
22
+ from ..utils.constants import CustomToolType, ServiceProviderType
23
+ from ..utils.package_utils import install_and_import_packages
24
+
25
+
26
+ def load_tool(tool_name: str, **kwargs):
27
+ """
28
+ Method to load a tool based on tool name and other parameters
29
+
30
+ Args:
31
+ tool_name(str) :
32
+ Name of the registered tool
33
+ headers(Optional[headers]):
34
+ - Dynamic headers to be supplied to the tool
35
+ - If the user supplies static headers (whose value do not change) no need of supplying this header while loading.
36
+ - User is expected to provide the information related to dynamic headers while tool loading . Types of dynamic headers
37
+ - If the tool is registered with header value $DYNAMIC HEADERS it is mandatory to supply the information while tool loading
38
+ - If the tool is registered with convention `headers_key: $header_key` this information should be supplied as part of environment
39
+ **kwargs:
40
+ Optional configuration based on the tool .(Eg: Configuration properties for OOTB tool)
41
+
42
+ Returns:
43
+ Tool : A Langchain/Langgraph compatible tool object
44
+
45
+ Examples:
46
+ -------
47
+ 1. Basic example to load a tool
48
+ .. code-block:: python
49
+
50
+ from ibm_watsonx_gov.tools import load_tool
51
+ tool = load_tool(tool_name=<TOOL_NAME>)
52
+
53
+ 2. Example of tool loading that expects configuration
54
+ .. code-block:: python
55
+
56
+ from ibm_watsonx_gov.tools import load_tool
57
+ from ibm_watsonx_gov.tools.clients import get_tool_info
58
+
59
+ tool_details = get_tool_info(tool_name=<TOOL_NAME>)
60
+ tool_config = tool_details.get("entity").get("config)
61
+ config = {
62
+ <Provide the properties as per the details in tool config>
63
+ }
64
+ tool = load_tool(tool_name=<TOOL_NAME>,**config)
65
+
66
+ 3. Example of tool loading that expects headers
67
+ .. code-block:: python
68
+
69
+ from ibm_watsonx_gov.tools import load_tool
70
+ from ibm_watsonx_gov.tools.clients import get_tool_info
71
+
72
+ tool_details = get_tool_info(tool_name=<TOOL_NAME>)
73
+ headers = tool_details.get("entity").get("endpoint").get("headers")
74
+
75
+ headers = {
76
+ "Authorization":"Bearer __TOKEN__" #Need to supply dynamic headers
77
+ }
78
+ tool = load_tool(tool_name=<TOOL_NAME>,headers=headers)
79
+ """
80
+ # Get the tool information
81
+ tool_details = get_tool_info(tool_name=tool_name)
82
+
83
+ # Get service provider type
84
+ service_provider_type = get(tool_details, "entity.service_provider_type")
85
+ tool_name = get(tool_details, "entity.tool_name")
86
+ env_list = get(tool_details, "entity.environment_variables", [])
87
+
88
+ # Validate the env for loading the tool
89
+ validate_envs(env_list)
90
+
91
+ # Load the tool based on the service provider type
92
+ try:
93
+ if service_provider_type == ServiceProviderType.CUSTOM.value:
94
+ tool_description = get(tool_details, "entity.description")
95
+ tool_schema = get(tool_details, "entity.schema")
96
+ tool_type = get(tool_details, "entity.tool_type")
97
+ dependencies = get(
98
+ tool_details, "entity.dependencies.run_time_packages")
99
+ if len(dependencies) > 0:
100
+ dependencies = [package for package in dependencies if not package.startswith(
101
+ "ibm-watsonx-gov")]
102
+ install_and_import_packages(dependencies)
103
+
104
+ if tool_type == CustomToolType.CODE.value:
105
+ # This is a code based tool
106
+ encode_tool_code = get(
107
+ tool_details, "entity.code.source_code_base64")
108
+ tool_code = get_base64_decoding(encode_tool_code)
109
+ return _load_custom_tool(tool_name,
110
+ tool_description,
111
+ tool_code,
112
+ tool_schema,
113
+ **kwargs)
114
+ elif tool_type == CustomToolType.ENDPOINT.value:
115
+ tool_endpoint = get(tool_details, "entity.endpoint.url")
116
+ headers = get(tool_details, "entity.endpoint.headers", {})
117
+ arg_headers = kwargs.get("headers", {})
118
+ tool_headers = headers | arg_headers
119
+ method = get(tool_details, "entity.endpoint.method", "POST")
120
+ return _load_restapi_tool(tool_name,
121
+ tool_description,
122
+ tool_endpoint,
123
+ tool_schema,
124
+ tool_headers,
125
+ method=method)
126
+ elif service_provider_type == ServiceProviderType.IBM.value:
127
+ return _load_ootb_tool(tool_name, **kwargs)
128
+ else:
129
+ raise Exception(
130
+ f"service_provide_type:{service_provider_type} is not supporteds. Acceptable values:{ServiceProviderType.values()}")
131
+ except Exception as ex:
132
+ raise Exception(f"Error loading tool {tool_name}. Details:{str(ex)}")
133
+
134
+
135
+ def _load_ootb_tool(tool_name: str = None, **kwargs) -> Callable:
136
+ """
137
+ Load the OOTB tool using the tool name
138
+
139
+ Args:
140
+ tool_name (str): Name of the OOTB tool
141
+
142
+ Returns:
143
+ Callable: OOTB Tool loaded from the tool registry
144
+ """
145
+ if tool_name is None:
146
+ raise Exception("'tool_name' parameter is missing.")
147
+
148
+ tool_class_path = TOOL_REGISTRY.get(tool_name, None)
149
+ if tool_class_path is None:
150
+ raise Exception(f"OOTB tool {tool_name} is not available")
151
+
152
+ module_path, _, class_name = tool_class_path.rpartition('.')
153
+ tool_module = __import__(module_path, fromlist=[f"{class_name}"])
154
+
155
+ return getattr(tool_module, class_name)(**kwargs)
156
+
157
+
158
+ def _load_custom_tool(tool_name: str,
159
+ tool_description: str,
160
+ tool_code: str,
161
+ tool_schema: dict,
162
+ **kwargs) -> Callable:
163
+ """Method to create custom tool
164
+
165
+ Args:
166
+ tool_name (str): Name of the agent tool
167
+ tool_description (str): Description of agent tool
168
+ tool_code (str): Tool code in the form of doc string
169
+ tool_schema (dict): JSON args schema to be supplied for converting tool
170
+
171
+ Returns:
172
+ Callable: Custom tool created using the tool code
173
+ """
174
+
175
+ def call_tool(**kwargs):
176
+ tree = ast.parse(tool_code, mode="exec")
177
+ function_name = tree.body[0].name
178
+ compiled_code = compile(tree, 'custom_tool', 'exec')
179
+ namespace = {}
180
+ exec(compiled_code, namespace)
181
+ return namespace[function_name](**kwargs)
182
+
183
+ title = tool_name + \
184
+ "_schema" if tool_schema.get(
185
+ 'title') is None else tool_schema.get('title')
186
+
187
+ tool = StructuredTool(
188
+ name=tool_name,
189
+ description=tool_description,
190
+ func=call_tool,
191
+ args_schema=get_pydantic_model(title, tool_schema)
192
+ )
193
+ return tool
194
+
195
+
196
+ def _load_restapi_tool(tool_name: str,
197
+ tool_description: str,
198
+ tool_endpoint: str,
199
+ tool_schema: Union[dict, BaseModel],
200
+ headers: dict = {},
201
+ method='POST') -> Callable:
202
+ """Method to create custom tool
203
+
204
+ Args:
205
+ tool_name (str): Name of the agent tool
206
+ tool_description (str): Description of the agent tool
207
+ tool_endpoint (str): RestEndpoint to be used as a tool
208
+ tool_schema (Union[dict, BaseModel]): Tool schema
209
+ headers (dict,optional): Headers to be used while calling the tool .Defaults to {}
210
+ method (str, optional): _description_. Defaults to 'POST'.
211
+
212
+ Returns:
213
+ Callable: RESTAPI tool created using the template tool
214
+ """
215
+ from ..rest_api import RestApiTool, load_headers
216
+ if isinstance(tool_schema, dict):
217
+
218
+ title = tool_name + \
219
+ "_schema" if tool_schema.get(
220
+ 'title') is None else tool_schema.get('title')
221
+
222
+ args_schema = get_pydantic_model(title, tool_schema)
223
+ else:
224
+ args_schema = tool_schema
225
+
226
+ # Load headers with envs as needed
227
+ headers = load_headers(tool_name, headers)
228
+
229
+ tool = RestApiTool(
230
+ name=tool_name,
231
+ description=tool_description,
232
+ endpoint=tool_endpoint,
233
+ method=method,
234
+ headers=headers,
235
+ args_schema=args_schema
236
+ )
237
+ return tool
@@ -0,0 +1,8 @@
1
+ # ----------------------------------------------------------------------------------------------------
2
+ # IBM Confidential
3
+ # Licensed Materials - Property of IBM
4
+ # 5737-H76, 5900-A3Q
5
+ # © Copyright IBM Corp. 2025 All Rights Reserved.
6
+ # US Government Users Restricted Rights - Use, duplication or disclosure restricted by
7
+ # GSA ADPSchedule Contract with IBM Corp.
8
+ # ----------------------------------------------------------------------------------------------------
@@ -0,0 +1,435 @@
1
+ # ----------------------------------------------------------------------------------------------------
2
+ # IBM Confidential
3
+ # Licensed Materials - Property of IBM
4
+ # 5737-H76, 5900-A3Q
5
+ # © Copyright IBM Corp. 2025 All Rights Reserved.
6
+ # US Government Users Restricted Rights - Use, duplication or disclosure restricted by
7
+ # GSA ADPSchedule Contract with IBM Corp.
8
+ # ----------------------------------------------------------------------------------------------------
9
+
10
+ from typing import Annotated, Any, Dict, List, Optional
11
+
12
+ from pydantic import BaseModel, Field, model_validator
13
+ from pydantic_core import PydanticCustomError
14
+
15
+ from ..utils.constants import (Categories, CustomToolType, Framework,
16
+ PatchOperationTypes, ServiceProviderType)
17
+ from ..utils.python_utils import get_base64_encoding
18
+
19
+
20
+ class AIToolRuntimeDetails(BaseModel):
21
+ engine: Annotated[
22
+ str,
23
+ Field(
24
+ ...,
25
+ description="Python version required by the tool."
26
+ )
27
+ ]
28
+ cpu_capacity: Annotated[
29
+ Optional[str],
30
+ Field(
31
+ default=None,
32
+ description="CPU capacity required by the tool."
33
+ )
34
+ ]
35
+ memory: Annotated[
36
+ Optional[str],
37
+ Field(
38
+ default=None,
39
+ description="Memory required by the tool."
40
+ )
41
+ ]
42
+
43
+
44
+ class AIToolCodePayload(BaseModel):
45
+ source: Annotated[
46
+ Optional[str],
47
+ Field(
48
+ default=None,
49
+ description="Source location of the tool's code."
50
+ )
51
+ ]
52
+ commit: Annotated[
53
+ Optional[str],
54
+ Field(
55
+ default=None
56
+ )
57
+ ]
58
+ language: Annotated[
59
+ Optional[str],
60
+ Field(
61
+ default="python",
62
+ description="Language used in the code"
63
+ )
64
+ ]
65
+ source_code_url: Annotated[
66
+ Optional[str],
67
+ Field(
68
+ default=None,
69
+ description="Remote URL for accessing the source code. Currently, only GitHub URLs are supported."
70
+ )
71
+ ]
72
+ source_code_base64: Annotated[
73
+ Optional[str],
74
+ Field(
75
+ ...,
76
+ description="Source code for invoking the tool.",
77
+ )
78
+ ]
79
+ run_time_details: Annotated[
80
+ Optional[AIToolRuntimeDetails],
81
+ Field(
82
+ ...,
83
+ description="Runtime details required for executing the source code."
84
+ )
85
+ ]
86
+
87
+ @model_validator(mode='before')
88
+ @classmethod
89
+ def accept_multiple_field_names(cls, data):
90
+ if "source_code" in data and "source_code_base64" not in data:
91
+ data["source_code_base64"] = data["source_code"]
92
+ return data
93
+
94
+
95
+ class AIToolEndpointPayload(BaseModel):
96
+ url: Annotated[
97
+ str,
98
+ Field(
99
+ ...,
100
+ description="URL to access the endpoint."
101
+ )
102
+ ]
103
+ method: Annotated[
104
+ str,
105
+ Field(
106
+ ...,
107
+ description="Method to access the endpoint."
108
+ )
109
+ ]
110
+ headers: Annotated[
111
+ Dict[str, Any],
112
+ Field(
113
+ ...,
114
+ description="Headers required to call the endpoint."
115
+ )
116
+ ]
117
+
118
+
119
+ class AIToolUsedInApplication(BaseModel):
120
+ inventory_id: Annotated[
121
+ str,
122
+ Field(
123
+ ...,
124
+ description="Inventory ID of the application where the tool is used."
125
+ )
126
+ ]
127
+ agent_asset_id: Annotated[
128
+ str,
129
+ Field(
130
+ ...,
131
+ description="Agent ID of the application where the tool is used."
132
+ )
133
+ ]
134
+
135
+
136
+ class AIToolDependencies(BaseModel):
137
+ remote_services: Annotated[
138
+ list[str],
139
+ Field(
140
+ default=None,
141
+ )
142
+ ]
143
+ run_time_packages: Annotated[
144
+ list[str],
145
+ Field(
146
+ default=None,
147
+ )
148
+ ]
149
+
150
+
151
+ class AIToolBenchmark(BaseModel):
152
+ avg_latency: Annotated[
153
+ str,
154
+ Field(
155
+ default=None,
156
+ )]
157
+ dataset: Annotated[
158
+ str,
159
+ Field(
160
+ ...,
161
+ description="GitHub URL for the dataset."
162
+ )]
163
+ records: Annotated[
164
+ int,
165
+ Field(
166
+ ...,
167
+ description="Number of records contained in the dataset."
168
+ )]
169
+
170
+
171
+ class AIToolSchema(BaseModel):
172
+ title: Annotated[
173
+ Optional[str],
174
+ Field(
175
+ default=None,
176
+ description="Title for schema."
177
+ )]
178
+ type: Annotated[
179
+ Optional[str],
180
+ Field(
181
+ default=None,
182
+ description="Type of schema."
183
+ )]
184
+ properties: Annotated[
185
+ dict,
186
+ Field(
187
+ ...,
188
+ description="Properties for schema."
189
+ )]
190
+ required: Annotated[
191
+ Optional[list],
192
+ Field(
193
+ default=None,
194
+ description="Required for schema."
195
+ )]
196
+
197
+
198
+ class ToolRegistrationPayload(BaseModel):
199
+ tool_name: Annotated[
200
+ str,
201
+ Field(
202
+ ...,
203
+ description="Unique name for the tool"
204
+ )
205
+ ]
206
+ display_name: Annotated[
207
+ Optional[str],
208
+ Field(
209
+ default=None,
210
+ description="Unique name for displaying the tool."
211
+ )
212
+ ]
213
+ service_provider_type: Annotated[
214
+ Optional[ServiceProviderType],
215
+ Field(
216
+ default=ServiceProviderType.CUSTOM,
217
+ description=f"Service provider type. Allowed values are: {ServiceProviderType.values()}."
218
+ )
219
+ ]
220
+ tool_type: Annotated[
221
+ Optional[CustomToolType],
222
+ Field(
223
+ default=CustomToolType.CODE,
224
+ description=f"Type of the tool. Allowed tool types are: {CustomToolType.values()}."
225
+ )
226
+ ]
227
+ description: Annotated[
228
+ str,
229
+ Field(
230
+ ...,
231
+ description="Short description about the tool."
232
+ )
233
+ ]
234
+ summary: Annotated[
235
+ Optional[str],
236
+ Field(
237
+ default=None,
238
+ description="Summary of the tool."
239
+ )
240
+ ]
241
+ development_uri_link: Annotated[
242
+ Optional[str],
243
+ Field(
244
+ default=None
245
+ )
246
+ ]
247
+ inventory_id: Annotated[
248
+ Optional[str],
249
+ Field(
250
+ default=None,
251
+ description="Inventory ID in which the asset needs to be created."
252
+ )
253
+ ]
254
+ reusable: Annotated[
255
+ bool,
256
+ Field(
257
+ default=True,
258
+ description="Specify the tool will be reusable."
259
+ )
260
+ ]
261
+ framework: Annotated[
262
+ list[Framework],
263
+ Field(
264
+ default_factory=lambda: [Framework.LANGCHAIN, Framework.LANGGRAPH],
265
+ description="Specify the framework used by the tool."
266
+ )
267
+ ]
268
+ category: Annotated[
269
+ List[Categories],
270
+ Field(
271
+ default_factory=lambda: [Categories.OTHER],
272
+ description=f"Specify the category under which the tool will be classified. Allowed values are {Categories.values()}."
273
+ )
274
+ ]
275
+ used_in_applications: Annotated[
276
+ Optional[List[AIToolUsedInApplication]],
277
+ Field(
278
+ default=None,
279
+ description="List of applications where this tool is used."
280
+ )
281
+ ]
282
+ code: Annotated[
283
+ Optional[AIToolCodePayload],
284
+ Field(
285
+ default=None,
286
+ description="Code-related information for the tool."
287
+ )
288
+ ]
289
+ endpoint: Annotated[
290
+ Optional[AIToolEndpointPayload],
291
+ Field(
292
+ default=None,
293
+ description="Endpoint-related information for the tool."
294
+ )
295
+ ]
296
+ dependencies: Annotated[
297
+ Optional[AIToolDependencies],
298
+ Field(
299
+ default=None,
300
+ description="Dependencies required by this tool."
301
+ )
302
+ ]
303
+ config: Annotated[
304
+ Optional[Dict],
305
+ Field(
306
+ default=None,
307
+ description="Configuration information for this tool."
308
+ )
309
+ ]
310
+ schema_: Annotated[
311
+ AIToolSchema,
312
+ Field(
313
+ ...,
314
+ description="Schema information for this tool.",
315
+ alias="schema"
316
+ )
317
+ ]
318
+ environment_variables: Annotated[
319
+ Optional[list[str]],
320
+ Field(
321
+ default=None,
322
+ description="Environment variables required by this tool."
323
+ )
324
+ ]
325
+ metrics: Annotated[
326
+ Optional[Dict],
327
+ Field(
328
+ default=None,
329
+ description="Metrics and their respective values."
330
+ )
331
+ ]
332
+ pricing: Annotated[
333
+ Optional[Dict],
334
+ Field(
335
+ default=None,
336
+ description="Type of currency and its corresponding price."
337
+ )
338
+ ]
339
+ benchmark_test: Annotated[
340
+ Optional[AIToolBenchmark],
341
+ Field(
342
+ default=None,
343
+ description="Benchmark test details."
344
+ )
345
+ ]
346
+
347
+ @model_validator(mode='before')
348
+ @classmethod
349
+ def check_tool_type(cls, data):
350
+ if "tool_type" not in data:
351
+ data["tool_type"] = CustomToolType.CODE.value
352
+ if data["tool_type"] == CustomToolType.CODE.value and "code" in data and "endpoint" in data:
353
+ data["endpoint"] = None
354
+ if data["tool_type"] == CustomToolType.ENDPOINT.value and "code" in data and "endpoint" in data:
355
+ data["code"] = None
356
+ return data
357
+
358
+ @model_validator(mode="after")
359
+ def validate_post_payload(self):
360
+ if self.tool_type == CustomToolType.CODE and not self.code:
361
+ raise PydanticCustomError(
362
+ "missing code_payload", 'tool_type is "code", but code field missing in payload.'
363
+ )
364
+
365
+ if self.tool_type == CustomToolType.CODE and not self.code.source_code_url and not self.code.source_code_base64:
366
+ raise PydanticCustomError(
367
+ "missing_source_code ", 'Missing both source_code_url and source_code_base64.'
368
+ )
369
+
370
+ if self.code and self.code.source_code_base64:
371
+ self.code.source_code_base64 = get_base64_encoding(
372
+ tool_code=self.code.source_code_base64)
373
+
374
+ if self.tool_type == CustomToolType.ENDPOINT and not self.endpoint:
375
+ raise PydanticCustomError(
376
+ "missing_endpoint_payload", 'tool_type is "endpoint", but endpoint field missing in payload.'
377
+ )
378
+
379
+ if self.service_provider_type.value == ServiceProviderType.IBM.value:
380
+ raise Exception(f"The service provider type 'IBM' is not supported. Supported service provider type are: 'custom'")
381
+
382
+ if not self.display_name:
383
+ self.display_name = self.tool_name
384
+
385
+ return self
386
+
387
+
388
+ class PatchPayload(BaseModel):
389
+ op: Annotated[
390
+ PatchOperationTypes,
391
+ Field(
392
+ ...,
393
+ description="Type of operation to be performed."
394
+ )
395
+ ]
396
+ path: Annotated[
397
+ str,
398
+ Field(
399
+ ...,
400
+ description="Path of the field on which the operation needs to be performed."
401
+ )
402
+ ]
403
+ value: Annotated[
404
+ Any,
405
+ Field(
406
+ ...,
407
+ description="The value to be applied during the specified operation on the given field path."
408
+ )
409
+ ]
410
+
411
+ @model_validator(mode="after")
412
+ def validate_patch_payload(self):
413
+ if "source_code_base64" in self.path:
414
+ self.value = get_base64_encoding(tool_code=self.value)
415
+ return self
416
+
417
+
418
+ class ToolUpdatePayload(BaseModel):
419
+ payload: Annotated[
420
+ list[PatchPayload],
421
+ Field(
422
+ ...,
423
+ description="List of patch payloads used to perform the patch operation."
424
+ )
425
+ ]
426
+
427
+ @model_validator(mode='before')
428
+ @classmethod
429
+ def validate_ai_tool_patch_payload(cls, values):
430
+ if "payload" not in values or not isinstance(values.get("payload"), list):
431
+ raise PydanticCustomError(
432
+ "Invalid_payload",
433
+ "The payload is either missing or not in a valid list format."
434
+ )
435
+ return values