lazlog's picture
add tools to find a velib
4fe6fd4 verified
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from geopy.distance import geodesic # Pour le calcul des distances
from Gradio_UI import GradioUI
# Fonction pour obtenir les coordonnées GPS d'une adresse
def geocode_address(address):
response = requests.get(f"https://api-adresse.data.gouv.fr/search/?q={address}")
data = response.json()
if not data['features']:
return None, None
coordinates = data['features'][0]['geometry']['coordinates']
return coordinates[1], coordinates[0] # Retourne latitude, longitude
# Fonction pour récupérer toutes les stations Vélib'
def get_stations():
response = requests.get("https://velib-metropole-opendata.smovengo.cloud/opendata/Velib_Metropole/station_information.json")
data = response.json()
return data['data']['stations']
# Trouver la station Vélib' la plus proche d'une adresse donnée
def find_nearest_station(address):
user_lat, user_lon = geocode_address(address)
if user_lat is None or user_lon is None:
return None
stations = get_stations()
min_distance = float('inf')
nearest_station = None
for station in stations:
station_coords = (station['lat'], station['lon'])
distance = geodesic((user_lat, user_lon), station_coords).meters
if distance < min_distance:
min_distance = distance
nearest_station = station
return nearest_station
# Fonction pour récupérer le statut d'une station
def get_station_status(station_id):
response = requests.get("https://velib-metropole-opendata.smovengo.cloud/opendata/Velib_Metropole/station_status.json")
data = response.json()
for station in data['data']['stations']:
if station['station_id'] == station_id:
return station
return None
# Outil final qui donne le nombre de vélos disponibles à une adresse donnée
@tool
def get_bike_availability(address: str) -> str:
"""A tool that fetches the number of available Velib' bikes at the nearest station to a given address.
Args:
address: The address where the user wants to find a Velib' station.
"""
nearest_station = find_nearest_station(address)
if not nearest_station:
return "Aucune station Vélib' trouvée à proximité."
status = get_station_status(nearest_station['station_id'])
if not status:
return "Impossible de récupérer le statut de la station."
mechanical_bikes = status['num_bikes_available_types'][0].get('mechanical', 0)
ebikes = status['num_bikes_available_types'][1].get('ebike', 0)
return (f"🚲 Station la plus proche : {nearest_station['name']}\n"
f"🔧 Vélos mécaniques disponibles : {mechanical_bikes}\n"
f"⚡ Vélos électriques disponibles : {ebikes}")
# Ajout du tool à l'agent
final_answer = FinalAnswerTool()
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
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, get_bike_availability], # Ajout du nouvel outil ici
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates
)
GradioUI(agent).launch()