|
|
import os |
|
|
import sys |
|
|
import importlib |
|
|
from collections import defaultdict |
|
|
|
|
|
from concurrent.futures import Future, ThreadPoolExecutor |
|
|
|
|
|
from datetime import datetime, timedelta |
|
|
import pandas as pd |
|
|
from langsmith import Client |
|
|
from tqdm.auto import tqdm |
|
|
|
|
|
import chainlit as cl |
|
|
|
|
|
async def get_trace(apiKey,task_list): |
|
|
try: |
|
|
client = Client(api_key=apiKey) |
|
|
project_name = "agent-collaboratif-avid" |
|
|
num_days = 30 |
|
|
|
|
|
|
|
|
tool_runs = client.list_runs( |
|
|
project_name=project_name, |
|
|
start_time=datetime.now() - timedelta(days=num_days), |
|
|
is_root=True, |
|
|
|
|
|
select=["inputs","trace_id"], |
|
|
) |
|
|
|
|
|
data = [] |
|
|
futures: list[Future] = [] |
|
|
trace_cursor = 0 |
|
|
trace_batch_size = 20 |
|
|
|
|
|
tool_runs_by_parent = defaultdict(lambda: defaultdict(set)) |
|
|
|
|
|
with ThreadPoolExecutor(max_workers=2) as executor: |
|
|
|
|
|
task2 = cl.Task(title="Grouper les outils invoqués dans une trace et les organiser par parent run ID") |
|
|
await task_list.add_task(task2) |
|
|
for run in tqdm(tool_runs): |
|
|
|
|
|
tool_runs_by_parent[run.trace_id]["tools_involved"].add(run.name) |
|
|
|
|
|
|
|
|
|
|
|
if len(tool_runs_by_parent) % trace_batch_size == 0: |
|
|
if this_batch := list(tool_runs_by_parent.keys())[ |
|
|
trace_cursor : trace_cursor + trace_batch_size |
|
|
]: |
|
|
trace_cursor += trace_batch_size |
|
|
futures.append( |
|
|
executor.submit( |
|
|
client.list_runs, |
|
|
project_name=project_name, |
|
|
run_ids=this_batch, |
|
|
select=["inputs","trace_id"], |
|
|
) |
|
|
) |
|
|
await task_list.send() |
|
|
if this_batch := list(tool_runs_by_parent.keys())[trace_cursor:]: |
|
|
futures.append( |
|
|
executor.submit( |
|
|
client.list_runs, |
|
|
project_name=project_name, |
|
|
run_ids=this_batch, |
|
|
select=["inputs","trace_id"], |
|
|
) |
|
|
) |
|
|
task2.status = cl.TaskStatus.DONE |
|
|
await task_list.send() |
|
|
task3 = cl.Task(title="Rechercher les données d'actions des utilisateurs de l'agent collabroatif AVID et les organiser par parent run ID dans un DataFrame") |
|
|
await task_list.add_task(task3) |
|
|
for future in tqdm(futures): |
|
|
root_runs = future.result() |
|
|
for root_run in root_runs: |
|
|
root_data = tool_runs_by_parent[root_run.id] |
|
|
data.append( |
|
|
{ |
|
|
"inputs": root_run.inputs, |
|
|
"start_time": root_run.start_time, |
|
|
"end_time": root_run.end_time, |
|
|
} |
|
|
) |
|
|
|
|
|
|
|
|
task3.status = cl.TaskStatus.DONE |
|
|
await task_list.send() |
|
|
|
|
|
df_inputs = pd.DataFrame(data) |
|
|
df_inputs['query'] = df_inputs.apply(lambda x: x.get('inputs', {}).get('query'), axis=1) |
|
|
df_inputs['latency'] = df_inputs['end_time'] - df_inputs['start_time'] |
|
|
df_inputs['latency'] = df_inputs['latency'].apply(lambda x: x.total_seconds()) |
|
|
df_inputs=df_inputs[["query","latency","start_time"]].copy() |
|
|
task4 = cl.Task(title="Conversion des données d'actions des utilisateurs de l'agent collabroatif AVID et les afficher au format texte") |
|
|
await task_list.add_task(task4) |
|
|
|
|
|
list_inputs = df_inputs.head(20).values.tolist() |
|
|
str_inputs="".join(['* Requête : ' + str(item[0]) + '\nDate : ' + str(item[2]) + '\nDurée de la requête : ' + str(item[1]) + '\n\n' for item in list_inputs]) |
|
|
task4.status = cl.TaskStatus.DONE |
|
|
await task_list.send() |
|
|
return str_inputs |
|
|
except Exception as e: |
|
|
return f"Aucune connexion à LangSmith" |