Spaces:
Sleeping
Sleeping
| from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool | |
| import datetime | |
| import requests | |
| import pytz | |
| import yaml | |
| from tools.final_answer import FinalAnswerTool | |
| from Gradio_UI import GradioUI | |
| # Below is an example of a tool that does nothing. Amaze us with your creativity ! | |
| def my_custom_tool(arg1:str, arg2:int)-> str: #it's import to specify the return type | |
| #Keep this format for the description / args / args description but feel free to modify the tool | |
| """A tool that does nothing yet | |
| Args: | |
| arg1: the first argument | |
| arg2: the second argument | |
| """ | |
| return "What magic will you build ?" | |
| def get_current_time_in_timezone(timezone: str) -> str: | |
| """A tool that fetches the current local time in a specified timezone. | |
| Args: | |
| timezone: A string representing a valid timezone (e.g., 'America/New_York'). | |
| """ | |
| try: | |
| # Create timezone object | |
| tz = pytz.timezone(timezone) | |
| # Get current time in that timezone | |
| local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S") | |
| return f"The current local time in {timezone} is: {local_time}" | |
| except Exception as e: | |
| return f"Error fetching time for timezone '{timezone}': {str(e)}" | |
| def analyze_linkedin_profile(profile_url: str) -> str: | |
| """A tool that provides guidance on analyzing a LinkedIn profile and extracts basic public information. | |
| Args: | |
| profile_url: The LinkedIn profile URL (e.g., 'https://www.linkedin.com/in/username') | |
| """ | |
| try: | |
| # Extract username from URL | |
| username = profile_url.rstrip('/').split('/')[-1].replace('in/', '') | |
| # Attempt to fetch basic info (note: LinkedIn blocks most automated requests) | |
| headers = { | |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', | |
| 'Accept-Language': 'en-US,en;q=0.9', | |
| 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', | |
| } | |
| try: | |
| response = requests.get(profile_url, headers=headers, timeout=10, allow_redirects=True) | |
| status = response.status_code | |
| except: | |
| status = 0 | |
| # Provide structured guidance regardless of access | |
| analysis = f""" | |
| 👤 LinkedIn Profile Analysis Tool | |
| ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ | |
| 🔗 Profile: linkedin.com/in/{username} | |
| 📊 Access Status: {'✅ Public profile detected' if status == 200 else '⚠️ Limited access (login may be required)'} | |
| 📋 Key Information to Extract Manually: | |
| 1️⃣ PROFESSIONAL SUMMARY | |
| • Current job title and company | |
| • Years of experience | |
| • Industry sector | |
| • Location | |
| 2️⃣ WORK EXPERIENCE | |
| • Recent positions (last 3-5 roles) | |
| • Duration at each company | |
| • Key responsibilities | |
| • Career progression | |
| 3️⃣ EDUCATION & CERTIFICATIONS | |
| • Degrees and institutions | |
| • Graduation years | |
| • Professional certifications | |
| • Specialized training | |
| 4️⃣ SKILLS & EXPERTISE | |
| • Technical skills | |
| • Soft skills | |
| • Endorsements count | |
| • Top 5-10 skills | |
| 5️⃣ ENGAGEMENT METRICS | |
| • Number of connections (if visible) | |
| • Activity level (posts, articles) | |
| • Recommendations received | |
| • Languages spoken | |
| 💡 ANALYSIS TIPS: | |
| - Check for career gaps or transitions | |
| - Look for consistent skill themes | |
| - Note any volunteer work or side projects | |
| - Review recommendations for insights | |
| - Check mutual connections for context | |
| 🔍 To access full profile details: | |
| Visit: {profile_url} | |
| """ | |
| return analysis | |
| except Exception as e: | |
| return f""" | |
| ❌ Error analyzing LinkedIn profile: {str(e)} | |
| 📌 Profile URL: {profile_url} | |
| 💡 Manual Analysis Checklist: | |
| ✓ Visit the profile directly | |
| ✓ Note current position and company | |
| ✓ Review work history | |
| ✓ Check skills and endorsements | |
| ✓ Read recommendations | |
| ✓ Assess profile completeness | |
| """ | |
| def analyze_github_repository(repo_url: str) -> str: | |
| """A tool that analyzes a GitHub repository and provides insights about its structure, activity, and health. | |
| Args: | |
| repo_url: The GitHub repository URL (e.g., 'https://github.com/user/repo') | |
| """ | |
| try: | |
| # Extract owner and repo name from URL | |
| parts = repo_url.rstrip('/').split('/') | |
| owner, repo = parts[-2], parts[-1] | |
| # GitHub API endpoint | |
| api_url = f"https://api.github.com/repos/{owner}/{repo}" | |
| # Fetch repository data | |
| response = requests.get(api_url, timeout=10) | |
| if response.status_code != 200: | |
| return f"Error: Unable to fetch repository data (Status: {response.status_code})" | |
| data = response.json() | |
| # Extract key metrics | |
| analysis = f""" | |
| 📊 Repository Analysis: {data['full_name']} | |
| ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ | |
| 📝 Description: {data.get('description', 'No description')} | |
| ⭐ Stars: {data['stargazers_count']:,} | |
| 🍴 Forks: {data['forks_count']:,} | |
| 👀 Watchers: {data['watchers_count']:,} | |
| 🐛 Open Issues: {data['open_issues_count']:,} | |
| 📅 Created: {data['created_at'][:10]} | |
| 🔄 Last Updated: {data['updated_at'][:10]} | |
| 📚 Language: {data.get('language', 'Not specified')} | |
| 📜 License: {data.get('license', {}).get('name', 'No license')} | |
| 🌐 Homepage: {data.get('homepage', 'None')} | |
| """ | |
| return analysis | |
| except Exception as e: | |
| return f"Error analyzing repository: {str(e)}" | |
| final_answer = FinalAnswerTool() | |
| # If the agent does not answer, the model is overloaded, please use another model or the following Hugging Face Endpoint that also contains qwen2.5 coder: | |
| # model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud' | |
| model = HfApiModel( | |
| max_tokens=2096, | |
| temperature=0.5, | |
| model_id='Qwen/Qwen2.5-Coder-32B-Instruct',# it is possible that this model may be overloaded | |
| custom_role_conversions=None, | |
| ) | |
| # Import tool from Hub | |
| image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True) | |
| with open("prompts.yaml", 'r') as stream: | |
| prompt_templates = yaml.safe_load(stream) | |
| agent = CodeAgent( | |
| model=model, | |
| tools=[final_answer, analyze_github_repository, analyze_linkedin_profile], ## add your tools here (don't remove final answer) | |
| max_steps=6, | |
| verbosity_level=1, | |
| grammar=None, | |
| planning_interval=None, | |
| name=None, | |
| description=None, | |
| prompt_templates=prompt_templates | |
| ) | |
| GradioUI(agent).launch() |