Explore os recursos avançados da plataforma Deepze AI para maximizar seu potencial
A Deepze permite a criação de ferramentas personalizadas em Python que podem ser utilizadas pelos modelos de IA para executar ações e obter informações adicionais em tempo real.
Ferramentas são scripts Python fornecidos ao modelo de IA no momento da solicitação. Elas permitem que os modelos executem ações e recebam contexto adicional como resultado. Em geral, seu modelo de IA precisa suportar chamadas de função (function calling) para que as ferramentas sejam utilizadas de forma confiável.
As ferramentas habilitam diversos casos de uso, incluindo:
Para usar uma ferramenta, siga estes passos:
Uma vez habilitadas, você pode acessar as ferramentas clicando no ícone "+" durante uma conversa com o modelo. Importante notar que habilitar uma ferramenta não força seu uso - apenas disponibiliza essa opção para o modelo.
Interface de uso de ferramentas no chat
Existem duas maneiras de instalar ferramentas na plataforma:
Interface do editor de ferramentas Python
As ferramentas são definidas em um único arquivo Python, com uma docstring de nível superior contendo metadados e uma classe Tools.
"""
title: Inversor de String
author: Seu Nome
author_url: https://seusite.com
git_url: https://github.com/seunome/string-reverse.git
description: Esta ferramenta calcula o inverso de uma string
version: 1.0.0
licence: MIT
requirements: requests, pandas
"""
class Tools:
def __init__(self):
"""Inicializa a Ferramenta."""
self.valves = self.Valves()
class Valves(BaseModel):
api_key: str = Field("", description="Sua chave de API")
def inverter_string(self, texto: str) -> str:
"""
Inverte a string de entrada.
:param texto: A string para inverter
"""
# exemplo de uso de válvulas
if self.valves.api_key != "42":
return "Chave de API incorreta"
return texto[::-1]
Componentes importantes de uma ferramenta personalizada:
Os emissores de eventos (Event Emitters) permitem adicionar informações adicionais à interface de chat durante a execução da ferramenta:
def buscar_cliente(id_cliente):
"""
Busca informações de um cliente pelo ID
Args:
id_cliente (str): O identificador único do cliente
Returns:
dict: Dados do cliente ou mensagem de erro
"""
import requests
# Configuração da API interna (exemplo)
API_URL = "https://api.interna.suaempresa.com/clientes"
API_KEY = os.environ.get("API_KEY_INTERNA")
try:
# Fazendo a requisição à API interna
response = requests.get(
f"{API_URL}/{id_cliente}",
headers={"Authorization": f"Bearer {API_KEY}"}
)
if response.status_code == 200:
return response.json()
elif response.status_code == 404:
return {"erro": "Cliente não encontrado"}
else:
return {"erro": f"Erro na API: {response.status_code}"}
except Exception as e:
return {"erro": f"Exceção: {str(e)}"}
Você pode especificar dependências externas na seção de metadados da ferramenta. Quando você salva, a plataforma executará pip install para todas as dependências listadas:
"""
title: MinhaFerramenta
author: Meu Nome
version: 1.0.0
license: GPLv3
description: Uma descrição da minha ferramenta
requirements: requests>=2.28.0,pandas,beautifulsoup4
"""
As Pipe Functions permitem criar modelos personalizados na plataforma Deepze, adicionando lógica customizada e processamento específico para suas necessidades.
Imagine a Deepze como um sistema de encanamento onde os dados fluem através de tubos e válvulas. Nessa analogia:
Ao criar um Pipe, você está essencialmente construindo um modelo personalizado com o comportamento específico que deseja, tudo dentro do framework da Deepze.
Vamos começar com uma versão básica de um Pipe para entender sua estrutura:
from pydantic import BaseModel, Field
class Pipe:
class Valves(BaseModel):
MODEL_ID: str = Field(default="")
def __init__(self):
self.valves = self.Valves()
def pipe(self, body: dict):
# Lógica vai aqui
print(self.valves, body) # Isso imprimirá as opções de configuração e o corpo de entrada
return "Olá, Mundo!"
A classe Pipe é onde você define sua lógica personalizada. Ela atua como o blueprint para seu plugin, determinando como ele se comporta dentro da Deepze.
Valves é uma classe aninhada dentro de Pipe, herdando de BaseModel. Ela contém as opções de configuração (parâmetros) que persistem durante o uso do seu Pipe.
Pense nas Valves como os botões em um sistema de encanamento real que controlam o fluxo de água. No seu Pipe, as Valves permitem que os usuários ajustem configurações que influenciam como os dados fluem e são processados.
O método construtor para a classe Pipe. Inicializa o estado do Pipe e configura quaisquer componentes necessários.
def __init__(self):
self.valves = self.Valves()
A função principal onde reside sua lógica personalizada. Processa os dados de entrada usando sua lógica personalizada e retorna o resultado.
def pipe(self, body: dict):
# Lógica vai aqui
print(self.valves, body) # Isso imprimirá as opções de configuração e o corpo de entrada
return "Olá, Mundo!"
Se você quiser que seu Pipe crie múltiplos modelos dentro da Deepze, você pode fazer isso definindo uma função ou variável pipes dentro da sua classe Pipe:
from pydantic import BaseModel, Field
class Pipe:
class Valves(BaseModel):
MODEL_ID: str = Field(default="")
def __init__(self):
self.valves = self.Valves()
def pipes(self):
return [
{"id": "model_id_1", "name": "modelo_1"},
{"id": "model_id_2", "name": "modelo_2"},
{"id": "model_id_3", "name": "modelo_3"},
]
def pipe(self, body: dict):
# Lógica vai aqui
print(self.valves, body) # Imprime as opções de configuração e o corpo de entrada
model = body.get("model", "")
return f"{model}: Olá, Mundo!"
A função pipes retorna uma lista de dicionários, onde cada dicionário representa um modelo com chaves id e name únicas. Esses modelos aparecerão individualmente no seletor de modelos da Deepze.
Vamos ver um exemplo prático onde criaremos um Pipe que funciona como proxy para uma API externa. Este Pipe buscará modelos disponíveis da API e permitirá que os usuários interajam com eles através da Deepze.
from pydantic import BaseModel, Field
import requests
class Pipe:
class Valves(BaseModel):
NAME_PREFIX: str = Field(
default="API_EXTERNA/",
description="Prefixo a ser adicionado antes dos nomes dos modelos.",
)
API_BASE_URL: str = Field(
default="https://api.exemplo.com/v1",
description="URL base para acessar os endpoints da API externa.",
)
API_KEY: str = Field(
default="",
description="Chave de API para autenticar requisições à API externa.",
)
def __init__(self):
self.valves = self.Valves()
def pipes(self):
if self.valves.API_KEY:
try:
headers = {
"Authorization": f"Bearer {self.valves.API_KEY}",
"Content-Type": "application/json",
}
r = requests.get(
f"{self.valves.API_BASE_URL}/models", headers=headers
)
models = r.json()
return [
{
"id": model["id"],
"name": f'{self.valves.NAME_PREFIX}{model.get("name", model["id"])}',
}
for model in models["data"]
if "gpt" in model["id"]
]
except Exception as e:
return [
{
"id": "error",
"name": "Erro ao buscar modelos. Verifique sua chave de API.",
},
]
else:
return [
{
"id": "error",
"name": "Chave de API não fornecida.",
},
]
def pipe(self, body: dict, __user__: dict):
print(f"pipe:{__name__}")
headers = {
"Authorization": f"Bearer {self.valves.API_KEY}",
"Content-Type": "application/json",
}
# Extrair ID do modelo a partir do nome do modelo
model_id = body["model"][body["model"].find(".") + 1 :]
# Atualizar o ID do modelo no corpo
payload = {**body, "model": model_id}
try:
r = requests.post(
url=f"{self.valves.API_BASE_URL}/chat/completions",
json=payload,
headers=headers,
stream=True,
)
r.raise_for_status()
if body.get("stream", False):
return r.iter_lines()
else:
return r.json()
except Exception as e:
return f"Erro: {e}"
Função pipe: A função principal onde você processa os dados de entrada e gera uma saída. Ela lida com a lógica para um único modelo.
Função pipes: Permite que seu Pipe represente múltiplos modelos retornando uma lista de definições de modelo. Cada modelo aparecerá individualmente na interface da Deepze.
As Filter Functions são um sistema de plugins flexível e poderoso para modificar dados antes de serem enviados ao modelo de IA (entrada) ou após serem retornados pelo modelo (saída).
Imagine a Deepze como um fluxo de água correndo através de tubulações:
Os Filters ficam no meio do fluxo — como pontos de verificação — onde você decide o que precisa ser ajustado.
Vamos começar com a representação mais simples de uma Filter Function:
from pydantic import BaseModel
from typing import Optional
class Filter:
# Valves: Opções de configuração para o filtro
class Valves(BaseModel):
pass
def __init__(self):
# Inicializa valves (configuração opcional para o Filter)
self.valves = self.Valves()
def inlet(self, body: dict) -> dict:
# Aqui é onde você manipula as entradas do usuário.
print(f"inlet chamado: {body}")
return body
def stream(self, event: dict) -> dict:
# Aqui é onde você modifica fragmentos transmitidos da saída do modelo.
print(f"evento stream: {event}")
return event
def outlet(self, body: dict) -> None:
# Aqui é onde você manipula as saídas do modelo.
print(f"outlet chamado: {body}")
return body
Pense nas Valves como os botões e controles deslizantes para o seu filtro. Se você quiser dar aos usuários opções configuráveis para ajustar o comportamento do seu Filter, você as define aqui.
class Valves(BaseModel):
NOME_OPCAO: str = "Valor Padrão"
Por exemplo: Se você estiver criando um filtro que converte respostas em maiúsculas, você pode permitir que os usuários configurem se cada saída é totalmente capitalizada via uma válvula como TRANSFORMAR_MAIUSCULAS: bool = True/False.
A função inlet é como preparar alimentos antes de cozinhar. Antes que os ingredientes entrem na receita (o modelo de IA neste caso), você pode lavar vegetais, picar cebolas ou temperar a carne.
Entrada:
body
: A entrada bruta da Deepze para o modelo. Está no formato de uma solicitação de chat-completion (geralmente um dicionário que inclui campos como as mensagens da conversa, configurações do modelo e outros metadados).Sua Tarefa:
Modificar e retornar o body. A versão modificada do body é com o que o modelo de IA trabalha, então esta é sua chance de trazer clareza, estrutura e contexto para a entrada.
Exemplo: Adicionar Contexto de Sistema
def inlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
# Adicionar mensagem de sistema para contexto na conversa
mensagem_contexto = {
"role": "system",
"content": "Você está ajudando o usuário a resolver problemas de software."
}
# Inserir o contexto no início do histórico de chat
body.setdefault("messages", []).insert(0, mensagem_contexto)
return body
A função stream é um recurso que permite interceptar e modificar as respostas do modelo em streaming em tempo real.
Diferente da outlet, que processa uma resposta completa, stream opera em fragmentos individuais à medida que são recebidos do modelo.
Quando usar o stream:
Exemplo: Filtrando Emojis de Dados em Streaming
def stream(self, event: dict) -> dict:
for choice in event.get("choices", []):
delta = choice.get("delta", {})
if "content" in delta:
delta["content"] = delta["content"].replace("😊", "") # Remove emojis
return event
A função outlet é como um revisor: organiza a resposta da IA (ou faz alterações finais) após ser processada pelo modelo.
Entrada:
body
: Contém todas as mensagens atuais no chat (histórico do usuário + respostas do modelo).Sua Tarefa:
Modificar este body. Você pode limpar, anexar ou registrar alterações, mas esteja ciente de como cada ajuste afeta a experiência do usuário.
Exemplo: Remover Informações Sensíveis
def outlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
for message in body["messages"]:
message["content"] = message["content"].replace("", "[REDACTED]")
return body
Quer que o modelo sempre saiba que está ajudando um cliente a solucionar problemas de software? Você pode adicionar instruções como "Você é um assistente de solução de problemas de software" a cada consulta do usuário.
class Filter:
def inlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
mensagem_contexto = {
"role": "system",
"content": "Você é um assistente de solução de problemas de software."
}
body.setdefault("messages", []).insert(0, mensagem_contexto)
return body
Retornando saída em Markdown ou outro estilo formatado? Use a função outlet!
class Filter:
def outlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
# Adicionar markdown de "destaque" para cada resposta
for message in body["messages"]:
if message["role"] == "assistant": # Alvo: resposta do modelo
message["content"] = f"**{message['content']}**" # Destacar com Markdown
return body
Os Filters modificam dados indo para e vindo dos modelos, mas não interagem significativamente com a lógica fora dessas fases. Os Pipes, por outro lado:
Você pode, mas não é a melhor prática:
Use stream quando:
Use outlet quando:
A API da Deepze permite integrar os recursos de IA diretamente em suas aplicações e sistemas, oferecendo total flexibilidade para automação e integração com seu ecossistema tecnológico.
Para garantir o acesso seguro à API, a autenticação é obrigatória. Você pode autenticar suas requisições API usando o mecanismo Bearer Token:
curl -H "Authorization: Bearer SUA_CHAVE_API" https://nome_cliente.chat.deepze.ai/api/v1/models
Endpoint: GET /api/v1/models
Recupera todos os modelos disponíveis na plataforma Deepze.
curl -H "Authorization: Bearer SUA_CHAVE_API" https://nome_cliente.chat.deepze.ai/api/v1/models
Endpoint: POST /api/v1/chat/completions
Gera respostas de chat usando o modelo especificado. Compatível com padrão OpenAI.
Exemplo Curl:
curl -X POST https://nome_cliente.chat.deepze.ai/api/v1/chat/completions \
-H "Authorization: Bearer SUA_CHAVE_API" \
-H "Content-Type: application/json" \
-d '{
"model": "llm-grande",
"messages": [
{
"role": "user",
"content": "Por que o céu é azul?"
}
]
}'
Exemplo Python:
import requests
def chat_com_modelo(token):
url = 'https://nome_cliente.chat.deepze.ai/api/v1/chat/completions'
headers = {
'Authorization': f'Bearer {token}',
'Content-Type': 'application/json'
}
data = {
"model": "llm-grande",
"messages": [
{
"role": "user",
"content": "Por que o céu é azul?"
}
]
}
response = requests.post(url, headers=headers, json=data)
return response.json()
O recurso RAG permite enriquecer as respostas incorporando dados de fontes externas. Veja como gerenciar arquivos e coleções de conhecimento via API:
Endpoint: POST /api/v1/files/
Carrega um arquivo para a plataforma. O conteúdo do arquivo é automaticamente extraído e armazenado em um banco de dados vetorial.
curl -X POST -H "Authorization: Bearer SUA_CHAVE_API" -H "Accept: application/json" \
-F "file=@/caminho/para/seu/arquivo" https://nome_cliente.chat.deepze.ai/api/v1/files/
Endpoint: POST /api/v1/knowledge/{id}/file/add
Adiciona um arquivo carregado a uma coleção de conhecimento existente.
curl -X POST https://nome_cliente.chat.deepze.ai/api/v1/knowledge/{knowledge_id}/file/add \
-H "Authorization: Bearer SUA_CHAVE_API" \
-H "Content-Type: application/json" \
-d '{"file_id": "seu-file-id-aqui"}'
Aproveite uma coleção de conhecimento para enriquecer a resposta:
curl -X POST https://nome_cliente.chat.deepze.ai/api/v1/chat/completions \
-H "Authorization: Bearer SUA_CHAVE_API" \
-H "Content-Type: application/json" \
-d '{
"model": "llm-grande",
"messages": [
{"role": "user", "content": "Forneça insights sobre as perspectivas históricas abordadas na coleção."}
],
"files": [
{"type": "collection", "id": "seu-collection-id-aqui"}
]
}'
A API Deepze oferece diversos benefícios: