Adicionar ollama-cli
This commit is contained in:
176
ollama-cli
Normal file
176
ollama-cli
Normal 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"])
|
Reference in New Issue
Block a user