| import anthropic |
| import os |
| import json |
| from typing import List, Dict, Union, Any |
| from dotenv import load_dotenv |
|
|
| load_dotenv() |
|
|
| |
| if not os.getenv("ANTHROPIC_API_KEY"): |
| raise ValueError("ANTHROPIC_API_KEY environment variable is not set") |
|
|
| client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) |
|
|
| def llm_parse_tasks(user_input: str) -> Union[List[Dict[str, Any]], str]: |
| """ |
| Parse user input into structured tasks using Claude 3. |
| |
| Args: |
| user_input (str): The user's natural language input describing their goals |
| |
| Returns: |
| Union[List[Dict[str, Any]], str]: Either a list of task dictionaries or an error message |
| """ |
| prompt = f""" |
| You are a helpful assistant that turns vague personal goals into clear, actionable tasks. |
| |
| Break this input into tasks with: |
| - task name (key: "task") |
| - category (key: "category") - Choose from: Career, Learning, Personal, Outreach, Health, Finance |
| - priority (key: "priority") - Choose from: High, Medium, Low |
| - optional due date (key: "dueDate") - Use ISO format YYYY-MM-DD if date is mentioned or inferred |
| - notes (key: "notes") - Add relevant context or subtasks |
| |
| Return ONLY a valid JSON array of task objects with the exact keys mentioned above. |
| Each task MUST have at least task, category, and priority fields. |
| |
| Input: \"\"\"{user_input}\"\"\" |
| """ |
|
|
| try: |
| response = client.messages.create( |
| model="claude-3-haiku-20240307", |
| max_tokens=1024, |
| temperature=0.4, |
| messages=[ |
| {"role": "user", "content": prompt} |
| ] |
| ) |
|
|
| content = response.content[0].text.strip() |
| tasks = json.loads(content) |
|
|
| |
| for task in tasks: |
| if not all(k in task for k in ["task", "category", "priority"]): |
| return "Error: Each task must have task, category, and priority fields" |
| |
| |
| if task["category"] not in ["Career", "Learning", "Personal", "Outreach", "Health", "Finance"]: |
| return f"Error: Invalid category '{task['category']}' in task '{task['task']}'" |
| |
| if task["priority"] not in ["High", "Medium", "Low"]: |
| return f"Error: Invalid priority '{task['priority']}' in task '{task['task']}'" |
|
|
| return tasks |
| except anthropic.APIError as e: |
| return f"Claude API Error: {str(e)}" |
| except json.JSONDecodeError: |
| return "Error: Failed to parse Claude's response as JSON" |
| except Exception as e: |
| return f"Unexpected error: {str(e)}" |
|
|