|
|
|
|
|
|
|
|
from typing import Dict, Any, List, Optional |
|
|
from .base_tool import BaseTool |
|
|
|
|
|
class ReasoningTool(BaseTool): |
|
|
"""Tool for structured scientific reasoning and analysis. |
|
|
|
|
|
This tool helps agents perform structured reasoning about scientific hypotheses, |
|
|
including causal analysis, counter-factual reasoning, and identification of |
|
|
potential confounding variables. |
|
|
""" |
|
|
|
|
|
def __init__(self): |
|
|
"""Initialize the reasoning tool.""" |
|
|
super().__init__( |
|
|
name="reasoning", |
|
|
description="Perform structured scientific reasoning and analysis" |
|
|
) |
|
|
|
|
|
def execute( |
|
|
self, |
|
|
reasoning_type: str, |
|
|
hypothesis: str, |
|
|
context: Optional[str] = None, |
|
|
depth: int = 2 |
|
|
) -> Dict[str, Any]: |
|
|
"""Execute structured scientific reasoning on a hypothesis. |
|
|
|
|
|
Args: |
|
|
reasoning_type: Type of reasoning to perform (causal, counterfactual, confounders) |
|
|
hypothesis: The scientific hypothesis to analyze |
|
|
context: Optional additional context to consider |
|
|
depth: Depth of reasoning (1-3, with 3 being the deepest) |
|
|
|
|
|
Returns: |
|
|
A dictionary containing the reasoning results |
|
|
""" |
|
|
self.logger.info(f"Performing {reasoning_type} reasoning on hypothesis: {hypothesis[:50]}...") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
result = { |
|
|
"reasoning_type": reasoning_type, |
|
|
"hypothesis": hypothesis, |
|
|
"analysis": f"Structured {reasoning_type} analysis of the hypothesis.", |
|
|
"insights": [ |
|
|
f"Key insight 1 about {hypothesis[:30]}...", |
|
|
f"Key insight 2 about {hypothesis[:30]}...", |
|
|
f"Key insight 3 about {hypothesis[:30]}..." |
|
|
], |
|
|
"confidence": 0.85, |
|
|
"recommendations": [ |
|
|
"Consider examining related factor X", |
|
|
"The hypothesis may be strengthened by addressing Y" |
|
|
] |
|
|
} |
|
|
|
|
|
if reasoning_type == "causal": |
|
|
result["causal_factors"] = [ |
|
|
{"factor": "Factor A", "effect_direction": "positive", "confidence": 0.9}, |
|
|
{"factor": "Factor B", "effect_direction": "negative", "confidence": 0.7} |
|
|
] |
|
|
|
|
|
elif reasoning_type == "counterfactual": |
|
|
result["counterfactual_scenarios"] = [ |
|
|
{"scenario": "If X were not present", "outcome": "Y would likely decrease"}, |
|
|
{"scenario": "If Z were increased", "outcome": "Y would likely increase"} |
|
|
] |
|
|
|
|
|
elif reasoning_type == "confounders": |
|
|
result["potential_confounders"] = [ |
|
|
{"confounder": "Confounder A", "impact": "high", "explanation": "Explains both X and Y"}, |
|
|
{"confounder": "Confounder B", "impact": "medium", "explanation": "Partially explains Z"} |
|
|
] |
|
|
|
|
|
return result |
|
|
|
|
|
def get_parameters_schema(self) -> Dict[str, Any]: |
|
|
"""Get the JSON schema for the tool's parameters. |
|
|
|
|
|
Returns: |
|
|
A dictionary containing the JSON schema |
|
|
""" |
|
|
return { |
|
|
"type": "object", |
|
|
"properties": { |
|
|
"reasoning_type": { |
|
|
"type": "string", |
|
|
"description": "Type of reasoning to perform", |
|
|
"enum": ["causal", "counterfactual", "confounders", "general"] |
|
|
}, |
|
|
"hypothesis": { |
|
|
"type": "string", |
|
|
"description": "The scientific hypothesis to analyze" |
|
|
}, |
|
|
"context": { |
|
|
"type": "string", |
|
|
"description": "Optional additional context to consider" |
|
|
}, |
|
|
"depth": { |
|
|
"type": "integer", |
|
|
"description": "Depth of reasoning (1-3, with 3 being the deepest)", |
|
|
"minimum": 1, |
|
|
"maximum": 3, |
|
|
"default": 2 |
|
|
} |
|
|
}, |
|
|
"required": ["reasoning_type", "hypothesis"] |
|
|
} |
|
|
|