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,364 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import json
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import (
|
|
5
|
+
Any,
|
|
6
|
+
Dict,
|
|
7
|
+
List,
|
|
8
|
+
Optional,
|
|
9
|
+
Type,
|
|
10
|
+
TypeVar,
|
|
11
|
+
Union,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
import jsonschema
|
|
16
|
+
except ImportError:
|
|
17
|
+
jsonschema = None
|
|
18
|
+
|
|
19
|
+
from pydantic import (
|
|
20
|
+
BaseModel,
|
|
21
|
+
create_model,
|
|
22
|
+
Field,
|
|
23
|
+
ValidationError as PydanticValidationError,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
from .base import LLMClient
|
|
27
|
+
|
|
28
|
+
T = TypeVar("T")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def json_schema_to_pydantic_model(
|
|
32
|
+
schema: Dict[str, Any], model_name: str = "AutoModel"
|
|
33
|
+
) -> Type[BaseModel]:
|
|
34
|
+
fields = {}
|
|
35
|
+
required_fields = set(schema.get("required", []))
|
|
36
|
+
properties = schema.get("properties", {})
|
|
37
|
+
|
|
38
|
+
# Validate that all required fields exist in properties
|
|
39
|
+
missing_properties = required_fields - set(properties.keys())
|
|
40
|
+
if missing_properties:
|
|
41
|
+
raise ValueError(
|
|
42
|
+
f"Required fields {missing_properties} are not defined in properties"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
# Validate that all properties are covered in required (for Azure OpenAI compliance)
|
|
46
|
+
all_property_keys = set(properties.keys())
|
|
47
|
+
schema = dict(schema) # Make a copy
|
|
48
|
+
schema["required"] = list(all_property_keys)
|
|
49
|
+
|
|
50
|
+
type_mapping = {
|
|
51
|
+
"string": str,
|
|
52
|
+
"integer": int,
|
|
53
|
+
"number": float,
|
|
54
|
+
"boolean": bool,
|
|
55
|
+
"array": list,
|
|
56
|
+
"object": dict,
|
|
57
|
+
"null": type(None),
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
def parse_type(type_def: Union[str, List[str]]) -> Type[T]:
|
|
61
|
+
if isinstance(type_def, list):
|
|
62
|
+
python_types = [type_mapping.get(t, Any) for t in type_def]
|
|
63
|
+
if type(None) in python_types:
|
|
64
|
+
python_types.remove(type(None))
|
|
65
|
+
if len(python_types) == 1:
|
|
66
|
+
return Optional[python_types[0]]
|
|
67
|
+
else:
|
|
68
|
+
return Optional[Union[tuple(python_types)]]
|
|
69
|
+
else:
|
|
70
|
+
return Union[tuple(python_types)]
|
|
71
|
+
else:
|
|
72
|
+
return type_mapping.get(type_def, Any)
|
|
73
|
+
|
|
74
|
+
for prop_name, prop_schema in properties.items():
|
|
75
|
+
field_type = parse_type(prop_schema.get("type"))
|
|
76
|
+
default = prop_schema.get("default", None)
|
|
77
|
+
description = prop_schema.get("description", None)
|
|
78
|
+
field_args = {"description": description} if description else {}
|
|
79
|
+
fields[prop_name] = (field_type, Field(default, **field_args))
|
|
80
|
+
|
|
81
|
+
# Create the model with custom configuration
|
|
82
|
+
model = create_model(model_name, **fields)
|
|
83
|
+
|
|
84
|
+
return model
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class OutputValidationError(Exception):
|
|
88
|
+
"""Raised when LLM output cannot be validated against the provided schema."""
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class ValidatingLLMClient(LLMClient, ABC):
|
|
92
|
+
"""
|
|
93
|
+
An LLMClient wrapper enforcing output structure via:
|
|
94
|
+
- JSON Schema (dict),
|
|
95
|
+
- Pydantic model (BaseModel subclass),
|
|
96
|
+
- or Python built-in types (int, float, str, bool, list, dict).
|
|
97
|
+
|
|
98
|
+
Features:
|
|
99
|
+
- Injects a system-level prompt describing the required format.
|
|
100
|
+
- Cleans raw responses (strips Markdown, extracts JSON).
|
|
101
|
+
- Validates and parses the response.
|
|
102
|
+
- Retries only invalid items (single or batch) up to `retries` times.
|
|
103
|
+
- Falls back to single-item loops if no batch method is configured.
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
@classmethod
|
|
107
|
+
@abstractmethod
|
|
108
|
+
def provider_class(cls) -> Type:
|
|
109
|
+
"""Return the underlying SDK client class, e.g. openai.OpenAI."""
|
|
110
|
+
|
|
111
|
+
@abstractmethod
|
|
112
|
+
def _register_methods(self) -> None:
|
|
113
|
+
"""
|
|
114
|
+
Register MethodConfig entries:
|
|
115
|
+
self.set_method_config("text", ...),
|
|
116
|
+
self.set_method_config("chat", ...),
|
|
117
|
+
self.set_method_config("text_async", ...),
|
|
118
|
+
self.set_method_config("chat_async", ...),
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
def _make_instruction(
|
|
122
|
+
self, schema: Union[Dict[str, Any], Type[BaseModel], Type]
|
|
123
|
+
) -> str:
|
|
124
|
+
"""Produce a clear instruction describing exactly the required output format."""
|
|
125
|
+
if isinstance(schema, dict):
|
|
126
|
+
schema_json = json.dumps(schema, indent=2)
|
|
127
|
+
return (
|
|
128
|
+
"Please output ONLY a JSON object conforming exactly to the following JSON Schema:\n"
|
|
129
|
+
f"{schema_json}"
|
|
130
|
+
)
|
|
131
|
+
if isinstance(schema, type) and issubclass(schema, BaseModel):
|
|
132
|
+
model_schema = schema.model_json_schema()
|
|
133
|
+
return (
|
|
134
|
+
"Please output ONLY a JSON object conforming exactly to this Pydantic model schema:\n"
|
|
135
|
+
f"{model_schema}"
|
|
136
|
+
)
|
|
137
|
+
if isinstance(schema, type) and schema in (int, float, str, bool, list, dict):
|
|
138
|
+
# For simple types, no JSON wrapper required
|
|
139
|
+
return f"Please output ONLY a value of type `{schema.__name__}`."
|
|
140
|
+
raise TypeError(f"Unsupported schema type: {schema!r}")
|
|
141
|
+
|
|
142
|
+
@staticmethod
|
|
143
|
+
def _extract_json(raw: str) -> str:
|
|
144
|
+
"""
|
|
145
|
+
Extract JSON from markdown fences or inline braces.
|
|
146
|
+
Falls back to returning the entire raw string.
|
|
147
|
+
"""
|
|
148
|
+
# Code fence (```json ... ```)
|
|
149
|
+
fence = re.search(r"```(?:json)?\s*([\s\S]*?)\s*```", raw)
|
|
150
|
+
if fence:
|
|
151
|
+
return fence.group(1)
|
|
152
|
+
# Inline {...}
|
|
153
|
+
inline = re.search(r"(\{[\s\S]*\})", raw)
|
|
154
|
+
if inline:
|
|
155
|
+
return inline.group(1)
|
|
156
|
+
return raw
|
|
157
|
+
|
|
158
|
+
def _clean_raw(self, raw: str) -> str:
|
|
159
|
+
"""Strip extraneous markdown and whitespace."""
|
|
160
|
+
cleaned = self._extract_json(raw)
|
|
161
|
+
return cleaned.strip()
|
|
162
|
+
|
|
163
|
+
def _validate(
|
|
164
|
+
self, raw: str, schema: Union[Dict[str, Any], Type[BaseModel], Type]
|
|
165
|
+
) -> Any:
|
|
166
|
+
"""
|
|
167
|
+
Clean, parse, and validate raw text against the schema/type.
|
|
168
|
+
Returns the parsed object or Pydantic instance.
|
|
169
|
+
Raises OutputValidationError on any failure.
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
cleaned = self._clean_raw(raw)
|
|
173
|
+
try:
|
|
174
|
+
if isinstance(schema, str):
|
|
175
|
+
data = cleaned
|
|
176
|
+
else:
|
|
177
|
+
data = json.loads(cleaned)
|
|
178
|
+
except json.JSONDecodeError:
|
|
179
|
+
try:
|
|
180
|
+
data = json.loads(cleaned.encode("unicode_escape").decode("utf-8"))
|
|
181
|
+
except Exception as e:
|
|
182
|
+
data = cleaned
|
|
183
|
+
|
|
184
|
+
# JSON Schema validation
|
|
185
|
+
if isinstance(schema, dict):
|
|
186
|
+
if jsonschema is None:
|
|
187
|
+
raise ImportError(
|
|
188
|
+
"jsonschema is required for JSON Schema validation. Install with: pip install jsonschema"
|
|
189
|
+
)
|
|
190
|
+
try:
|
|
191
|
+
jsonschema.validate(instance=data, schema=schema)
|
|
192
|
+
except jsonschema.ValidationError as e:
|
|
193
|
+
raise OutputValidationError(
|
|
194
|
+
f"JSON Schema validation error: {e.message}"
|
|
195
|
+
)
|
|
196
|
+
return data
|
|
197
|
+
|
|
198
|
+
# Pydantic model validation
|
|
199
|
+
if isinstance(schema, type) and issubclass(schema, BaseModel):
|
|
200
|
+
try:
|
|
201
|
+
return schema.model_validate(data)
|
|
202
|
+
except PydanticValidationError as e:
|
|
203
|
+
raise OutputValidationError(f"Pydantic validation error: {e}")
|
|
204
|
+
|
|
205
|
+
# Built-in type enforcement
|
|
206
|
+
if isinstance(schema, type) and schema in (int, float, str, bool, list, dict):
|
|
207
|
+
if not isinstance(data, schema):
|
|
208
|
+
raise OutputValidationError(
|
|
209
|
+
f"Type mismatch: expected {schema.__name__}, got {type(data).__name__}"
|
|
210
|
+
)
|
|
211
|
+
return data
|
|
212
|
+
|
|
213
|
+
raise TypeError(f"Unsupported schema type: {schema!r}")
|
|
214
|
+
|
|
215
|
+
def _inject_system(
|
|
216
|
+
self, prompt: Union[str, List[Dict[str, Any]]], instr: str
|
|
217
|
+
) -> Union[str, List[Dict[str, Any]]]:
|
|
218
|
+
"""
|
|
219
|
+
Combine instruction and user prompt:
|
|
220
|
+
- For text: prepend the instruction.
|
|
221
|
+
- For chat messages: if first role=system, append instr to it;
|
|
222
|
+
otherwise insert a new system message.
|
|
223
|
+
"""
|
|
224
|
+
if isinstance(prompt, str):
|
|
225
|
+
return f"{instr}\n\n{prompt}"
|
|
226
|
+
|
|
227
|
+
msgs = prompt.copy()
|
|
228
|
+
if msgs and msgs[0].get("role") == "system":
|
|
229
|
+
msgs[0]["content"] = msgs[0]["content"].rstrip() + "\n\n" + instr
|
|
230
|
+
else:
|
|
231
|
+
msgs.insert(0, {"role": "system", "content": instr})
|
|
232
|
+
return msgs
|
|
233
|
+
|
|
234
|
+
def generate(
|
|
235
|
+
self,
|
|
236
|
+
prompt: Union[str, List[Dict[str, Any]]],
|
|
237
|
+
*,
|
|
238
|
+
schema: Union[Dict[str, Any], Type[BaseModel], Type],
|
|
239
|
+
schema_field: Optional[str] = None,
|
|
240
|
+
retries: Optional[int] = 3,
|
|
241
|
+
include_schema_in_system_prompt: bool = False,
|
|
242
|
+
**kwargs: Any,
|
|
243
|
+
) -> Any:
|
|
244
|
+
"""
|
|
245
|
+
Synchronous single-item generation with validation + retries.
|
|
246
|
+
"""
|
|
247
|
+
current = prompt
|
|
248
|
+
instr = None
|
|
249
|
+
if include_schema_in_system_prompt:
|
|
250
|
+
instr = self._make_instruction(schema)
|
|
251
|
+
current = self._inject_system(prompt, instr)
|
|
252
|
+
if schema_field:
|
|
253
|
+
kwargs[schema_field] = schema
|
|
254
|
+
if isinstance(schema, dict):
|
|
255
|
+
new_schema = json_schema_to_pydantic_model(schema)
|
|
256
|
+
kwargs[schema_field] = new_schema
|
|
257
|
+
|
|
258
|
+
last_error: Optional[str] = None
|
|
259
|
+
for _ in range(1, retries + 1):
|
|
260
|
+
# Filter out schema-related kwargs for the base class
|
|
261
|
+
filtered_kwargs = {
|
|
262
|
+
k: v
|
|
263
|
+
for k, v in kwargs.items()
|
|
264
|
+
if k
|
|
265
|
+
not in [
|
|
266
|
+
"schema",
|
|
267
|
+
"schema_field",
|
|
268
|
+
"retries",
|
|
269
|
+
"include_schema_in_system_prompt",
|
|
270
|
+
]
|
|
271
|
+
}
|
|
272
|
+
raw = super().generate(**{"prompt": current, **filtered_kwargs})
|
|
273
|
+
try:
|
|
274
|
+
if isinstance(raw, str):
|
|
275
|
+
return self._validate(raw, schema)
|
|
276
|
+
return raw
|
|
277
|
+
except OutputValidationError as e:
|
|
278
|
+
last_error = str(e)
|
|
279
|
+
correction = (
|
|
280
|
+
f"The previous response did not conform: {last_error}\nPlease correct it."
|
|
281
|
+
" And remember to output ONLY the requested schema, without any additional text."
|
|
282
|
+
)
|
|
283
|
+
if isinstance(current, str):
|
|
284
|
+
if instr:
|
|
285
|
+
current = (
|
|
286
|
+
f"{instr}\n\nPrevious output:\n{raw}\n\n"
|
|
287
|
+
f"{correction}\n\n{prompt}"
|
|
288
|
+
)
|
|
289
|
+
else:
|
|
290
|
+
current = (
|
|
291
|
+
f"Previous output:\n{raw}\n\n" f"{correction}\n\n{prompt}"
|
|
292
|
+
)
|
|
293
|
+
else:
|
|
294
|
+
current = current + [
|
|
295
|
+
{"role": "assistant", "content": raw},
|
|
296
|
+
{"role": "user", "content": correction},
|
|
297
|
+
]
|
|
298
|
+
raise OutputValidationError(f"Failed after {retries} attempts: {last_error}")
|
|
299
|
+
|
|
300
|
+
async def generate_async(
|
|
301
|
+
self,
|
|
302
|
+
prompt: Union[str, List[Dict[str, Any]]],
|
|
303
|
+
*,
|
|
304
|
+
schema: Union[Dict[str, Any], Type[BaseModel], Type],
|
|
305
|
+
schema_field: Optional[str] = None,
|
|
306
|
+
retries: Optional[int] = 3,
|
|
307
|
+
include_schema_in_system_prompt: bool = False,
|
|
308
|
+
**kwargs: Any,
|
|
309
|
+
) -> Any:
|
|
310
|
+
"""
|
|
311
|
+
Asynchronous single-item generation with validation + retries.
|
|
312
|
+
"""
|
|
313
|
+
current = prompt
|
|
314
|
+
instr = None
|
|
315
|
+
if include_schema_in_system_prompt:
|
|
316
|
+
instr = self._make_instruction(schema)
|
|
317
|
+
current = self._inject_system(prompt, instr)
|
|
318
|
+
if schema_field:
|
|
319
|
+
kwargs[schema_field] = schema
|
|
320
|
+
if isinstance(schema, dict):
|
|
321
|
+
new_schema = json_schema_to_pydantic_model(schema)
|
|
322
|
+
kwargs[schema_field] = new_schema
|
|
323
|
+
|
|
324
|
+
last_error: Optional[str] = None
|
|
325
|
+
for _ in range(1, retries + 1):
|
|
326
|
+
# Filter out schema-related kwargs for the base class
|
|
327
|
+
filtered_kwargs = {
|
|
328
|
+
k: v
|
|
329
|
+
for k, v in kwargs.items()
|
|
330
|
+
if k
|
|
331
|
+
not in [
|
|
332
|
+
"schema",
|
|
333
|
+
"schema_field",
|
|
334
|
+
"retries",
|
|
335
|
+
"include_schema_in_system_prompt",
|
|
336
|
+
]
|
|
337
|
+
}
|
|
338
|
+
raw = await super().generate_async(**{"prompt": current, **filtered_kwargs})
|
|
339
|
+
try:
|
|
340
|
+
if isinstance(raw, str):
|
|
341
|
+
return self._validate(raw, schema)
|
|
342
|
+
return raw
|
|
343
|
+
except OutputValidationError as e:
|
|
344
|
+
last_error = str(e)
|
|
345
|
+
correction = (
|
|
346
|
+
f"The previous response did not conform: {last_error}\nPlease correct it."
|
|
347
|
+
" And remember to output ONLY the requested schema, without any additional text."
|
|
348
|
+
)
|
|
349
|
+
if isinstance(current, str):
|
|
350
|
+
if instr:
|
|
351
|
+
current = (
|
|
352
|
+
f"{instr}\n\nPrevious output:\n{raw}\n\n"
|
|
353
|
+
f"{correction}\n\n{prompt}"
|
|
354
|
+
)
|
|
355
|
+
else:
|
|
356
|
+
current = (
|
|
357
|
+
f"Previous output:\n{raw}\n\n" f"{correction}\n\n{prompt}"
|
|
358
|
+
)
|
|
359
|
+
else:
|
|
360
|
+
current = current + [
|
|
361
|
+
{"role": "assistant", "content": raw},
|
|
362
|
+
{"role": "user", "content": correction},
|
|
363
|
+
]
|
|
364
|
+
raise OutputValidationError(f"Failed after {retries} attempts: {last_error}")
|
|
File without changes
|
|
File without changes
|