import openai import subprocess import time import configparser import json import sys # === 1. Načtení konfigurace z config.ini === config = configparser.ConfigParser() config.read("config.ini") openai.api_key = config["OpenAI"]["api_key"] ASSISTANT_ID = config["OpenAI"]["assistant_id"] thread_id = None # === 2. Definice funkcí, které asistent může volat === FUNCTIONS = [ { "name": "execute_shell_command", "description": "Spustí shellový příkaz a vrátí jeho výstup.", "parameters": { "type": "object", "properties": { "command": { "type": "string", "description": "Shellový příkaz k vykonání." } }, "additionalProperties": False, "required": ["command"] } } ] # === 3. Pomocné funkce === def vytvor_nove_vlakno(): """Vytvoří nové vlákno pro zachování historie.""" thread = openai.beta.threads.create() return thread.id def spust_prikaz(prikaz): """Spustí shellový příkaz a vrátí jeho výstup.""" try: output = subprocess.check_output(prikaz, shell=True, stderr=subprocess.STDOUT, universal_newlines=True) return output.strip() except subprocess.CalledProcessError as e: 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.""" 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): """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, tool_outputs=tool_outputs ) 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.") 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: ").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_response) potvrzeni = input("Spustit tento příkaz? (y/n): ").strip().lower() if potvrzeni == "y": execution_result = posli_prikaz_do_assistenta(assistant_response) 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()