Adicionar ollama-cli

This commit is contained in:
2025-08-12 13:04:34 +00:00
commit d662ddc9f6

176
ollama-cli Normal file
View File

@@ -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"])