From 39b6842b98eff040a3eb87ff65533f93fa0454a8 Mon Sep 17 00:00:00 2001 From: sinuhet Date: Wed, 19 Mar 2025 23:45:30 +0100 Subject: [PATCH] =?UTF-8?q?nov=C3=A1=20verze?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robovojtik.py | 80 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/robovojtik.py b/robovojtik.py index 712bdc9..857dd24 100644 --- a/robovojtik.py +++ b/robovojtik.py @@ -3,8 +3,9 @@ import subprocess import time import configparser import json +import sys -# === 1. Načtení konfigurace === +# === 1. Načtení konfigurace z config.ini === config = configparser.ConfigParser() config.read("config.ini") @@ -12,7 +13,7 @@ openai.api_key = config["OpenAI"]["api_key"] ASSISTANT_ID = config["OpenAI"]["assistant_id"] thread_id = None -# === 2. Definice funkcí pro asistenta === +# === 2. Definice funkcí, které asistent může volat === FUNCTIONS = [ { "name": "execute_shell_command", @@ -31,6 +32,7 @@ FUNCTIONS = [ } ] +# === 3. Pomocné funkce === def vytvor_nove_vlakno(): """Vytvoří nové vlákno pro zachování historie.""" thread = openai.beta.threads.create() @@ -45,65 +47,59 @@ def spust_prikaz(prikaz): return f"Chyba při vykonávání příkazu:\n{e.output}" def posli_dotaz_do_assistenta(prompt): - """Pošle dotaz do asistenta a získá návrh příkazu.""" + """Odesílá dotaz (v přirozeném jazyce) do asistenta a vrací jeho návrh příkazu.""" global thread_id if thread_id is None: thread_id = vytvor_nove_vlakno() - + openai.beta.threads.messages.create( thread_id=thread_id, role="user", content=prompt ) - + run = openai.beta.threads.runs.create( thread_id=thread_id, assistant_id=ASSISTANT_ID ) - + while True: run_status = openai.beta.threads.runs.retrieve(thread_id=thread_id, run_id=run.id) - if run_status.status == "completed": break time.sleep(1) - + messages = openai.beta.threads.messages.list(thread_id=thread_id) return messages.data[0].content[0].text.value def posli_prikaz_do_assistenta(command): - """Pošle asistentovi schválený příkaz k provedení.""" + """Odesílá schválený příkaz k vykonání asistentovi pomocí funkce execute_shell_command.""" global thread_id if thread_id is None: thread_id = vytvor_nove_vlakno() - + run = openai.beta.threads.runs.create( thread_id=thread_id, assistant_id=ASSISTANT_ID, instructions=f"Prosím, spusť tento příkaz: {command}" ) - + while True: run_status = openai.beta.threads.runs.retrieve(thread_id=thread_id, run_id=run.id) - if run_status.status == "requires_action": tool_calls = run_status.required_action.submit_tool_outputs.tool_calls tool_outputs = [] - for tool_call in tool_calls: tool_name = tool_call.function.name arguments = json.loads(tool_call.function.arguments) - if tool_name == "execute_shell_command": vysledek = spust_prikaz(arguments["command"]) else: vysledek = "Neznámá funkce." - tool_outputs.append({ "tool_call_id": tool_call.id, "output": vysledek }) - openai.beta.threads.runs.submit_tool_outputs( thread_id=thread_id, run_id=run.id, @@ -111,31 +107,55 @@ def posli_prikaz_do_assistenta(command): ) elif run_status.status == "completed": break - time.sleep(1) - + messages = openai.beta.threads.messages.list(thread_id=thread_id) return messages.data[0].content[0].text.value +# === 4. Hlavní interaktivní smyčka === def main(): - print("Linuxový shell s OpenAI Assistant v2 API a funkcemi. Napiš 'exit' pro ukončení.") + print("Linuxový shell s OpenAI Assistant v2 API a funkcemi.") + print("Pro přímý příkaz použij prefix 'cmd:'") + print("Pro ukončení Robovojtíka zadej 'vypni' nebo 'exit'.") while True: - user_input = input("\nZadej příkaz v přirozeném jazyce: ") - if user_input.strip().lower() == "exit": - break - - assistant_odpoved = posli_dotaz_do_assistenta(user_input) + user_input = input("\nZadej příkaz v přirozeném jazyce: ").strip() + + # Ukončení shellu Robovojtíka + if user_input.lower() in ["vypni", "exit"]: + potvrzeni = input("Skutečně chceš ukončit Robovojtíka? (y/n): ").strip().lower() + if potvrzeni == "y": + print("Ukončuji Robovojtíka...") + sys.exit(0) + else: + print("Ukončení zrušeno. Pokračuji.") + continue + + # Přímý příkaz bez asistenta + if user_input.startswith("cmd:"): + command = user_input[4:].strip() + print(f"Rozpoznán přímý příkaz: {command}") + potvrzeni = input("Spustit tento příkaz? (y/n): ").strip().lower() + if potvrzeni == "y": + vysledek = spust_prikaz(command) + print("\nVýstup příkazu:") + print(vysledek) + else: + print("Příkaz nebyl spuštěn.") + continue + + # Normální dotaz pro asistenta, který navrhne příkaz + assistant_response = posli_dotaz_do_assistenta(user_input) print("\nRobovojtík navrhuje příkaz:") - print(assistant_odpoved) - - potvrzeni = input("\nSpustit tento příkaz? (y/n): ").strip().lower() + print(assistant_response) + + potvrzeni = input("Spustit tento příkaz? (y/n): ").strip().lower() if potvrzeni == "y": - vysledek = posli_prikaz_do_assistenta(assistant_odpoved) + execution_result = posli_prikaz_do_assistenta(assistant_response) print("\nVýstup příkazu:") - print(vysledek) + print(execution_result) else: - print("❌ Příkaz nebyl spuštěn.") + print("Příkaz nebyl spuštěn. Čekám na další vstup.") if __name__ == "__main__": main()