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.
- ibm_watsonx_gov/__init__.py +8 -0
- ibm_watsonx_gov/agent_catalog/__init__.py +8 -0
- ibm_watsonx_gov/agent_catalog/clients/__init__.py +14 -0
- ibm_watsonx_gov/agent_catalog/clients/ai_agent_client.py +333 -0
- ibm_watsonx_gov/agent_catalog/core/__init__.py +8 -0
- ibm_watsonx_gov/agent_catalog/core/agent_loader.py +202 -0
- ibm_watsonx_gov/agent_catalog/core/agents.py +134 -0
- ibm_watsonx_gov/agent_catalog/entities/__init__.py +8 -0
- ibm_watsonx_gov/agent_catalog/entities/ai_agent.py +599 -0
- ibm_watsonx_gov/agent_catalog/utils/__init__.py +8 -0
- ibm_watsonx_gov/agent_catalog/utils/constants.py +36 -0
- ibm_watsonx_gov/agent_catalog/utils/notebook_utils.py +70 -0
- ibm_watsonx_gov/ai_experiments/__init__.py +8 -0
- ibm_watsonx_gov/ai_experiments/ai_experiments_client.py +980 -0
- ibm_watsonx_gov/ai_experiments/utils/__init__.py +8 -0
- ibm_watsonx_gov/ai_experiments/utils/ai_experiment_utils.py +139 -0
- ibm_watsonx_gov/clients/__init__.py +0 -0
- ibm_watsonx_gov/clients/api_client.py +99 -0
- ibm_watsonx_gov/clients/segment_client.py +46 -0
- ibm_watsonx_gov/clients/usage_client.cpython-313-darwin.so +0 -0
- ibm_watsonx_gov/clients/wx_ai_client.py +87 -0
- ibm_watsonx_gov/config/__init__.py +14 -0
- ibm_watsonx_gov/config/agentic_ai_configuration.py +225 -0
- ibm_watsonx_gov/config/gen_ai_configuration.py +129 -0
- ibm_watsonx_gov/config/model_risk_configuration.py +173 -0
- ibm_watsonx_gov/config/predictive_ai_configuration.py +20 -0
- ibm_watsonx_gov/entities/__init__.py +8 -0
- ibm_watsonx_gov/entities/agentic_app.py +209 -0
- ibm_watsonx_gov/entities/agentic_evaluation_result.py +185 -0
- ibm_watsonx_gov/entities/ai_evaluation.py +290 -0
- ibm_watsonx_gov/entities/ai_experiment.py +419 -0
- ibm_watsonx_gov/entities/base_classes.py +134 -0
- ibm_watsonx_gov/entities/container.py +54 -0
- ibm_watsonx_gov/entities/credentials.py +633 -0
- ibm_watsonx_gov/entities/criteria.py +508 -0
- ibm_watsonx_gov/entities/enums.py +274 -0
- ibm_watsonx_gov/entities/evaluation_result.py +444 -0
- ibm_watsonx_gov/entities/foundation_model.py +490 -0
- ibm_watsonx_gov/entities/llm_judge.py +44 -0
- ibm_watsonx_gov/entities/locale.py +17 -0
- ibm_watsonx_gov/entities/mapping.py +49 -0
- ibm_watsonx_gov/entities/metric.py +211 -0
- ibm_watsonx_gov/entities/metric_threshold.py +36 -0
- ibm_watsonx_gov/entities/model_provider.py +329 -0
- ibm_watsonx_gov/entities/model_risk_result.py +43 -0
- ibm_watsonx_gov/entities/monitor.py +71 -0
- ibm_watsonx_gov/entities/prompt_setup.py +40 -0
- ibm_watsonx_gov/entities/state.py +22 -0
- ibm_watsonx_gov/entities/utils.py +99 -0
- ibm_watsonx_gov/evaluators/__init__.py +26 -0
- ibm_watsonx_gov/evaluators/agentic_evaluator.py +2725 -0
- ibm_watsonx_gov/evaluators/agentic_traces_evaluator.py +115 -0
- ibm_watsonx_gov/evaluators/base_evaluator.py +22 -0
- ibm_watsonx_gov/evaluators/impl/__init__.py +0 -0
- ibm_watsonx_gov/evaluators/impl/evaluate_metrics_impl.cpython-313-darwin.so +0 -0
- ibm_watsonx_gov/evaluators/impl/evaluate_model_risk_impl.cpython-313-darwin.so +0 -0
- ibm_watsonx_gov/evaluators/metrics_evaluator.py +187 -0
- ibm_watsonx_gov/evaluators/model_risk_evaluator.py +89 -0
- ibm_watsonx_gov/evaluators/traces_evaluator.py +93 -0
- ibm_watsonx_gov/metric_groups/answer_quality/answer_quality_decorator.py +66 -0
- ibm_watsonx_gov/metric_groups/content_safety/content_safety_decorator.py +76 -0
- ibm_watsonx_gov/metric_groups/readability/readability_decorator.py +59 -0
- ibm_watsonx_gov/metric_groups/retrieval_quality/retrieval_quality_decorator.py +63 -0
- ibm_watsonx_gov/metric_groups/usage/usage_decorator.py +58 -0
- ibm_watsonx_gov/metrics/__init__.py +74 -0
- ibm_watsonx_gov/metrics/answer_relevance/__init__.py +8 -0
- ibm_watsonx_gov/metrics/answer_relevance/answer_relevance_decorator.py +63 -0
- ibm_watsonx_gov/metrics/answer_relevance/answer_relevance_metric.py +260 -0
- ibm_watsonx_gov/metrics/answer_similarity/__init__.py +0 -0
- ibm_watsonx_gov/metrics/answer_similarity/answer_similarity_decorator.py +66 -0
- ibm_watsonx_gov/metrics/answer_similarity/answer_similarity_metric.py +219 -0
- ibm_watsonx_gov/metrics/average_precision/__init__.py +0 -0
- ibm_watsonx_gov/metrics/average_precision/average_precision_decorator.py +62 -0
- ibm_watsonx_gov/metrics/average_precision/average_precision_metric.py +174 -0
- ibm_watsonx_gov/metrics/base_metric_decorator.py +193 -0
- ibm_watsonx_gov/metrics/context_relevance/__init__.py +8 -0
- ibm_watsonx_gov/metrics/context_relevance/context_relevance_decorator.py +60 -0
- ibm_watsonx_gov/metrics/context_relevance/context_relevance_metric.py +414 -0
- ibm_watsonx_gov/metrics/cost/__init__.py +8 -0
- ibm_watsonx_gov/metrics/cost/cost_decorator.py +58 -0
- ibm_watsonx_gov/metrics/cost/cost_metric.py +155 -0
- ibm_watsonx_gov/metrics/duration/__init__.py +8 -0
- ibm_watsonx_gov/metrics/duration/duration_decorator.py +59 -0
- ibm_watsonx_gov/metrics/duration/duration_metric.py +111 -0
- ibm_watsonx_gov/metrics/evasiveness/__init__.py +8 -0
- ibm_watsonx_gov/metrics/evasiveness/evasiveness_decorator.py +61 -0
- ibm_watsonx_gov/metrics/evasiveness/evasiveness_metric.py +103 -0
- ibm_watsonx_gov/metrics/faithfulness/__init__.py +8 -0
- ibm_watsonx_gov/metrics/faithfulness/faithfulness_decorator.py +65 -0
- ibm_watsonx_gov/metrics/faithfulness/faithfulness_metric.py +254 -0
- ibm_watsonx_gov/metrics/hap/__init__.py +16 -0
- ibm_watsonx_gov/metrics/hap/hap_decorator.py +58 -0
- ibm_watsonx_gov/metrics/hap/hap_metric.py +98 -0
- ibm_watsonx_gov/metrics/hap/input_hap_metric.py +104 -0
- ibm_watsonx_gov/metrics/hap/output_hap_metric.py +110 -0
- ibm_watsonx_gov/metrics/harm/__init__.py +8 -0
- ibm_watsonx_gov/metrics/harm/harm_decorator.py +60 -0
- ibm_watsonx_gov/metrics/harm/harm_metric.py +103 -0
- ibm_watsonx_gov/metrics/harm_engagement/__init__.py +8 -0
- ibm_watsonx_gov/metrics/harm_engagement/harm_engagement_decorator.py +61 -0
- ibm_watsonx_gov/metrics/harm_engagement/harm_engagement_metric.py +103 -0
- ibm_watsonx_gov/metrics/hit_rate/__init__.py +0 -0
- ibm_watsonx_gov/metrics/hit_rate/hit_rate_decorator.py +59 -0
- ibm_watsonx_gov/metrics/hit_rate/hit_rate_metric.py +167 -0
- ibm_watsonx_gov/metrics/input_token_count/__init__.py +8 -0
- ibm_watsonx_gov/metrics/input_token_count/input_token_count_decorator.py +58 -0
- ibm_watsonx_gov/metrics/input_token_count/input_token_count_metric.py +112 -0
- ibm_watsonx_gov/metrics/jailbreak/__init__.py +8 -0
- ibm_watsonx_gov/metrics/jailbreak/jailbreak_decorator.py +60 -0
- ibm_watsonx_gov/metrics/jailbreak/jailbreak_metric.py +103 -0
- ibm_watsonx_gov/metrics/keyword_detection/keyword_detection_decorator.py +58 -0
- ibm_watsonx_gov/metrics/keyword_detection/keyword_detection_metric.py +111 -0
- ibm_watsonx_gov/metrics/llm_validation/__init__.py +8 -0
- ibm_watsonx_gov/metrics/llm_validation/evaluation_criteria.py +84 -0
- ibm_watsonx_gov/metrics/llm_validation/llm_validation_constants.py +24 -0
- ibm_watsonx_gov/metrics/llm_validation/llm_validation_decorator.py +54 -0
- ibm_watsonx_gov/metrics/llm_validation/llm_validation_impl.py +525 -0
- ibm_watsonx_gov/metrics/llm_validation/llm_validation_metric.py +258 -0
- ibm_watsonx_gov/metrics/llm_validation/llm_validation_prompts.py +106 -0
- ibm_watsonx_gov/metrics/llmaj/__init__.py +0 -0
- ibm_watsonx_gov/metrics/llmaj/llmaj_metric.py +298 -0
- ibm_watsonx_gov/metrics/ndcg/__init__.py +0 -0
- ibm_watsonx_gov/metrics/ndcg/ndcg_decorator.py +61 -0
- ibm_watsonx_gov/metrics/ndcg/ndcg_metric.py +166 -0
- ibm_watsonx_gov/metrics/output_token_count/__init__.py +8 -0
- ibm_watsonx_gov/metrics/output_token_count/output_token_count_decorator.py +58 -0
- ibm_watsonx_gov/metrics/output_token_count/output_token_count_metric.py +112 -0
- ibm_watsonx_gov/metrics/pii/__init__.py +16 -0
- ibm_watsonx_gov/metrics/pii/input_pii_metric.py +102 -0
- ibm_watsonx_gov/metrics/pii/output_pii_metric.py +107 -0
- ibm_watsonx_gov/metrics/pii/pii_decorator.py +59 -0
- ibm_watsonx_gov/metrics/pii/pii_metric.py +96 -0
- ibm_watsonx_gov/metrics/profanity/__init__.py +8 -0
- ibm_watsonx_gov/metrics/profanity/profanity_decorator.py +60 -0
- ibm_watsonx_gov/metrics/profanity/profanity_metric.py +103 -0
- ibm_watsonx_gov/metrics/prompt_safety_risk/__init__.py +8 -0
- ibm_watsonx_gov/metrics/prompt_safety_risk/prompt_safety_risk_decorator.py +57 -0
- ibm_watsonx_gov/metrics/prompt_safety_risk/prompt_safety_risk_metric.py +128 -0
- ibm_watsonx_gov/metrics/reciprocal_rank/__init__.py +0 -0
- ibm_watsonx_gov/metrics/reciprocal_rank/reciprocal_rank_decorator.py +62 -0
- ibm_watsonx_gov/metrics/reciprocal_rank/reciprocal_rank_metric.py +162 -0
- ibm_watsonx_gov/metrics/regex_detection/regex_detection_decorator.py +58 -0
- ibm_watsonx_gov/metrics/regex_detection/regex_detection_metric.py +106 -0
- ibm_watsonx_gov/metrics/retrieval_precision/__init__.py +0 -0
- ibm_watsonx_gov/metrics/retrieval_precision/retrieval_precision_decorator.py +62 -0
- ibm_watsonx_gov/metrics/retrieval_precision/retrieval_precision_metric.py +170 -0
- ibm_watsonx_gov/metrics/sexual_content/__init__.py +8 -0
- ibm_watsonx_gov/metrics/sexual_content/sexual_content_decorator.py +61 -0
- ibm_watsonx_gov/metrics/sexual_content/sexual_content_metric.py +103 -0
- ibm_watsonx_gov/metrics/social_bias/__init__.py +8 -0
- ibm_watsonx_gov/metrics/social_bias/social_bias_decorator.py +62 -0
- ibm_watsonx_gov/metrics/social_bias/social_bias_metric.py +103 -0
- ibm_watsonx_gov/metrics/status/__init__.py +0 -0
- ibm_watsonx_gov/metrics/status/status_metric.py +113 -0
- ibm_watsonx_gov/metrics/text_grade_level/__init__.py +8 -0
- ibm_watsonx_gov/metrics/text_grade_level/text_grade_level_decorator.py +59 -0
- ibm_watsonx_gov/metrics/text_grade_level/text_grade_level_metric.py +127 -0
- ibm_watsonx_gov/metrics/text_reading_ease/__init__.py +8 -0
- ibm_watsonx_gov/metrics/text_reading_ease/text_reading_ease_decorator.py +59 -0
- ibm_watsonx_gov/metrics/text_reading_ease/text_reading_ease_metric.py +123 -0
- ibm_watsonx_gov/metrics/tool_call_accuracy/__init__.py +0 -0
- ibm_watsonx_gov/metrics/tool_call_accuracy/tool_call_accuracy_decorator.py +67 -0
- ibm_watsonx_gov/metrics/tool_call_accuracy/tool_call_accuracy_metric.py +162 -0
- ibm_watsonx_gov/metrics/tool_call_parameter_accuracy/__init__.py +0 -0
- ibm_watsonx_gov/metrics/tool_call_parameter_accuracy/tool_call_parameter_accuracy_decorator.py +68 -0
- ibm_watsonx_gov/metrics/tool_call_parameter_accuracy/tool_call_parameter_accuracy_metric.py +151 -0
- ibm_watsonx_gov/metrics/tool_call_relevance/__init__.py +0 -0
- ibm_watsonx_gov/metrics/tool_call_relevance/tool_call_relevance_decorator.py +71 -0
- ibm_watsonx_gov/metrics/tool_call_relevance/tool_call_relevance_metric.py +166 -0
- ibm_watsonx_gov/metrics/tool_call_syntactic_accuracy/__init__.py +0 -0
- ibm_watsonx_gov/metrics/tool_call_syntactic_accuracy/tool_call_syntactic_accuracy_decorator.py +66 -0
- ibm_watsonx_gov/metrics/tool_call_syntactic_accuracy/tool_call_syntactic_accuracy_metric.py +121 -0
- ibm_watsonx_gov/metrics/topic_relevance/__init__.py +8 -0
- ibm_watsonx_gov/metrics/topic_relevance/topic_relevance_decorator.py +57 -0
- ibm_watsonx_gov/metrics/topic_relevance/topic_relevance_metric.py +106 -0
- ibm_watsonx_gov/metrics/unethical_behavior/__init__.py +8 -0
- ibm_watsonx_gov/metrics/unethical_behavior/unethical_behavior_decorator.py +61 -0
- ibm_watsonx_gov/metrics/unethical_behavior/unethical_behavior_metric.py +103 -0
- ibm_watsonx_gov/metrics/unsuccessful_requests/__init__.py +0 -0
- ibm_watsonx_gov/metrics/unsuccessful_requests/unsuccessful_requests_decorator.py +66 -0
- ibm_watsonx_gov/metrics/unsuccessful_requests/unsuccessful_requests_metric.py +128 -0
- ibm_watsonx_gov/metrics/user_id/__init__.py +0 -0
- ibm_watsonx_gov/metrics/user_id/user_id_metric.py +111 -0
- ibm_watsonx_gov/metrics/utils.py +440 -0
- ibm_watsonx_gov/metrics/violence/__init__.py +8 -0
- ibm_watsonx_gov/metrics/violence/violence_decorator.py +60 -0
- ibm_watsonx_gov/metrics/violence/violence_metric.py +103 -0
- ibm_watsonx_gov/prompt_evaluator/__init__.py +9 -0
- ibm_watsonx_gov/prompt_evaluator/impl/__init__.py +8 -0
- ibm_watsonx_gov/prompt_evaluator/impl/prompt_evaluator_impl.py +554 -0
- ibm_watsonx_gov/prompt_evaluator/impl/pta_lifecycle_evaluator.py +2332 -0
- ibm_watsonx_gov/prompt_evaluator/prompt_evaluator.py +262 -0
- ibm_watsonx_gov/providers/__init__.py +8 -0
- ibm_watsonx_gov/providers/detectors_provider.cpython-313-darwin.so +0 -0
- ibm_watsonx_gov/providers/detectors_provider.py +415 -0
- ibm_watsonx_gov/providers/eval_assist_provider.cpython-313-darwin.so +0 -0
- ibm_watsonx_gov/providers/eval_assist_provider.py +266 -0
- ibm_watsonx_gov/providers/inference_engines/__init__.py +0 -0
- ibm_watsonx_gov/providers/inference_engines/custom_inference_engine.py +165 -0
- ibm_watsonx_gov/providers/inference_engines/portkey_inference_engine.py +57 -0
- ibm_watsonx_gov/providers/llmevalkit/__init__.py +0 -0
- ibm_watsonx_gov/providers/llmevalkit/ciso_agent/main.py +516 -0
- ibm_watsonx_gov/providers/llmevalkit/ciso_agent/preprocess_log.py +111 -0
- ibm_watsonx_gov/providers/llmevalkit/ciso_agent/utils.py +186 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/README.md +411 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/__init__.py +27 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/README.md +306 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/__init__.py +89 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/__init__.py +30 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/base.py +411 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/code_agent.py +1254 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/exact_match.py +134 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/fuzzy_string.py +104 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/hybrid.py +516 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/comparators/llm_judge.py +1882 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/pipeline.py +387 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/types.py +178 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/comparison/utils.py +298 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/consts.py +33 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/__init__.py +31 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/base.py +26 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_call/__init__.py +4 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_call/general.py +46 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_call/general_metrics.json +783 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_call/general_metrics_runtime.json +580 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_selection/__init__.py +6 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_selection/function_selection.py +28 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_selection/function_selection_metrics.json +599 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/function_selection/function_selection_metrics_runtime.json +477 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/loader.py +259 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/parameter/__init__.py +7 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/parameter/parameter.py +52 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/parameter/parameter_metrics.json +613 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/parameter/parameter_metrics_runtime.json +489 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/trajectory/__init__.py +7 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/trajectory/trajectory.py +43 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/metrics/trajectory/trajectory_metrics.json +161 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/__init__.py +0 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/adapters.py +102 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/pipeline.py +355 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/semantic_checker.py +816 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/static_checker.py +297 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/transformation_prompts.py +509 -0
- ibm_watsonx_gov/providers/llmevalkit/function_calling/pipeline/types.py +596 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/README.md +375 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/__init__.py +137 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/base.py +426 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/output_parser.py +364 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/__init__.py +0 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/consts.py +7 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/ibm_watsonx_ai/__init__.py +0 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/ibm_watsonx_ai/ibm_watsonx_ai.py +656 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/litellm/__init__.py +0 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/litellm/litellm.py +509 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/litellm/rits.py +224 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/litellm/watsonx.py +60 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/mock_llm_client.py +75 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/openai/__init__.py +0 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/openai/openai.py +639 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/wxo_ai_gateway/__init__.py +0 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/wxo_ai_gateway/wxo_ai_gateway.py +134 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/providers/wxo_ai_gateway/wxo_ai_gateway_inference.py +214 -0
- ibm_watsonx_gov/providers/llmevalkit/llm/types.py +136 -0
- ibm_watsonx_gov/providers/llmevalkit/metrics/__init__.py +4 -0
- ibm_watsonx_gov/providers/llmevalkit/metrics/field.py +255 -0
- ibm_watsonx_gov/providers/llmevalkit/metrics/metric.py +332 -0
- ibm_watsonx_gov/providers/llmevalkit/metrics/metrics_runner.py +188 -0
- ibm_watsonx_gov/providers/llmevalkit/metrics/prompt.py +403 -0
- ibm_watsonx_gov/providers/llmevalkit/metrics/utils.py +46 -0
- ibm_watsonx_gov/providers/llmevalkit/prompt/__init__.py +0 -0
- ibm_watsonx_gov/providers/llmevalkit/prompt/runner.py +144 -0
- ibm_watsonx_gov/providers/tool_call_metric_provider.py +455 -0
- ibm_watsonx_gov/providers/unitxt_provider.cpython-313-darwin.so +0 -0
- ibm_watsonx_gov/tools/__init__.py +10 -0
- ibm_watsonx_gov/tools/clients/__init__.py +11 -0
- ibm_watsonx_gov/tools/clients/ai_tool_client.py +405 -0
- ibm_watsonx_gov/tools/clients/detector_client.py +82 -0
- ibm_watsonx_gov/tools/core/__init__.py +8 -0
- ibm_watsonx_gov/tools/core/tool_loader.py +237 -0
- ibm_watsonx_gov/tools/entities/__init__.py +8 -0
- ibm_watsonx_gov/tools/entities/ai_tools.py +435 -0
- ibm_watsonx_gov/tools/onboarding/create/answer_relevance_detector.json +57 -0
- ibm_watsonx_gov/tools/onboarding/create/chromadb_retrieval_tool.json +63 -0
- ibm_watsonx_gov/tools/onboarding/create/context_relevance_detector.json +57 -0
- ibm_watsonx_gov/tools/onboarding/create/duduckgo_search_tool.json +53 -0
- ibm_watsonx_gov/tools/onboarding/create/google_search_tool.json +62 -0
- ibm_watsonx_gov/tools/onboarding/create/hap_detector.json +70 -0
- ibm_watsonx_gov/tools/onboarding/create/jailbreak_detector.json +70 -0
- ibm_watsonx_gov/tools/onboarding/create/pii_detector.json +36 -0
- ibm_watsonx_gov/tools/onboarding/create/prompt_safety_risk_detector.json +69 -0
- ibm_watsonx_gov/tools/onboarding/create/topic_relevance_detector.json +57 -0
- ibm_watsonx_gov/tools/onboarding/create/weather_tool.json +39 -0
- ibm_watsonx_gov/tools/onboarding/create/webcrawler_tool.json +34 -0
- ibm_watsonx_gov/tools/onboarding/create/wikipedia_search_tool.json +53 -0
- ibm_watsonx_gov/tools/onboarding/delete/delete_tools.json +4 -0
- ibm_watsonx_gov/tools/onboarding/update/google_search_tool.json +38 -0
- ibm_watsonx_gov/tools/ootb/__init__.py +8 -0
- ibm_watsonx_gov/tools/ootb/detectors/__init__.py +8 -0
- ibm_watsonx_gov/tools/ootb/detectors/hap_detector_tool.py +109 -0
- ibm_watsonx_gov/tools/ootb/detectors/jailbreak_detector_tool.py +104 -0
- ibm_watsonx_gov/tools/ootb/detectors/pii_detector_tool.py +83 -0
- ibm_watsonx_gov/tools/ootb/detectors/prompt_safety_risk_detector_tool.py +111 -0
- ibm_watsonx_gov/tools/ootb/detectors/topic_relevance_detector_tool.py +101 -0
- ibm_watsonx_gov/tools/ootb/rag/__init__.py +8 -0
- ibm_watsonx_gov/tools/ootb/rag/answer_relevance_detector_tool.py +119 -0
- ibm_watsonx_gov/tools/ootb/rag/context_relevance_detector_tool.py +118 -0
- ibm_watsonx_gov/tools/ootb/search/__init__.py +8 -0
- ibm_watsonx_gov/tools/ootb/search/duckduckgo_search_tool.py +62 -0
- ibm_watsonx_gov/tools/ootb/search/google_search_tool.py +105 -0
- ibm_watsonx_gov/tools/ootb/search/weather_tool.py +95 -0
- ibm_watsonx_gov/tools/ootb/search/web_crawler_tool.py +69 -0
- ibm_watsonx_gov/tools/ootb/search/wikipedia_search_tool.py +63 -0
- ibm_watsonx_gov/tools/ootb/vectordb/__init__.py +8 -0
- ibm_watsonx_gov/tools/ootb/vectordb/chromadb_retriever_tool.py +111 -0
- ibm_watsonx_gov/tools/rest_api/__init__.py +10 -0
- ibm_watsonx_gov/tools/rest_api/restapi_tool.py +72 -0
- ibm_watsonx_gov/tools/schemas/__init__.py +10 -0
- ibm_watsonx_gov/tools/schemas/search_tool_schema.py +46 -0
- ibm_watsonx_gov/tools/schemas/vectordb_retrieval_schema.py +55 -0
- ibm_watsonx_gov/tools/utils/__init__.py +14 -0
- ibm_watsonx_gov/tools/utils/constants.py +69 -0
- ibm_watsonx_gov/tools/utils/display_utils.py +38 -0
- ibm_watsonx_gov/tools/utils/environment.py +108 -0
- ibm_watsonx_gov/tools/utils/package_utils.py +40 -0
- ibm_watsonx_gov/tools/utils/platform_url_mapping.cpython-313-darwin.so +0 -0
- ibm_watsonx_gov/tools/utils/python_utils.py +68 -0
- ibm_watsonx_gov/tools/utils/tool_utils.py +206 -0
- ibm_watsonx_gov/traces/__init__.py +8 -0
- ibm_watsonx_gov/traces/span_exporter.py +195 -0
- ibm_watsonx_gov/traces/span_node.py +251 -0
- ibm_watsonx_gov/traces/span_util.py +153 -0
- ibm_watsonx_gov/traces/trace_utils.py +1074 -0
- ibm_watsonx_gov/utils/__init__.py +8 -0
- ibm_watsonx_gov/utils/aggregation_util.py +346 -0
- ibm_watsonx_gov/utils/async_util.py +62 -0
- ibm_watsonx_gov/utils/authenticator.py +144 -0
- ibm_watsonx_gov/utils/constants.py +15 -0
- ibm_watsonx_gov/utils/errors.py +40 -0
- ibm_watsonx_gov/utils/gov_sdk_logger.py +39 -0
- ibm_watsonx_gov/utils/insights_generator.py +1285 -0
- ibm_watsonx_gov/utils/python_utils.py +425 -0
- ibm_watsonx_gov/utils/rest_util.py +73 -0
- ibm_watsonx_gov/utils/segment_batch_manager.py +162 -0
- ibm_watsonx_gov/utils/singleton_meta.py +25 -0
- ibm_watsonx_gov/utils/url_mapping.cpython-313-darwin.so +0 -0
- ibm_watsonx_gov/utils/validation_util.py +126 -0
- ibm_watsonx_gov/visualizations/__init__.py +13 -0
- ibm_watsonx_gov/visualizations/metric_descriptions.py +57 -0
- ibm_watsonx_gov/visualizations/model_insights.py +1304 -0
- ibm_watsonx_gov/visualizations/visualization_utils.py +75 -0
- ibm_watsonx_gov-1.3.3.dist-info/METADATA +93 -0
- ibm_watsonx_gov-1.3.3.dist-info/RECORD +353 -0
- 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
|
+
# ----------------------------------------------------------------------------------------------------
|