mirror of
https://github.com/sstent/AICycling_mcp.git
synced 2026-02-17 20:56:02 +00:00
workng - split out prompt temapltes
This commit is contained in:
@@ -21,6 +21,8 @@ except ImportError:
|
|||||||
Agent = None
|
Agent = None
|
||||||
print("Pydantic AI not available. Install with: pip install pydantic-ai")
|
print("Pydantic AI not available. Install with: pip install pydantic-ai")
|
||||||
|
|
||||||
|
from templates_manager import TemplateManager
|
||||||
|
|
||||||
# MCP Protocol imports for direct connection
|
# MCP Protocol imports for direct connection
|
||||||
try:
|
try:
|
||||||
from pydantic_ai.mcp import MCPServerStdio
|
from pydantic_ai.mcp import MCPServerStdio
|
||||||
@@ -79,6 +81,7 @@ class PydanticAIAnalyzer:
|
|||||||
|
|
||||||
def __init__(self, config: Config):
|
def __init__(self, config: Config):
|
||||||
self.config = config
|
self.config = config
|
||||||
|
self.template_manager = TemplateManager(self.config.templates_dir)
|
||||||
self.mcp_server = None
|
self.mcp_server = None
|
||||||
self.available_tools = []
|
self.available_tools = []
|
||||||
self._cached_activity_details = None
|
self._cached_activity_details = None
|
||||||
@@ -109,11 +112,11 @@ class PydanticAIAnalyzer:
|
|||||||
|
|
||||||
model_name = f"openrouter:{config.openrouter_model}"
|
model_name = f"openrouter:{config.openrouter_model}"
|
||||||
|
|
||||||
|
main_system_prompt = self.template_manager.get_template('main_agent_system_prompt.txt')
|
||||||
|
|
||||||
self.agent = Agent(
|
self.agent = Agent(
|
||||||
model=model_name,
|
model=model_name,
|
||||||
system_prompt="""You are an expert cycling coach with access to comprehensive Garmin Connect data.
|
system_prompt=main_system_prompt,
|
||||||
You analyze cycling workouts, provide performance insights, and give actionable training recommendations.
|
|
||||||
Use the available tools to gather detailed workout data and provide comprehensive analysis.""",
|
|
||||||
toolsets=[self.mcp_server] if self.mcp_server else []
|
toolsets=[self.mcp_server] if self.mcp_server else []
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -276,34 +279,20 @@ class PydanticAIAnalyzer:
|
|||||||
{json.dumps(user_profile, default=str)}
|
{json.dumps(user_profile, default=str)}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
prompt = f"""
|
prompt = self.template_manager.get_template(
|
||||||
Analyze my most recent cycling workout using the provided data. Do not call any tools - all necessary data is already loaded.
|
'analyze_last_workout_prompt.txt',
|
||||||
|
activity_summary=activity_summary,
|
||||||
{activity_summary}
|
user_info=user_info,
|
||||||
|
training_rules=training_rules
|
||||||
{user_info}
|
)
|
||||||
|
|
||||||
My training rules and goals:
|
|
||||||
{training_rules}
|
|
||||||
|
|
||||||
Please provide:
|
|
||||||
1. Overall assessment of the workout
|
|
||||||
2. How well it aligns with my rules and goals
|
|
||||||
3. Areas for improvement
|
|
||||||
4. Specific feedback on power, heart rate, duration, and intensity
|
|
||||||
5. Recovery recommendations
|
|
||||||
6. Comparison with typical performance metrics (use user profile data for baselines)
|
|
||||||
|
|
||||||
Focus on the provided activity details for your analysis.
|
|
||||||
"""
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Create temporary agent without tools for this analysis
|
# Create temporary agent without tools for this analysis
|
||||||
model_name = f"openrouter:{self.config.openrouter_model}"
|
model_name = f"openrouter:{self.config.openrouter_model}"
|
||||||
|
temp_analysis_system_prompt = self.template_manager.get_template('temp_analysis_system_prompt.txt')
|
||||||
temp_agent = Agent(
|
temp_agent = Agent(
|
||||||
model=model_name,
|
model=model_name,
|
||||||
system_prompt="""You are an expert cycling coach. Analyze the provided cycling workout data and give actionable insights.
|
system_prompt=temp_analysis_system_prompt,
|
||||||
Do not use any tools - all data is provided in the prompt.""",
|
|
||||||
toolsets=[]
|
toolsets=[]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -338,24 +327,10 @@ class PydanticAIAnalyzer:
|
|||||||
else:
|
else:
|
||||||
logger.warning("No MCP tools available!")
|
logger.warning("No MCP tools available!")
|
||||||
|
|
||||||
prompt = f"""
|
prompt = self.template_manager.get_template(
|
||||||
Please suggest my next cycling workout based on my recent training history. Use the get_activities tool
|
'suggest_next_workout_prompt.txt',
|
||||||
to get my recent activities and analyze the training pattern.
|
training_rules=training_rules
|
||||||
|
)
|
||||||
My training rules and goals:
|
|
||||||
{training_rules}
|
|
||||||
|
|
||||||
Please provide:
|
|
||||||
1. Analysis of my recent training pattern
|
|
||||||
2. Identified gaps or imbalances in my training
|
|
||||||
3. Specific workout recommendation for my next session
|
|
||||||
4. Target zones (power, heart rate, duration)
|
|
||||||
5. Rationale for the recommendation based on recent performance
|
|
||||||
6. Alternative options if weather/time constraints exist
|
|
||||||
7. How this fits into my overall training progression
|
|
||||||
|
|
||||||
Use additional tools like hrv_data or nightly_sleep to inform recovery status and workout readiness.
|
|
||||||
"""
|
|
||||||
|
|
||||||
logger.info("About to call agent.run() with workout suggestion prompt")
|
logger.info("About to call agent.run() with workout suggestion prompt")
|
||||||
try:
|
try:
|
||||||
@@ -414,33 +389,21 @@ class PydanticAIAnalyzer:
|
|||||||
{json.dumps(user_profile, default=str)}
|
{json.dumps(user_profile, default=str)}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
prompt = f"""
|
prompt = self.template_manager.get_template(
|
||||||
Perform a comprehensive {analysis_type} analysis using the provided cycling training data.
|
'enhanced_analysis_prompt.txt',
|
||||||
Do not call any tools - all core data is already loaded. Base your analysis on the following information:
|
analysis_type=analysis_type,
|
||||||
|
activity_summary=activity_summary,
|
||||||
{activity_summary}
|
user_info=user_info,
|
||||||
|
training_rules=training_rules
|
||||||
{user_info}
|
)
|
||||||
|
|
||||||
My training rules and goals:
|
|
||||||
{training_rules}
|
|
||||||
|
|
||||||
Focus your {analysis_type} analysis on:
|
|
||||||
1. **Performance Analysis**: Analyze power, heart rate, training load, and recovery metrics from the provided data
|
|
||||||
2. **Training Periodization**: Consider the recent activity patterns and progression
|
|
||||||
3. **Actionable Recommendations**: Provide specific, measurable guidance based on the data
|
|
||||||
4. **Risk Assessment**: Identify any signs of overtraining or injury risk from the available metrics
|
|
||||||
|
|
||||||
Be thorough and use the provided data points to support your recommendations.
|
|
||||||
"""
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Create temporary agent without tools for this analysis
|
# Create temporary agent without tools for this analysis
|
||||||
model_name = f"openrouter:{self.config.openrouter_model}"
|
model_name = f"openrouter:{self.config.openrouter_model}"
|
||||||
|
enhanced_temp_system_prompt = self.template_manager.get_template('enhanced_temp_system_prompt.txt')
|
||||||
temp_agent = Agent(
|
temp_agent = Agent(
|
||||||
model=model_name,
|
model=model_name,
|
||||||
system_prompt="""You are an expert cycling coach. Perform comprehensive analysis using the provided data.
|
system_prompt=enhanced_temp_system_prompt,
|
||||||
Do not use any tools - all relevant data is included in the prompt.""",
|
|
||||||
toolsets=[]
|
toolsets=[]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
20
templates/analyze_last_workout_prompt.txt
Normal file
20
templates/analyze_last_workout_prompt.txt
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
Analyze my most recent cycling workout using the provided data.
|
||||||
|
|
||||||
|
ACTIVITY SUMMARY:
|
||||||
|
{activity_summary}
|
||||||
|
|
||||||
|
USER INFO:
|
||||||
|
{user_info}
|
||||||
|
|
||||||
|
My training rules and goals:
|
||||||
|
{training_rules}
|
||||||
|
|
||||||
|
Please provide:
|
||||||
|
1. Overall assessment of the workout
|
||||||
|
2. How well it aligns with my rules and goals
|
||||||
|
3. Areas for improvement
|
||||||
|
4. Specific feedback on power, heart rate, duration, and intensity
|
||||||
|
5. Recovery recommendations
|
||||||
|
6. Comparison with typical performance metrics (use user profile data for baselines)
|
||||||
|
|
||||||
|
Focus on the provided activity details for your analysis.
|
||||||
17
templates/enhanced_analysis_prompt.txt
Normal file
17
templates/enhanced_analysis_prompt.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
Perform a comprehensive {analysis_type} analysis using the provided cycling training data.
|
||||||
|
Do not call any tools - all core data is already loaded. Base your analysis on the following information:
|
||||||
|
|
||||||
|
{activity_summary}
|
||||||
|
|
||||||
|
{user_info}
|
||||||
|
|
||||||
|
My training rules and goals:
|
||||||
|
{training_rules}
|
||||||
|
|
||||||
|
Focus your {analysis_type} analysis on:
|
||||||
|
1. **Performance Analysis**: Analyze power, heart rate, training load, and recovery metrics from the provided data
|
||||||
|
2. **Training Periodization**: Consider the recent activity patterns and progression
|
||||||
|
3. **Actionable Recommendations**: Provide specific, measurable guidance based on the data
|
||||||
|
4. **Risk Assessment**: Identify any signs of overtraining or injury risk from the available metrics
|
||||||
|
|
||||||
|
Be thorough and use the provided data points to support your recommendations.
|
||||||
2
templates/enhanced_temp_system_prompt.txt
Normal file
2
templates/enhanced_temp_system_prompt.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
You are an expert cycling coach. Perform comprehensive analysis using the provided data.
|
||||||
|
Do not use any tools - all relevant data is included in the prompt.
|
||||||
3
templates/main_agent_system_prompt.txt
Normal file
3
templates/main_agent_system_prompt.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
You are an expert cycling coach with access to comprehensive Garmin Connect data.
|
||||||
|
You analyze cycling workouts, provide performance insights, and give actionable training recommendations.
|
||||||
|
Use the available tools to gather detailed workout data and provide comprehensive analysis.
|
||||||
16
templates/suggest_next_workout_prompt.txt
Normal file
16
templates/suggest_next_workout_prompt.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
Please suggest my next cycling workout based on my recent training history. Use the get_activities tool
|
||||||
|
to get my recent activities and analyze the training pattern.
|
||||||
|
|
||||||
|
My training rules and goals:
|
||||||
|
{training_rules}
|
||||||
|
|
||||||
|
Please provide:
|
||||||
|
1. Analysis of my recent training pattern
|
||||||
|
2. Identified gaps or imbalances in my training
|
||||||
|
3. Specific workout recommendation for my next session
|
||||||
|
4. Target zones (power, heart rate, duration)
|
||||||
|
5. Rationale for the recommendation based on recent performance
|
||||||
|
6. Alternative options if weather/time constraints exist
|
||||||
|
7. How this fits into my overall training progression
|
||||||
|
|
||||||
|
Use additional tools like hrv_data or nightly_sleep to inform recovery status and workout readiness.
|
||||||
2
templates/temp_analysis_system_prompt.txt
Normal file
2
templates/temp_analysis_system_prompt.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
You are an expert cycling coach. Analyze the provided cycling workout data and give actionable insights.
|
||||||
|
Do not use any tools - all data is provided in the prompt.
|
||||||
40
templates_manager.py
Normal file
40
templates_manager.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import os
|
||||||
|
import logging
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
class TemplateManager:
|
||||||
|
"""Manages prompt templates for the cycling analyzer"""
|
||||||
|
|
||||||
|
def __init__(self, templates_dir: str):
|
||||||
|
self.templates_dir = Path(templates_dir)
|
||||||
|
self.templates_dir.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
def list_templates(self) -> list[str]:
|
||||||
|
"""List available template files"""
|
||||||
|
return [f.name for f in self.templates_dir.glob("*.txt")]
|
||||||
|
|
||||||
|
def get_template(self, template_name: str, **kwargs) -> str:
|
||||||
|
"""Load and format a template with provided variables"""
|
||||||
|
template_path = self.templates_dir / template_name
|
||||||
|
if not template_path.exists():
|
||||||
|
raise FileNotFoundError(f"Template '{template_name}' not found in {self.templates_dir}")
|
||||||
|
|
||||||
|
with open(template_path, 'r', encoding='utf-8') as f:
|
||||||
|
template_content = f.read()
|
||||||
|
|
||||||
|
# Debug logging
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
logger.debug(f"Loading template: {template_name}")
|
||||||
|
logger.debug(f"Template content length: {len(template_content)}")
|
||||||
|
logger.debug(f"Available kwargs: {list(kwargs.keys())}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
formatted_template = template_content.format(**kwargs)
|
||||||
|
return formatted_template
|
||||||
|
except KeyError as e:
|
||||||
|
logger.error(f"Template content preview: {template_content[:200]}...")
|
||||||
|
logger.error(f"Missing variable in template '{template_name}': {e}")
|
||||||
|
logger.error(f"Available kwargs: {list(kwargs.keys())}")
|
||||||
|
raise ValueError(f"Missing variable in template '{template_name}': {e}")
|
||||||
|
except Exception as e:
|
||||||
|
raise ValueError(f"Error formatting template '{template_name}': {e}")
|
||||||
Reference in New Issue
Block a user