import os import json import ollama import gradio OLLAMA_HOST = os.getenv('OLLAMA_HOST', "192.168.10.100:11434") json_code = "```json\n{\n \"classes\": [\n \"http://data.europa.eu/949/ContactLineSystem\"\n ],\n \"properties\": [\n \"http://data.europa.eu/949/contactLineSystemType\",\n \"http://data.europa.eu/949/energySupplySystemTSICompliant\",\n \"http://data.europa.eu/949/conditionsAppliedRegenerativeBraking\",\n \"http://data.europa.eu/949/conditionalRegenerativeBrake\"\n ]\n}\n```" client_gpu_local = ollama.Client(host=f"http://{OLLAMA_HOST}", timeout=15) model = "test_class_prop" model_options = { #"top_k": 40, #"top_p": 0.95, "temperature": 0.5, "repeat_penalty": 1.1, #"num_ctx": 8*1024, #"num_ctx": 128*1024, "keep_alive": 60*60 } def clean_output(): return None def submit_query(msg): if msg != "": try: prompt = f"Identify the classes and properties used in this natural language query: \"{msg}\"" messages = [{'role': 'user', 'content': prompt}] response = client_gpu_local.chat( model, messages=messages, options=model_options ) msg = response.message.content debug = { k:v for k,v in response.dict().items() } debug["eval_t/s"] = debug["eval_count"]/(debug["eval_duration"]/1_000_000_000) debug["prompt_eval_t/s"] = debug["prompt_eval_count"]/(debug["prompt_eval_duration"]/1_000_000_000) print(response) try: json_data_test = json.loads(msg.split("```json")[1].split("```")[0]) return [json.dumps(json_data_test, indent=2), json.dumps(debug, indent=2)] except: return [json.dumps({}, indent=2), json.dumps({"error": "Unable to process result."}, indent=2)] except: raise gradio.Error("Error: LLM request timed out!", duration=5) return [json.dumps({}, indent=2),json.dumps({"error": "No query"}, indent=2)] test_dataset = [ { "instruction": "Identify the classes and properties used in this natural language query: Fornisci il tipo di sistema di linea di contatto, la conformit\u00e0 TSI del sistema di fornitura energetica, l'umax2, le condizioni applicate al frenaggio regenerativo e la corrente massima del treno per i sistemi di linea di contatto. Limita a 1000 risultati.", "input": "", "output": "```json\n{\n \"classes\": [\n \"http://data.europa.eu/949/ContactLineSystem\"\n ],\n \"properties\": [\n \"http://data.europa.eu/949/contactLineSystemType\",\n \"http://data.europa.eu/949/energySupplySystemTSICompliant\",\n \"http://data.europa.eu/949/umax2\",\n \"http://data.europa.eu/949/conditionsAppliedRegenerativeBraking\",\n \"http://data.europa.eu/949/maxTrainCurrent\"\n ]\n}\n```" }, { "instruction": "Identify the classes and properties used in this natural language query: Show me all unique combinations of the maximum magnetic field's directional components along the three axes (X, Y, Z) but only if the X component exceeds -63, and limit this to a total of 20 records.", "input": "", "output": "```json\n{\n \"classes\": [\n \"http://data.europa.eu/949/MaximumMagneticField\"\n ],\n \"properties\": [\n \"http://data.europa.eu/949/maximumMagneticFieldDirectionZ\",\n \"http://data.europa.eu/949/maximumMagneticFieldDirectionY\",\n \"http://data.europa.eu/949/maximumMagneticFieldDirectionX\"\n ]\n}\n```" }, { "instruction": "Identify the classes and properties used in this natural language query: Je souhaite obtenir les coordonn\u00e9es intrins\u00e8ques de d\u00e9but (startIntrinsicCoordinate) et \u00e9ventuellement de fin (endIntrinsicCoordinate) pour chaque \u00e9l\u00e9ment r\u00e9seau (NetElement), en ne consid\u00e9rant que les 100 premiers r\u00e9sultats.", "input": "", "output": "```json\n{\n \"classes\": [\n \"http://data.europa.eu/949/NetElement\"\n ],\n \"properties\": [\n \"http://data.europa.eu/949/endIntrinsicCoordinate\",\n \"http://data.europa.eu/949/startIntrinsicCoordinate\"\n ]\n}\n```" }, { "instruction": "Identify the classes and properties used in this natural language query: Liefere mir bitte die Daten f\u00fcr assistanceStartingTrain (falls vorhanden), Curvature, Id, H\u00f6he und L\u00e4nge der PlatformEdge, wobei die L\u00e4nge nicht gleich -995.7379397044926 sein darf.", "input": "", "output": "```json\n{\n \"classes\": [\n \"http://data.europa.eu/949/PlatformEdge\"\n ],\n \"properties\": [\n \"http://data.europa.eu/949/assistanceStartingTrain\",\n \"http://data.europa.eu/949/hasPlatformCurvature\",\n \"http://data.europa.eu/949/platformId\",\n \"http://data.europa.eu/949/platformHeight\",\n \"http://data.europa.eu/949/lengthOfPlatform\"\n ]\n}\n```" }, { "instruction": "Identify the classes and properties used in this natural language query: Mostra le informazioni distinte su SystemSeparationInfo, inclusi i valori per systemSeparationInfoLength, systemSeparationInfoChangeSupplySystem, systemSeparationInfoKm, systemSeparationInfoSwitchOffBreaker e systemSeparationInfoPantographLowered.", "input": "", "output": "```json\n{\n \"classes\": [\n \"http://data.europa.eu/949/SystemSeparationInfo\"\n ],\n \"properties\": [\n \"http://data.europa.eu/949/systemSeparationInfoLength\",\n \"http://data.europa.eu/949/systemSeparationInfoChangeSupplySystem\",\n \"http://data.europa.eu/949/systemSeparationInfoKm\",\n \"http://data.europa.eu/949/systemSeparationInfoSwitchOffBreaker\",\n \"http://data.europa.eu/949/systemSeparationInfoPantographLowered\"\n ]\n}\n```" }, { "instruction": "Identify the classes and properties used in this natural language query: Elencare tutte le lunghezze univoche di tunnel che hanno una coordinata di partenza di -184.98148684158423.", "input": "", "output": "```json\n{\n \"classes\": [\n \"http://data.europa.eu/949/Tunnel\"\n ],\n \"properties\": [\n \"http://data.europa.eu/949/lengthOfTunnel\",\n \"http://data.europa.eu/949/startLocation\"\n ]\n}\n```" }, { "instruction": "Identify the classes and properties used in this natural language query: Mostra i valori di phaseInfoPantographLowered, phaseInfoLength e phaseInfoKm per tutte le istanze di PhaseInfo dove phaseInfoKm \u00e8 false.", "input": "", "output": "```json\n{\n \"classes\": [\n \"http://data.europa.eu/949/PhaseInfo\"\n ],\n \"properties\": [\n \"http://data.europa.eu/949/phaseInfoPantographLowered\",\n \"http://data.europa.eu/949/phaseInfoLength\",\n \"http://data.europa.eu/949/phaseInfoKm\"\n ]\n}\n```" }, { "instruction": "Identify the classes and properties used in this natural language query: Donnez-moi les informations sur la nature, le d\u00e9but et la fin des op\u00e9rations ainsi que la longueur pour chaque section de ligne, en limitant les r\u00e9sultats \u00e0 100.", "input": "", "output": "```json\n{\n \"classes\": [\n \"http://data.europa.eu/949/SectionOfLine\"\n ],\n \"properties\": [\n \"http://data.europa.eu/949/solNature\",\n \"http://data.europa.eu/949/opStart\",\n \"http://data.europa.eu/949/lengthOfSectionOfLine\",\n \"http://data.europa.eu/949/opEnd\"\n ]\n}\n```" }, ] examples_data = [[e["instruction"].split(": ")[1], e["output"].split("```json")[1].split("```")[0]] for e in test_dataset] with gradio.Blocks() as demo: query = gradio.Textbox(render=False, label="Query", placeholder="Write a query and press Enter.", submit_btn="Send query") code_llm = gradio.Code(render=False, label="LLM output", interactive=False, language="json") metadata_llm = gradio.Code(render=False, label="LLM request metadata", interactive=False, language="json") code_ref = gradio.Code(render=False, label="Expected output", interactive=False, language="json") #chat = gradio.Chatbot(render=False, value=history, label="LLM output", type="messages") with gradio.Row(): query.render() with gradio.Row(): with gradio.Accordion(label="Examples", open=False): gradio.Examples(label="Query examples", examples=examples_data, example_labels=[e[0] for e in examples_data], cache_examples=False, inputs=[query, code_ref],examples_per_page=10) code_ref.render() #with gradio.Row(): #chat.render() with gradio.Row(): code_llm.render() with gradio.Row(): metadata_llm.render() query.submit(submit_query, inputs=[query], outputs=[code_llm, metadata_llm]) #query.change(submit_query, inputs=[query], outputs=[code_llm]) query.change(clean_output, inputs=[], outputs=[code_llm]).then(submit_query, inputs=[query], outputs=[code_llm, metadata_llm]) demo.launch()