interaktivnější verze

This commit is contained in:
sinuhet 2025-03-19 23:52:21 +01:00
parent 39b6842b98
commit 41a392c0de

View File

@ -34,7 +34,7 @@ FUNCTIONS = [
# === 3. Pomocné funkce === # === 3. Pomocné funkce ===
def vytvor_nove_vlakno(): 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() thread = openai.beta.threads.create()
return thread.id return thread.id
@ -47,7 +47,7 @@ def spust_prikaz(prikaz):
return f"Chyba při vykonávání příkazu:\n{e.output}" return f"Chyba při vykonávání příkazu:\n{e.output}"
def posli_dotaz_do_assistenta(prompt): 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 global thread_id
if thread_id is None: if thread_id is None:
thread_id = vytvor_nove_vlakno() thread_id = vytvor_nove_vlakno()
@ -73,7 +73,7 @@ def posli_dotaz_do_assistenta(prompt):
return messages.data[0].content[0].text.value return messages.data[0].content[0].text.value
def posli_prikaz_do_assistenta(command): 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 global thread_id
if thread_id is None: if thread_id is None:
thread_id = vytvor_nove_vlakno() 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) messages = openai.beta.threads.messages.list(thread_id=thread_id)
return messages.data[0].content[0].text.value 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 === # === 4. Hlavní interaktivní smyčka ===
def main(): def main():
print("Linuxový shell s OpenAI Assistant v2 API a funkcemi.") print("Linuxový shell s OpenAI Assistant v2 API a funkcemi.")
print("Pro přímý příkaz použij prefix 'cmd:'") print("Pro přímý příkaz použij prefix 'cmd:'")
print("Pro ukončení Robovojtíka zadej 'vypni' nebo 'exit'.") print("Pro ukončení Robovojtíka zadej 'vypni' nebo 'exit'.")
print("Pro nápovědu zadej 'nápověda' nebo 'help'.")
while True: while True:
user_input = input("\nZadej příkaz v přirozeném jazyce: ").strip() 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"]: if user_input.lower() in ["vypni", "exit"]:
potvrzeni = input("Skutečně chceš ukončit Robovojtíka? (y/n): ").strip().lower() potvrzeni = input("Skutečně chceš ukončit Robovojtíka? (y/n): ").strip().lower()
if potvrzeni == "y": if potvrzeni == "y":
@ -131,6 +156,11 @@ def main():
print("Ukončení zrušeno. Pokračuji.") print("Ukončení zrušeno. Pokračuji.")
continue 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 # Přímý příkaz bez asistenta
if user_input.startswith("cmd:"): if user_input.startswith("cmd:"):
command = user_input[4:].strip() command = user_input[4:].strip()
@ -144,18 +174,27 @@ def main():
print("Příkaz nebyl spuštěn.") print("Příkaz nebyl spuštěn.")
continue 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) 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("\nRobovojtík navrhuje příkaz:")
print(assistant_response) print(assistant_response)
potvrzeni = input("Spustit tento příkaz? (y/n): ").strip().lower() potvrzeni = input("Spustit tento příkaz? (y/n): ").strip().lower()
if potvrzeni == "y": 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("\nVýstup příkazu:")
print(execution_result) print(execution_result)
else: else:
print("Příkaz nebyl spuštěn. Čekám na další vstup.") print("Příkaz nebyl spuštěn. Čekám na další vstup.")
if __name__ == "__main__": if __name__ == "__main__":
main() main(