diff --git a/robovojtik.py b/robovojtik.py index 857dd24..cb9bfcb 100644 --- a/robovojtik.py +++ b/robovojtik.py @@ -34,7 +34,7 @@ FUNCTIONS = [ # === 3. Pomocné funkce === def vytvor_nove_vlakno(): - """Vytvoří nové vlákno pro zachování historie.""" + """Vytvoří nové vlákno pro zachování historie konverzace.""" thread = openai.beta.threads.create() return thread.id @@ -47,7 +47,7 @@ def spust_prikaz(prikaz): return f"Chyba při vykonávání příkazu:\n{e.output}" def posli_dotaz_do_assistenta(prompt): - """Odesílá dotaz (v přirozeném jazyce) do asistenta a vrací jeho návrh příkazu.""" + """Odesílá dotaz v přirozeném jazyce do asistenta a vrací jeho odpověď.""" global thread_id if thread_id is None: thread_id = vytvor_nove_vlakno() @@ -73,7 +73,7 @@ def posli_dotaz_do_assistenta(prompt): return messages.data[0].content[0].text.value def posli_prikaz_do_assistenta(command): - """Odesílá schválený příkaz k vykonání asistentovi pomocí funkce execute_shell_command.""" + """Odesílá schválený příkaz k vykonání asistentovi a vrací výstup příkazu.""" global thread_id if thread_id is None: thread_id = vytvor_nove_vlakno() @@ -112,16 +112,41 @@ def posli_prikaz_do_assistenta(command): messages = openai.beta.threads.messages.list(thread_id=thread_id) return messages.data[0].content[0].text.value +def is_command_response(response): + """Vrací True, pokud odpověď začíná prefixem indikujícím návrh příkazu.""" + return response.strip().lower().startswith("navrhovaný příkaz:") + +def extract_command(response): + """Odstraní prefix 'Navrhovaný příkaz:' a vrátí čistý shellový příkaz.""" + prefix = "navrhovaný příkaz:" + if response.strip().lower().startswith(prefix): + return response.strip()[len(prefix):].strip() + return response.strip() + +def provide_help(): + """Vrací text s nápovědou o funkcích Robovojtíka.""" + help_text = ( + "Nápověda k Robovojtikovi – Linuxový Shell Asistent:\n\n" + "Funkce:\n" + " • Převádí dotazy v přirozeném jazyce na návrhy shellových příkazů.\n" + " • Před spuštěním příkazu vždy čeká na potvrzení od uživatele.\n" + " • Přímé příkazy zadejte s prefixem 'cmd:' (např. 'cmd: ls -la').\n" + " • Pro ukončení Robovojtíka zadejte 'vypni' nebo 'exit'.\n\n" + "Pokud potřebujete další pomoc, zeptejte se!" + ) + return help_text + # === 4. Hlavní interaktivní smyčka === def main(): 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'.") - + print("Pro nápovědu zadej 'nápověda' nebo 'help'.") + while True: user_input = input("\nZadej příkaz v přirozeném jazyce: ").strip() - # Ukončení shellu Robovojtíka + # Ukončení 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": @@ -131,6 +156,11 @@ def main(): print("Ukončení zrušeno. Pokračuji.") continue + # Zobrazení nápovědy + if user_input.lower() in ["nápověda", "help"]: + print("\n" + provide_help()) + continue + # Přímý příkaz bez asistenta if user_input.startswith("cmd:"): command = user_input[4:].strip() @@ -144,18 +174,27 @@ def main(): print("Příkaz nebyl spuštěn.") continue - # Normální dotaz pro asistenta, který navrhne příkaz + # Dotaz pro asistenta – očekává návrh příkazu assistant_response = posli_dotaz_do_assistenta(user_input) + + # Pokud odpověď nevypadá jako návrh příkazu, zobrazíme ji jako informativní odpověď + if not is_command_response(assistant_response): + print("\nRobovojtík odpovídá:") + print(assistant_response) + continue + + # Pokud odpověď obsahuje navržený příkaz, vyzveme uživatele k potvrzení print("\nRobovojtík navrhuje příkaz:") print(assistant_response) potvrzeni = input("Spustit tento příkaz? (y/n): ").strip().lower() if potvrzeni == "y": - execution_result = posli_prikaz_do_assistenta(assistant_response) + command_to_execute = extract_command(assistant_response) + execution_result = posli_prikaz_do_assistenta(command_to_execute) print("\nVýstup příkazu:") print(execution_result) else: print("Příkaz nebyl spuštěn. Čekám na další vstup.") if __name__ == "__main__": - main() + main( \ No newline at end of file