Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -1,115 +1,100 @@
|
|
1 |
import os
|
2 |
-
from datetime import datetime
|
3 |
from queue import Queue
|
4 |
-
from argilla.webhooks import webhook_listener
|
5 |
-
|
6 |
-
import argilla as rg
|
7 |
import gradio as gr
|
|
|
|
|
|
|
8 |
|
|
|
|
|
9 |
|
10 |
-
|
|
|
|
|
|
|
|
|
11 |
|
|
|
12 |
server = rg.get_webhook_server()
|
13 |
-
incoming_events = Queue()
|
14 |
-
|
15 |
-
# Set up the webhook listeners
|
16 |
|
17 |
-
#
|
18 |
-
|
19 |
-
print(f"Deleting webhook: {webhook.url}")
|
20 |
-
webhook.delete()
|
21 |
|
22 |
-
|
23 |
-
|
|
|
24 |
"""
|
25 |
Webhook listener that triggers when a new response is added to an answering space.
|
26 |
It will automatically update the corresponding validation space with the new response.
|
27 |
-
|
28 |
-
Args:
|
29 |
-
event: The webhook event containing the user response data
|
30 |
"""
|
|
|
|
|
31 |
|
|
|
|
|
|
|
|
|
32 |
dataset_name = record.dataset.name
|
33 |
if not dataset_name.endswith("_responder_preguntas"):
|
|
|
34 |
return # Not an answering space, ignore
|
35 |
|
36 |
# Extract the country from the dataset name
|
37 |
country = dataset_name.replace("_responder_preguntas", "")
|
|
|
38 |
|
|
|
39 |
validation_dataset_name = f"{country}_validar_respuestas"
|
40 |
try:
|
41 |
validation_dataset = client.datasets(validation_dataset_name)
|
|
|
42 |
except Exception as e:
|
43 |
print(f"Error connecting to validation dataset: {e}")
|
|
|
|
|
44 |
validation_dataset = create_validation_space(country)
|
45 |
|
|
|
46 |
validation_record = {
|
47 |
"question": record.fields["question"],
|
48 |
"answer": response.value,
|
49 |
}
|
50 |
|
|
|
51 |
validation_dataset.records.log(records=[validation_record])
|
52 |
-
|
53 |
-
incoming_events.put({"event": type, "data": record})
|
54 |
print(f"Added new response to validation space for {country}")
|
55 |
|
56 |
-
|
57 |
-
# Create a webhook for record events
|
58 |
-
# @rg.webhook_listener(events=["record.deleted", "record.completed"])
|
59 |
-
# async def record_events(record: rg.Record, type: str, timestamp: datetime):
|
60 |
-
# print(f"Received event type {type} at {timestamp}: ", record)
|
61 |
-
|
62 |
-
# incoming_events.put({"event": type, "data": record})
|
63 |
-
|
64 |
-
|
65 |
-
# Create a webhook for dataset events
|
66 |
-
# @rg.webhook_listener(events=["dataset.created", "dataset.updated", "dataset.deleted", "dataset.published"])
|
67 |
-
# async def dataset_events(dataset: rg.Dataset, type: str, timestamp: datetime):
|
68 |
-
# print(f"Received event type {type} at {timestamp}: ", dataset)
|
69 |
-
|
70 |
-
# incoming_events.put({"event": type, "data": dataset})
|
71 |
-
|
72 |
-
|
73 |
-
# Create a webhook for response events
|
74 |
-
# @rg.webhook_listener(events=["response.created", "response.updated"])
|
75 |
-
# async def response_events(response: rg.UserResponse, type: str, timestamp: datetime):
|
76 |
-
# print(f"Received event type {type} at {timestamp}: ", response)
|
77 |
-
|
78 |
-
# incoming_events.put({"event": type, "data": response})
|
79 |
-
|
80 |
-
|
81 |
def read_next_event():
|
82 |
-
|
83 |
-
|
84 |
-
return
|
85 |
-
|
86 |
|
|
|
87 |
with gr.Blocks() as demo:
|
88 |
argilla_server = client.http_client.base_url
|
89 |
-
gr.Markdown("## Argilla Webhooks")
|
90 |
gr.Markdown(f"""
|
91 |
-
This
|
|
|
92 |
|
93 |
-
|
94 |
-
|
95 |
-
- Record events: `record.deleted`, `record.completed`
|
96 |
-
- Dataset events: `dataset.created`, `dataset.updated`, `dataset.deleted`, `dataset.published`
|
97 |
-
- Response events: `response.created`, `response.updated`
|
98 |
-
|
99 |
-
The events are stored in a queue and displayed in the JSON component and the incoming events is updated every second.
|
100 |
|
101 |
-
|
|
|
102 |
|
103 |
-
|
|
|
104 |
|
105 |
-
You can
|
106 |
""")
|
107 |
-
json_component = gr.JSON(label="Incoming
|
108 |
gr.Timer(1, active=True).tick(read_next_event, outputs=json_component)
|
109 |
|
|
|
110 |
gr.mount_gradio_app(server, demo, path="/")
|
111 |
|
112 |
# Start the FastAPI server
|
113 |
-
|
114 |
-
|
115 |
-
uvicorn.run(server, host="0.0.0.0", port=7860)
|
|
|
1 |
import os
|
|
|
2 |
from queue import Queue
|
|
|
|
|
|
|
3 |
import gradio as gr
|
4 |
+
import argilla as rg
|
5 |
+
from argilla.webhooks import webhook_listener
|
6 |
+
from dotenv import load_dotenv
|
7 |
|
8 |
+
# Load environment variables
|
9 |
+
load_dotenv()
|
10 |
|
11 |
+
# Initialize Argilla client
|
12 |
+
client = rg.Argilla(
|
13 |
+
api_url=os.getenv("API_URL"),
|
14 |
+
api_key=os.getenv("ARGILLA_API_KEY"),
|
15 |
+
)
|
16 |
|
17 |
+
# Get the webhook server
|
18 |
server = rg.get_webhook_server()
|
|
|
|
|
|
|
19 |
|
20 |
+
# Queue to store events for display
|
21 |
+
incoming_events = Queue()
|
|
|
|
|
22 |
|
23 |
+
# Set up the webhook listener for response creation
|
24 |
+
@webhook_listener(events=["response.created"])
|
25 |
+
async def update_validation_space_on_answer(response, type, timestamp):
|
26 |
"""
|
27 |
Webhook listener that triggers when a new response is added to an answering space.
|
28 |
It will automatically update the corresponding validation space with the new response.
|
|
|
|
|
|
|
29 |
"""
|
30 |
+
# Store the event for display in the UI
|
31 |
+
incoming_events.put({"event": type, "data": str(response)})
|
32 |
|
33 |
+
# Get the record from the response
|
34 |
+
record = response.record
|
35 |
+
|
36 |
+
# Check if this is from an answering space
|
37 |
dataset_name = record.dataset.name
|
38 |
if not dataset_name.endswith("_responder_preguntas"):
|
39 |
+
print(f"Ignoring event from non-answering dataset: {dataset_name}")
|
40 |
return # Not an answering space, ignore
|
41 |
|
42 |
# Extract the country from the dataset name
|
43 |
country = dataset_name.replace("_responder_preguntas", "")
|
44 |
+
print(f"Processing response for country: {country}")
|
45 |
|
46 |
+
# Connect to the validation space
|
47 |
validation_dataset_name = f"{country}_validar_respuestas"
|
48 |
try:
|
49 |
validation_dataset = client.datasets(validation_dataset_name)
|
50 |
+
print(f"Found validation dataset: {validation_dataset_name}")
|
51 |
except Exception as e:
|
52 |
print(f"Error connecting to validation dataset: {e}")
|
53 |
+
# You would need to import the create_validation_space function
|
54 |
+
from your_module import create_validation_space
|
55 |
validation_dataset = create_validation_space(country)
|
56 |
|
57 |
+
# Create a validation record
|
58 |
validation_record = {
|
59 |
"question": record.fields["question"],
|
60 |
"answer": response.value,
|
61 |
}
|
62 |
|
63 |
+
# Add the record to the validation space
|
64 |
validation_dataset.records.log(records=[validation_record])
|
|
|
|
|
65 |
print(f"Added new response to validation space for {country}")
|
66 |
|
67 |
+
# Function to read the next event from the queue
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
def read_next_event():
|
69 |
+
if not incoming_events.empty():
|
70 |
+
return incoming_events.get()
|
71 |
+
return {}
|
|
|
72 |
|
73 |
+
# Create Gradio interface
|
74 |
with gr.Blocks() as demo:
|
75 |
argilla_server = client.http_client.base_url
|
76 |
+
gr.Markdown("## Argilla Webhooks - Validation Space Updater")
|
77 |
gr.Markdown(f"""
|
78 |
+
This application listens for new responses in Argilla answering spaces and automatically
|
79 |
+
adds them to the corresponding validation spaces.
|
80 |
|
81 |
+
Connected to Argilla server: {argilla_server}
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
|
83 |
+
The webhook listens for:
|
84 |
+
- `response.created` events from datasets ending with `_responder_preguntas`
|
85 |
|
86 |
+
When a new response is created, it is added to the corresponding validation space
|
87 |
+
named `[country]_validar_respuestas`.
|
88 |
|
89 |
+
You can view the incoming events in the JSON component below.
|
90 |
""")
|
91 |
+
json_component = gr.JSON(label="Incoming response events:", value={})
|
92 |
gr.Timer(1, active=True).tick(read_next_event, outputs=json_component)
|
93 |
|
94 |
+
# Mount the Gradio app to the FastAPI server
|
95 |
gr.mount_gradio_app(server, demo, path="/")
|
96 |
|
97 |
# Start the FastAPI server
|
98 |
+
if __name__ == "__main__":
|
99 |
+
import uvicorn
|
100 |
+
uvicorn.run(server, host="0.0.0.0", port=7860)
|