From d662ddc9f6192e3df27bbcde8d479beb66e23b01 Mon Sep 17 00:00:00 2001 From: Benedito Gustavo Lobo Date: Tue, 12 Aug 2025 13:04:34 +0000 Subject: [PATCH] Adicionar ollama-cli --- ollama-cli | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 ollama-cli diff --git a/ollama-cli b/ollama-cli new file mode 100644 index 0000000..9fb56b9 --- /dev/null +++ b/ollama-cli @@ -0,0 +1,176 @@ +import ollama +import subprocess +import json +import os +import requests +from duckduckgo_search import DDGS + +# Coloque sua chave da OpenWeatherMap aqui +OPENWEATHER_KEY = "SUA_CHAVE_AQUI" + +# Ferramentas disponíveis +tools = [ + { + "type": "function", + "function": { + "name": "rodar_comando", + "description": "Executa um comando no terminal e retorna a saída", + "parameters": { + "type": "object", + "properties": { + "cmd": {"type": "string", "description": "Comando shell"} + }, + "required": ["cmd"] + } + } + }, + { + "type": "function", + "function": { + "name": "buscar_web", + "description": "Faz uma busca na web e retorna links e descrições", + "parameters": { + "type": "object", + "properties": { + "query": {"type": "string", "description": "Termo de busca"} + }, + "required": ["query"] + } + } + }, + { + "type": "function", + "function": { + "name": "ler_arquivo", + "description": "Lê o conteúdo de um arquivo do disco", + "parameters": { + "type": "object", + "properties": { + "path": {"type": "string", "description": "Caminho do arquivo"} + }, + "required": ["path"] + } + } + }, + { + "type": "function", + "function": { + "name": "salvar_arquivo", + "description": "Cria ou sobrescreve um arquivo com conteúdo fornecido", + "parameters": { + "type": "object", + "properties": { + "path": {"type": "string", "description": "Nome do arquivo"}, + "conteudo": {"type": "string", "description": "Conteúdo a salvar"} + }, + "required": ["path", "conteudo"] + } + } + }, + { + "type": "function", + "function": { + "name": "listar_arquivos", + "description": "Lista arquivos e pastas de um diretório", + "parameters": { + "type": "object", + "properties": { + "path": {"type": "string", "description": "Caminho da pasta"} + }, + "required": ["path"] + } + } + }, + { + "type": "function", + "function": { + "name": "obter_clima", + "description": "Obtém o clima atual de uma cidade via OpenWeatherMap", + "parameters": { + "type": "object", + "properties": { + "cidade": {"type": "string", "description": "Nome da cidade"} + }, + "required": ["cidade"] + } + } + } +] + +# Execução das ferramentas +def executar_tool(name, args): + try: + if name == "rodar_comando": + return subprocess.getoutput(args["cmd"]) + + elif name == "buscar_web": + resultados = DDGS().text(args["query"], max_results=5) + return json.dumps(list(resultados), indent=2, ensure_ascii=False) + + elif name == "ler_arquivo": + if not os.path.exists(args["path"]): + return "Arquivo não encontrado." + with open(args["path"], "r", encoding="utf-8", errors="ignore") as f: + return f.read() + + elif name == "salvar_arquivo": + with open(args["path"], "w", encoding="utf-8") as f: + f.write(args["conteudo"]) + return f"Arquivo '{args['path']}' salvo com sucesso." + + elif name == "listar_arquivos": + if not os.path.exists(args["path"]): + return "Diretório não encontrado." + return "\n".join(os.listdir(args["path"])) + + elif name == "obter_clima": + url = f"http://api.openweathermap.org/data/2.5/weather?q={args['cidade']}&appid={OPENWEATHER_KEY}&units=metric&lang=pt" + resp = requests.get(url).json() + if "main" in resp: + return f"{resp['name']}: {resp['main']['temp']}°C, {resp['weather'][0]['description']}" + return f"Erro ao obter clima: {resp}" + + else: + return "Ferramenta desconhecida." + except Exception as e: + return f"Erro: {e}" + +# Loop de chat +mensagens = [] + +while True: + pergunta = input("Você: ") + mensagens.append({"role": "user", "content": pergunta}) + + resposta = ollama.chat( + model="llama3.1:8b", + messages=mensagens, + tools=tools + ) + + # Se houver chamada de ferramenta + if "message" in resposta and "tool_calls" in resposta["message"]: + for call in resposta["message"]["tool_calls"]: + nome = call["function"]["name"] + args_raw = call["function"]["arguments"] + if isinstance(args_raw, str): + argumentos = json.loads(args_raw) + else: + argumentos = args_raw + + print(f"[Ollama chamou '{nome}' com {argumentos}]") + resultado = executar_tool(nome, argumentos) + + mensagens.append({ + "role": "tool", + "name": nome, + "content": resultado + }) + + resposta_final = ollama.chat( + model="llama3.1:8b", + messages=mensagens + ) + print("Ollama:", resposta_final["message"]["content"]) + else: + print("Ollama:", resposta["message"]["content"]) \ No newline at end of file