He fet un xatbot partint del codi:
# La primera vegada, desmarca la línia de sota per a instal·lar la biblioteca
# !pip install -U google-genai
from google import genai
from google.colab import userdata
# ==============================
# CONFIGURACIÓ DE L'API
# ==============================
# Configurar la clau API directament al client
GOOGLE_API_KEY = userdata.get("GOOGLE_API_KEY")
# Gestió d'errors si no s'ha configurat la clau API
if not GOOGLE_API_KEY:
print("
No s'ha trobat la clau API. Configura-la a Colab abans d'executar el programa.")
exit()
# Crear el client (NOU mètode de l'SDK 2.x)
client = genai.Client(api_key=GOOGLE_API_KEY)
# ==============================
# INSTRUCCIONS DEL SISTEMA
# ==============================
# Definir la instrucció del sistema per guiar el comportament del xat
# Aquesta instrucció determina la "personalitat" i el to de les respostes
system_instruction = """
Ets un assistent d'intel·ligència artificial dissenyat per ajudar els usuaris de manera clara, precisa i educada.
Proporciona respostes concretes i senzilles per facilitar la comprensió.
"""
# Crear una sessió de xat amb historial automàtic i instruccions personalitzades
chat = client.chats.create(
model="gemini-2.0-flash",
config=genai.types.GenerateContentConfig(
system_instruction=system_instruction, # Afegim instruccions del sistema
temperature=0.7, # Nivell de creativitat (0 = més concret, 1 = més creatiu)
max_output_tokens=200 # Longitud màxima de la resposta
)
)
# ==============================
# BUCLE DEL XAT
# ==============================
print("\n
XatBot activat! Escriu 'sortir' per acabar la conversa.\n")
while True:
try:
# Llegir la pregunta de l'usuari
prompt = input("
Usuari: ").strip()
# Si l'usuari escriu 'sortir', finalitzar la sessió
if prompt.lower() == "sortir":
print("
XatBot: Fins aviat!")
break
# Enviar el missatge al model i obtenir la resposta
resposta = chat.send_message(prompt)
# Mostrar la resposta generada pel model
print(f"
XatBot: {resposta.text.strip()}\n")
except Exception as e:
# Gestionar qualsevol error de comunicació amb l'API
print(f"
Error en la comunicació amb Gemini: {e}")
# ==============================
# FI DE LA SESSIÓ
# ==============================
He agregat una funcio de scraping per poder obtenir tota l’informacio de la web:
def obtener_info_web(url, visitadas=set(), profundidad=0, max_profundidad=2):
print(f"Scraping página: {url}")
# Evitar el scraping de páginas ya visitadas o si se alcanza la profundidad máxima
if url in visitadas or profundidad >= max_profundidad:
return ""
try:
# Realizar la solicitud HTTP
respuesta = requests.get(url, timeout=10)
respuesta.raise_for_status() # Verificar si hay errores en la respuesta
soup = BeautifulSoup(respuesta.text, "html.parser")
visitadas.add(url) # Marcar la URL como visitada
# Extraer información de la página
titulo = soup.title.string if soup.title else "Sin título"
parrafos = [p.text for p in soup.find_all("p")]
contenido = f"Título: {titulo}\nContenido: {' '.join(parrafos[:50])}"
# Esperar antes de hacer nuevas solicitudes para evitar sobrecargar el servidor
time.sleep(1)
# Buscar enlaces internos y hacer scraping en ellos (evitar enlaces externos y duplicados)
enlaces = [urljoin(url, a['href']) for a in soup.find_all('a', href=True)
if urljoin(url, a['href']).startswith("https://ilecina.inscastellbisbal.net")]
for enlace in enlaces:
if enlace not in visitadas: # Solo visitar enlaces que no hayan sido procesados
contenido += "\n" + obtener_info_web(enlace, visitadas, profundidad + 1, max_profundidad)
return contenido
except requests.exceptions.RequestException as e:
return f"Error al obtener datos de la web: {e}"
I per la vinculacio a la web he cambiat el final del codi ” BUCLE DE XAT” per :
NGROK_AUTHTOKEN = userdata.get("NGROK")
ngrok.set_auth_token(NGROK_AUTHTOKEN)
public_url = ngrok.connect(5001)
print(f" * Servidor disponible en: {public_url}")
@app.route('/', methods=['POST'])
def obtenir_resposta():
if request.method == "OPTIONS":
return jsonify({"status": "ok"}), 200
try:
dades = request.get_json()
if not dades or 'mensaje' not in dades:
return jsonify({'error': 'Solicitud invàlida, falta "mensaje"'}), 400
mensaje = dades['mensaje']
# Imprimir el mensaje rebut als logs de Flask
print(f"missatge rebut: {mensaje}")
# Obtenir informació de tota la web
info_web = obtenir_info_web("https://ilecina.inscastellbisbal.net")
# Enviar mensaje al model amb la informació extraïda
resposta = chat.send_message(f"{info_web}\n\nPregunta: {mensaje}")
print(f"Resposta del model: {resposta.text.strip()}")
return jsonify({'resposta': resposta.text.strip()}), 200
except Exception as e:
# Capturar qualsevol error i mostrar-lo als logs
print(f"Error en processar la sol·licitud: {e}")
return jsonify({'error': 'Error intern al servidor'}), 500
obtenir_info_web('https://ilecina.inscastellbisbal.net')
if __name__ == '__main__':
app.run(port=5001)