from io import BytesIO import requests import re import pandas as pd from openai import OpenAI import os from langchain_core.messages import convert_to_messages api_open_ai_agent_key=os.environ["OPENAI_API_KEY"] client = OpenAI(api_key=api_open_ai_agent_key) def pretty_print_message(message, indent=False): pretty_message = message.pretty_repr(html=True) if not indent: print(pretty_message) return indented = "\n".join("\t" + c for c in pretty_message.split("\n")) print(indented) def pretty_print_messages(update, last_message=False): is_subgraph = False if isinstance(update, tuple): ns, update = update # skip parent graph updates in the printouts if len(ns) == 0: return graph_id = ns[-1].split(":")[0] print(f"Update from subgraph {graph_id}:") print("\n") is_subgraph = True for node_name, node_update in update.items(): update_label = f"Update from node {node_name}:" if is_subgraph: update_label = "\t" + update_label print(update_label) print("\n") messages = convert_to_messages(node_update["messages"]) if last_message: messages = messages[-1:] for m in messages: pretty_print_message(m, indent=is_subgraph) print("\n") def clean_response(response): match = re.search(r'FINAL ANSWER:\s*(.+)', response['supervisor']['messages'][-1].content) answer = match.group(1).strip() if match else None if answer is None : answer = "pas de réponse" return answer def response_from_agent(supervisor, question): for chunk in supervisor.stream( {"messages": [{"role": "user", "content": question}]} ): response = chunk pretty_print_messages(chunk) response = clean_response(response) return response def load_data(question): task_id = question.get('task_id') file_name = question.get('file_name') if file_name == "": return 'There is no attached file' files_response = requests.get(f"https://agents-course-unit4-scoring.hf.space/files/{task_id}") if files_response.status_code == 404: return 'Le lien ne fonctionne pas' if file_name.endswith('.xlsx'): excel_data = BytesIO(files_response.content) df = pd.read_excel(excel_data) data_dict = df.to_dict(orient="list") return data_dict elif file_name.endswith('.png'): response = client.responses.create( model="gpt-4.1-mini", input=[{ "role": "user", "content": [ {"type": "input_text", "text": "what's in this image? Please give as much details as possible"}, { "type": "input_image", "image_url": f"https://agents-course-unit4-scoring.hf.space/files/{task_id}", }, ], }], ) return response.output_text elif file_name.endswith('.mp3'): audio_bytes = BytesIO(files_response.content) audio_bytes.name = "audio.mp3" transcription = client.audio.transcriptions.create( model="whisper-1", # ou "whisper-1", mais "gpt-4o" est aussi correct file=audio_bytes ) return transcription.text else : return 'there is no attached file'