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,119 @@
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, List, Optional, Type
11
+
12
+ from langchain.callbacks.manager import CallbackManagerForToolRun
13
+ from langchain.tools import BaseTool
14
+ from pydantic import BaseModel, Field, PrivateAttr
15
+
16
+ import ibm_watsonx_gov.tools.clients.detector_client as dc
17
+
18
+
19
+ class AnswerRelevanceInput(BaseModel):
20
+ """
21
+ Model that can be used for setting input args for answer relevance tool
22
+ """
23
+ input: Annotated[str,
24
+ Field(..., description="The original user input/question.")]
25
+ generated_text: Annotated[str,
26
+ Field(..., description="The response generated by the LLM.")]
27
+ threshold: Annotated[Optional[float], Field(
28
+ 0.7, description="Threshold for answer relevance detection, values range from 0.0 to 1.0")]
29
+
30
+
31
+ class AnswerRelevanceConfig(BaseModel):
32
+ """
33
+ Model that can be used for setting config args for answer relevance tool
34
+ """
35
+ threshold: Annotated[Optional[float], Field(
36
+ 0.7, description="Threshold for answer relevance detection, values range from 0.0 to 1.0")]
37
+
38
+
39
+ class AnswerRelevanceDetectorTool(BaseTool):
40
+ """
41
+ Tool to detect answer relevance for given input and response from LLM
42
+
43
+ Examples:
44
+ Basic usage
45
+ .. code-block:: python
46
+
47
+ answer_relevance_detector = class AnswerRelevanceDetectorTool(BaseTool)()
48
+ answer_relevance_detector.invoke({"input":"<USER_INPUT>","generated_text":"<LLM response>"})
49
+ """
50
+ name: str = "answer_relevance_detector"
51
+ description: str = (
52
+ "Tool that analyzes whether the generated text meaningfully and directly addresses the user's input."\
53
+ "It compares the user input and generated text to return a boolean flag and a numeric score indicating the degree of relevance.")
54
+ args_schema: Type[BaseModel] = AnswerRelevanceInput
55
+
56
+ _url: any = PrivateAttr()
57
+ _threshold: any = PrivateAttr()
58
+
59
+ def __init__(self, **kwargs):
60
+ super().__init__(**kwargs)
61
+ config = AnswerRelevanceConfig(**kwargs)
62
+ self._threshold = config.threshold
63
+ self._url = dc.DETECTIONS_GENRATE_URL.format(dc.get_base_url())
64
+
65
+ # Define Answer relevace tool
66
+ def _run(self,
67
+ input: str,
68
+ generated_text: str,
69
+ run_manager: Optional[CallbackManagerForToolRun] = None,
70
+ **kwargs) -> List[str]:
71
+ """
72
+ Sample Response:
73
+ {
74
+ "detections": [
75
+ {
76
+ "detection_type": "risk",
77
+ "detector_id": "granite_guardian_3_2_5b",
78
+ "score": 0.03726182132959366
79
+ }
80
+ ],
81
+ "is_answer_relevant":True
82
+ }
83
+ """
84
+ threshold = kwargs.get("threshold",self._threshold)
85
+
86
+ #set payload
87
+ base_payload = dc.get_base_payload(dc.GRANITE_GUADIAN,
88
+ detector_params={
89
+ "risk_name": "answer_relevance",
90
+ "threshold": 0.0
91
+ })
92
+ ar_payload = {
93
+ "prompt":input,
94
+ "generated_text": generated_text
95
+ }
96
+
97
+ payload = {**base_payload,**ar_payload}
98
+ detections_response = dc.call_detections(self._url, payload)
99
+
100
+ #Remove unwanted properties
101
+ detections = detections_response.get("detections",[])
102
+ for detection in detections:
103
+ detection.pop("detection",None)
104
+ score = detections[0].get("score")
105
+
106
+ #Propogate a boolen to get a intutive response
107
+ is_answer_relevant = False if score > threshold else True
108
+
109
+ detections_response["detections"] = detections
110
+ detections_response["is_answer_relevant"] = is_answer_relevant
111
+ return detections_response
112
+
113
+ async def _arun(self,
114
+ input: str,
115
+ generated_text: str,
116
+ run_manager: Optional[CallbackManagerForToolRun] = None,
117
+ **kwargs) -> List[str]:
118
+
119
+ return self._run(input , generated_text, kwargs)
@@ -0,0 +1,118 @@
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, List, Optional, Type
11
+
12
+ from langchain.callbacks.manager import CallbackManagerForToolRun
13
+ from langchain.tools import BaseTool
14
+ from pydantic import BaseModel, Field, PrivateAttr
15
+
16
+ import ibm_watsonx_gov.tools.clients.detector_client as dc
17
+
18
+
19
+ class ContextRelevanceInput(BaseModel):
20
+ """
21
+ Model that can be used for setting input args for context relevance tool
22
+ """
23
+ input: Annotated[str,
24
+ Field(..., description="The original user input/question.")]
25
+ context: Annotated[str,
26
+ Field(..., description="The retrieved or provided context to validate")]
27
+ threshold: Annotated[Optional[float], Field(
28
+ 0.7, description="Threshold for answer relevance detection, values range from 0.0 to 1.0")]
29
+
30
+
31
+ class ContextRelevanceConfig(BaseModel):
32
+ """
33
+ Model that can be used for setting config args for context relevance tool
34
+ """
35
+ threshold: Annotated[Optional[float], Field(
36
+ 0.7, description="Threshold for answer relevance detection, values range from 0.0 to 1.0")]
37
+
38
+
39
+ class ContextRelevanceDetectorTool(BaseTool):
40
+ """
41
+ Tool to detect answer relevance for given input and response from LLM
42
+
43
+ Examples:
44
+ Basic usage
45
+ .. code-block:: python
46
+
47
+ context_relevance_detector = class ContextRelevanceDetectorTool(BaseTool)()
48
+ context_relevance_detector.invoke({"input":"<USER_INPUT>","context":"<context retrieved>"})
49
+ """
50
+ name: str = "context_relevance_detector"
51
+ description: str = ("Tool that analyzes whether the user input is relevant to the given context." \
52
+ "It compares the input with the provided context and outputs a boolean along with a relevance score. ")
53
+ args_schema: Type[BaseModel] = ContextRelevanceInput
54
+ _url: any = PrivateAttr()
55
+ _threshold: any = PrivateAttr()
56
+
57
+ def __init__(self, **kwargs):
58
+ super().__init__(**kwargs)
59
+ config = ContextRelevanceConfig(**kwargs)
60
+ self._threshold = config.threshold
61
+ self._url = dc.DETECTIONS_CONTEXT_URL.format(dc.get_base_url())
62
+
63
+ # Define Answer relevace tool
64
+ def _run(self,
65
+ input: str,
66
+ context: str,
67
+ run_manager: Optional[CallbackManagerForToolRun] = None,
68
+ **kwargs) -> List[str]:
69
+ """
70
+ Sample Response:
71
+ {
72
+ "detections": [
73
+ {
74
+ "detection_type": "risk",
75
+ "detector_id": "granite_guardian_3_2_5b",
76
+ "score": 0.03726182132959366
77
+ }
78
+ ],
79
+ "is_context_relevant":True
80
+ }
81
+ """
82
+ threshold = kwargs.get("threshold",self._threshold)
83
+
84
+ #Get payload
85
+ base_payload = dc.get_base_payload(dc.GRANITE_GUADIAN,
86
+ detector_params={
87
+ "risk_name": "context_relevance",
88
+ "threshold": 0.0
89
+ })
90
+ cr_payload = {
91
+ "input":input,
92
+ "context_type": "docs",
93
+ "context": [context]
94
+ }
95
+
96
+ payload = {**base_payload,**cr_payload}
97
+ detections_response = dc.call_detections(self._url, payload)
98
+
99
+ #Remove unwanted properties
100
+ detections = detections_response.get("detections",[])
101
+ for detection in detections:
102
+ detection.pop("detection",None)
103
+ score = detections[0].get("score")
104
+
105
+ #Propogate a boolen to get a intutive response
106
+ is_context_relevant = False if score > threshold else True
107
+
108
+ detections_response["detections"] = detections
109
+ detections_response["is_context_relevant"] = is_context_relevant
110
+ return detections_response
111
+
112
+ async def _arun(self,
113
+ input: str,
114
+ context: str,
115
+ run_manager: Optional[CallbackManagerForToolRun] = None,
116
+ **kwargs) -> List[str]:
117
+
118
+ return self._run(input , context, kwargs)
@@ -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,62 @@
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 List, Optional, Type
11
+
12
+ from langchain.callbacks.manager import CallbackManagerForToolRun
13
+ from langchain.tools import BaseTool
14
+ from pydantic import BaseModel, PrivateAttr
15
+
16
+ from ...schemas.search_tool_schema import SearchToolConfig, SearchToolInput
17
+
18
+
19
+ class DuckDuckGoSearchTool(BaseTool):
20
+ """
21
+ Tool to search and get results using duckduckgo search engine
22
+
23
+ Examples:
24
+ Basic usage
25
+ .. code-block:: python
26
+
27
+ duckduckgosearch_tool = DuckDuckGoSearchTool()
28
+ duckduckgosearch_tool.invoke({"query":"What is RAG?"})
29
+ """
30
+ name: str = "duckduckgo_search_tool"
31
+ description: str = "Search using duckduckgo search engine and return the top-k results.Default :3"
32
+ args_schema: Type[BaseModel] = SearchToolInput
33
+ _top_k_results = PrivateAttr()
34
+
35
+ def __init__(self, **kwargs):
36
+ super().__init__(**kwargs)
37
+ from ibm_watsonx_gov.tools.utils.package_utils import \
38
+ install_and_import_packages
39
+
40
+ install_and_import_packages(["ddgs"])
41
+ config = SearchToolConfig(**kwargs)
42
+ self._top_k_results = config.top_k_results
43
+
44
+ def _run(self,
45
+ query: str,
46
+ top_k_results: int = None,
47
+ run_manager: Optional[CallbackManagerForToolRun] = None,
48
+ **kwargs) -> List[str]:
49
+ """Use DuckDuckGo Search and return the top-k results."""
50
+ if top_k_results is None:
51
+ top_k_results = self._top_k_results
52
+
53
+ from langchain_community.utilities import DuckDuckGoSearchAPIWrapper
54
+ results = DuckDuckGoSearchAPIWrapper().results(
55
+ query=query, max_results=top_k_results)
56
+
57
+ # Ensure results are in string format
58
+ if isinstance(results, list):
59
+ # Extract snippets
60
+ return [res["snippet"] for res in results if "snippet" in res]
61
+
62
+ return [str(results)] # Send list if the response is not a list
@@ -0,0 +1,105 @@
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
+
11
+ from typing import List, Optional, Type
12
+
13
+ import requests
14
+ from langchain.callbacks.manager import CallbackManagerForToolRun
15
+ from langchain.tools import BaseTool
16
+ from pydantic import BaseModel, PrivateAttr
17
+ from ibm_watsonx_gov.utils.python_utils import get
18
+ from ...schemas.search_tool_schema import GoogleSearchToolConfig, SearchToolInput
19
+
20
+
21
+ class GoogleSearchTool(BaseTool):
22
+ """
23
+ Tool to search and get results using google search engine
24
+
25
+ Examples:
26
+ Basic usage
27
+ .. code-block:: python
28
+
29
+ google_search_tool = GoogleSearchTool()
30
+ google_search_tool.invoke({"query":"What is RAG?"})
31
+ """
32
+ name: str = "google_search_tool"
33
+ description: str = (
34
+ "Search Google using SerpAPI and return top-k results, "
35
+ "Default top-k :3"
36
+ )
37
+ args_schema: Type[BaseModel] = SearchToolInput
38
+
39
+ _top_k_results: any = PrivateAttr()
40
+
41
+ _serpapi_key: str = PrivateAttr()
42
+
43
+ def __init__(self, **kwargs):
44
+ super().__init__(**kwargs)
45
+ self._headers = {"User-Agent": "Mozilla/5.0"}
46
+ from ibm_watsonx_gov.tools.utils.package_utils import \
47
+ install_and_import_packages
48
+
49
+ install_and_import_packages(["bs4", "google-search-results"])
50
+
51
+ # Load args into config
52
+ config = GoogleSearchToolConfig(**kwargs)
53
+ self._top_k_results = config.top_k_results
54
+ self._serpapi_key = config.serpapi_key
55
+
56
+
57
+ def _fetch_page_content(self, url: str, max_chars: int = 5000) -> str:
58
+ try:
59
+ from bs4 import BeautifulSoup
60
+ response = requests.get(url, timeout=10, headers={"User-Agent": "Mozilla/5.0"})
61
+ soup = BeautifulSoup(response.text, "html.parser")
62
+
63
+ # Remove JS scripts & css styles
64
+ for script in soup(["script", "style"]):
65
+ script.extract()
66
+
67
+ # Join text with newlines between paragraphs
68
+ paragraphs = [para.get_text(strip=True) for para in soup.find_all("p")]
69
+ text = "".join(paragraphs)
70
+
71
+ return text
72
+ except Exception as e:
73
+ print(f"Skipping {url}: {e}")
74
+ return ""
75
+
76
+ # Define Google Search Tool Without API Key
77
+ def _run(self,
78
+ query: str,
79
+ top_k_results: int = None,
80
+ run_manager: Optional[CallbackManagerForToolRun] = None,
81
+ **kwargs) -> List[str]:
82
+ """Performs a Google search and extracts content from the top results."""
83
+ from bs4 import BeautifulSoup
84
+ from serpapi import GoogleSearch
85
+
86
+ if top_k_results is None:
87
+ top_k_results = self._top_k_results
88
+
89
+ search_results = GoogleSearch({
90
+ "q": query,
91
+ "api_key": self._serpapi_key
92
+ })
93
+ search_results = search_results.get_dict()
94
+
95
+ organic_results = get(search_results, "organic_results", default=[])
96
+
97
+ results = []
98
+ for res in organic_results[:top_k_results]:
99
+ link = res.get("link")
100
+ if link:
101
+ # Extract text from the webpage
102
+ content = self._fetch_page_content(link)
103
+ results.append(content)
104
+
105
+ return results
@@ -0,0 +1,95 @@
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
+
11
+ from typing import Annotated, Any, Optional, Type
12
+
13
+ import requests
14
+ from langchain.tools import BaseTool
15
+ from pydantic import BaseModel, Field
16
+
17
+
18
+ class WeatherInput(BaseModel):
19
+ location: Annotated[str, Field(description="Name of the location")]
20
+ country: Annotated[Optional[str], Field(
21
+ description="Name of the country", default=None)]
22
+
23
+
24
+ class WeatherTool(BaseTool):
25
+ """
26
+ Tool for retrieving the weather of a location.
27
+
28
+ Examples:
29
+ Basic usage
30
+ .. code-block:: python
31
+
32
+ weather_tool = WeatherTool()
33
+ weather_tool.invoke({"location":"London"})
34
+ """
35
+
36
+ name: str = "weather_tool"
37
+ description: str = "Find the weather for a location or a city and country."
38
+ args_schema: Type[BaseModel] = WeatherInput
39
+
40
+ def _run(self, location: str, country: str = None, **kwargs: Any) -> Any:
41
+ """Performs weather search based on location and country"""
42
+
43
+ coordinates = self.__get_coordinates(location, country)
44
+ coord = f"latitude={coordinates['latitude']}&longitude={coordinates['longitude']}"
45
+ current = "current=temperature_2m,rain,relative_humidity_2m,wind_speed_10m"
46
+ url = f"https://api.open-meteo.com/v1/forecast?{coord}&{current}"
47
+ headers = {
48
+ "Content-Type": "application/json",
49
+ "Accept": "application/json"
50
+ }
51
+ response = requests.get(url, headers=headers)
52
+ if response.status_code >= 400:
53
+ raise Exception(
54
+ f"Unexpected response from Weather tool {response.text}")
55
+
56
+ response_json = response.json()
57
+
58
+ fullLocation = location
59
+ if country:
60
+ fullLocation = f"{fullLocation}, {country}"
61
+
62
+ current = response_json['current']
63
+ current_units = response_json['current_units']
64
+ result = f"""Current weather in {fullLocation}
65
+ Temperature: {current['temperature_2m']}{current_units['temperature_2m']}
66
+ Rain: {current['rain']}{current_units['rain']}
67
+ Relative humidity: {current['relative_humidity_2m']}{current_units['relative_humidity_2m']}
68
+ Wind: {current['wind_speed_10m']}{current_units['wind_speed_10m']}
69
+ """
70
+
71
+ return result
72
+
73
+ def __get_coordinates(self, location, country):
74
+ params = f"name={location}"
75
+ if country:
76
+ params = f"{params}&country={country}"
77
+
78
+ url = f"https://geocoding-api.open-meteo.com/v1/search?{params}&count=1&language=en&format=json"
79
+ headers = {
80
+ "Content-Type": "application/json",
81
+ "Accept": "application/json"
82
+ }
83
+ response = requests.get(url, headers=headers)
84
+ if response.status_code >= 400:
85
+ raise Exception(
86
+ f"Unable to get coordinates for location from Weather tool {response.text}")
87
+
88
+ results = response.json()
89
+ if "results" not in results:
90
+ raise Exception(
91
+ "Unable to find weather for location {}.".format(location))
92
+ return {
93
+ "latitude": results["results"][0]["latitude"],
94
+ "longitude": results["results"][0]["longitude"]
95
+ }
@@ -0,0 +1,69 @@
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
+
11
+ import json
12
+ import re
13
+ from typing import Annotated, Any, Optional, Type
14
+
15
+ import requests
16
+ from langchain.tools import BaseTool
17
+ from pydantic import BaseModel, Field
18
+
19
+
20
+ class WebCrawlerInput(BaseModel):
21
+ url: Annotated[str, Field(description="Url of the website")]
22
+
23
+
24
+ class WebCrawlerTool(BaseTool):
25
+ """
26
+ Tool for retrieving the content of the web url.
27
+
28
+ Examples:
29
+ Basic usage
30
+ .. code-block:: python
31
+
32
+ crawler_tool = WebCrawlerTool()
33
+ crawler_tool.invoke({"url":"https://edition.cnn.com/2025/03/31/sport/torpedo-bats-mlb-yankees-explained-spt/index.html"})
34
+ """
35
+ name: str = "webcrawler_tool"
36
+ description: str = "Retrieve the content of the Web url. Do not use for Web search."
37
+ args_schema: Type[BaseModel] = WebCrawlerInput
38
+
39
+ def __init__(self, **kwargs):
40
+ super().__init__(**kwargs)
41
+ from ibm_watsonx_gov.tools.utils.package_utils import \
42
+ install_and_import_packages
43
+
44
+ install_and_import_packages(["bs4"])
45
+
46
+ def _run(self, url: str, **kwargs: Any) -> Any:
47
+ """Retrieve the content of the Web url."""
48
+
49
+ from bs4 import BeautifulSoup
50
+ url_pattern = "^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$"
51
+ pattern = re.compile(url_pattern)
52
+ if not pattern.match(url):
53
+ raise Exception("Invalid URL passed to WebCrawlerTool ")
54
+
55
+ headers = {
56
+ "Content-Type": "application/json",
57
+ "Accept": "application/json"
58
+ }
59
+ try:
60
+ response = requests.get(url, headers=headers)
61
+ except:
62
+ raise Exception(
63
+ f"Unable to connect to {url}. Check the url")
64
+ if response.status_code >= 400:
65
+ raise Exception(
66
+ f"Unexpected response from WebCrawlerTool {response.text}")
67
+
68
+ soup = BeautifulSoup(response.text, "html.parser")
69
+ return soup.get_text()
@@ -0,0 +1,63 @@
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
+
11
+ from typing import List, Optional, Type
12
+
13
+ from langchain.callbacks.manager import CallbackManagerForToolRun
14
+ from langchain.tools import BaseTool
15
+ from langchain_community.utilities import WikipediaAPIWrapper
16
+ from pydantic import BaseModel, PrivateAttr
17
+
18
+ from ...schemas.search_tool_schema import SearchToolConfig, SearchToolInput
19
+
20
+
21
+ # Create a wrapper to call the tool
22
+ class WikiPediaSearchTool(BaseTool):
23
+ """
24
+ Tool to search and get results using wikipedia search
25
+
26
+ Examples:
27
+ Basic usage
28
+ .. code-block:: python
29
+
30
+ wikipedia_search_tool = WikiPediaSearchTool()
31
+ wikipedia_search_tool.invoke({"query":"What is RAG?"})
32
+ """
33
+ name: str = "wikipedia_search_tool"
34
+ description: str = "Search Wikipedia and return the top-k results.Default :3"
35
+ args_schema: Type[BaseModel] = SearchToolInput
36
+
37
+ _top_k_results: any = PrivateAttr()
38
+
39
+ def __init__(self, **kwargs):
40
+ super().__init__(**kwargs)
41
+ from ibm_watsonx_gov.tools.utils.package_utils import \
42
+ install_and_import_packages
43
+ install_and_import_packages(["wikipedia"])
44
+
45
+ config = SearchToolConfig(**kwargs)
46
+ self._top_k_results = config.top_k_results
47
+
48
+ def _run(self,
49
+ query: str,
50
+ top_k_results: int = None,
51
+ run_manager: Optional[CallbackManagerForToolRun] = None,
52
+ **kwargs) -> List[str]:
53
+
54
+ if top_k_results is None:
55
+ top_k_results = self._top_k_results
56
+
57
+ search_results = WikipediaAPIWrapper(
58
+ top_k_results=top_k_results).run(query)
59
+
60
+ # return search_results
61
+ results = [para.strip()
62
+ for para in search_results.split("\n\n") if para.strip()]
63
+ return results
@@ -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
+ # ----------------------------------------------------------------------------------------------------