import os from queue import Queue import gradio as gr import argilla as rg from argilla.webhooks import webhook_listener client = rg.Argilla( api_url=os.getenv("ARGILLA_API_URL"), api_key=os.getenv("ARGILLA_API_KEY"), ) server = rg.get_webhook_server() incoming_events = Queue() @webhook_listener(events=["response.created"]) async def update_validation_space_on_answer(response, type, timestamp): """ Webhook listener that triggers when a new response is added to an answering space. It will automatically update the corresponding validation space with the new response. """ try: incoming_events.put({"event": type, "timestamp": str(timestamp)}) record = response.record original_user_id = str(response.user_id) dataset_name = record.dataset.name if not dataset_name.endswith("Responder"): print(f"Ignoring event from non-answering dataset: {dataset_name}") return print(f"Processing response for dataset: {dataset_name}") validation_dataset_name = dataset_name.replace("Responder", "Validar") try: validation_dataset = client.datasets(validation_dataset_name) print(f"Found validation dataset: {validation_dataset_name}") except Exception as e: print(f"Error connecting to validation dataset: {e}") response_dict = response.to_dict() answers = [response_dict["values"]['answer_1']['value']] if "answer_2" in response_dict["values"]: answers.append(response_dict["values"]['answer_2']['value']) if "answer_3" in response_dict["values"]: answers.append(response_dict["values"]['answer_3']['value']) new_records = [] for answer in answers: if answer: validation_record = { "question": record.fields["question"], "answer": answer, "metadata": { "original_responder_id": original_user_id, "original_dataset": dataset_name } } new_records.append(validation_record) validation_dataset.records.log(records=new_records) print(f"Added new response to {update_validation_space_on_answer}") except Exception as e: print(f"Error in webhook handler: {e}") incoming_events.put({"event": "error", "error": str(e)}) def read_next_event(): if not incoming_events.empty(): return incoming_events.get() return {} with gr.Blocks() as demo: argilla_server = client.http_client.base_url gr.Markdown("# Argilla Webhooks - Top Secret") gr.Timer(1, active=True).tick(read_next_event) gr.mount_gradio_app(server, demo, path="/") if __name__ == "__main__": import uvicorn uvicorn.run(server, host="0.0.0.0", port=7860)