PT EN ES

Recursos Avançados

Explore os recursos avançados da plataforma Deepze AI para maximizar seu potencial

Criando Ferramentas com Python

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.

O que são Ferramentas?

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:

  • Busca na web em tempo real
  • Extração de dados de páginas web (web scraping)
  • Interações com APIs externas
  • Consultas a bancos de dados
Como usar Ferramentas

Para usar uma ferramenta, siga estes passos:

  1. Navegue até Espaço de Trabalho => Modelos
  2. Selecione o modelo de IA que deseja configurar (precisa suportar function calling)
  3. Clique no ícone de lápis para editar as configurações do modelo
  4. Role até a seção "Ferramentas" e marque as ferramentas que deseja habilitar
  5. Clique em "Salvar" para aplicar as alterações

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.

Uso de ferramentas

Interface de uso de ferramentas no chat

Instalação de Ferramentas

Existem duas maneiras de instalar ferramentas na plataforma:

Importação Manual
  1. Navegue até Espaço de Trabalho => Ferramentas
  2. Clique em "Importar Ferramenta"
  3. Faça upload do arquivo JSON ou Python da ferramenta
  4. Configure os parâmetros necessários e salve
Criação Manual
  1. Acesse Espaço de Trabalho => Ferramentas
  2. Clique em "Criar Nova Ferramenta"
  3. Selecione "Ferramenta Python"
  4. Defina nome, descrição e parâmetros da ferramenta
  5. Escreva o código Python no editor integrado
  6. Teste a ferramenta antes de publicá-la
  7. Configure permissões de acesso
Editor de ferramentas Python

Interface do editor de ferramentas Python

Escrevendo uma Ferramenta Personalizada

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:

  • Docstring de nível superior: Contém metadados como título, autor, descrição e requisitos
  • Classe Tools: Contém todos os métodos que serão expostos como ferramentas
  • Type Hints: Cada método deve ter anotações de tipo para seus argumentos
  • Valves: Subclasse opcional para configurações administradas apenas por administradores
  • UserValves: Subclasse opcional para configurações que qualquer usuário pode modificar
Event Emitters

Os emissores de eventos (Event Emitters) permitem adicionar informações adicionais à interface de chat durante a execução da ferramenta:

  • Status: Mostra mensagens de status durante o processamento da ferramenta
  • Message: Adiciona mensagens ao chat a qualquer momento durante a execução
  • Citation: Fornece citações ou referências no chat
Exemplo de ferramenta com API externa:

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)}"}
                    
Segurança: Todo código é executado em um ambiente isolado (sandbox) para proteger sua infraestrutura. Nunca instale ferramentas de fontes não confiáveis.
Pacotes Externos

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
"""
A instalação de pacotes pode tornar a interface temporariamente não responsiva. Tenha cuidado para não especificar pacotes que possam entrar em conflito com as dependências do sistema.

Funções Pipe: Criando Modelos Personalizados

As Pipe Functions permitem criar modelos personalizados na plataforma Deepze, adicionando lógica customizada e processamento específico para suas necessidades.

Introdução às Pipe Functions

Imagine a Deepze como um sistema de encanamento onde os dados fluem através de tubos e válvulas. Nessa analogia:

  • Pipes são como plugins que permitem introduzir novos caminhos para o fluxo de dados, permitindo injetar lógica e processamento personalizados.
  • Valves (Válvulas) são as partes configuráveis do seu pipe que controlam como os dados fluem através dele.

Ao criar um Pipe, você está essencialmente construindo um modelo personalizado com o comportamento específico que deseja, tudo dentro do framework da Deepze.

Estrutura Básica de um Pipe

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!"
Componentes Principais
A Classe Pipe

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: Configurando seu Pipe

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 __init__

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 pipe

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!"
Sempre coloque Valves no topo da sua classe Pipe, seguido por __init__, e depois a função pipe. Esta estrutura garante clareza e consistência.
Criando Múltiplos Modelos com Pipes

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.

Exemplo: Pipe de Proxy para API Externa

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}"
Frequently Asked Questions

Pipes permitem adicionar novos "modelos" com lógica e processamento personalizados à Deepze. É um sistema de plugins flexível que permite integrar APIs externas, personalizar comportamentos de modelos e criar recursos inovadores sem alterar o código principal.

Valves são os parâmetros configuráveis do seu Pipe. Eles funcionam como configurações ou controles que determinam como seu Pipe opera. Ao ajustar as Valves, você pode alterar o comportamento do seu Pipe sem modificar o código subjacente.

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.

Nunca codifique informações sensíveis como chaves de API diretamente no seu Pipe. Em vez disso, use Valves para inserir e armazenar chaves de API com segurança. Certifique-se de que seu código manipule essas chaves adequadamente e evite registrá-las ou expô-las.
Dica: Ao criar Pipes, siga estas práticas recomendadas:
  • Mantenha uma estrutura clara e consistente em suas classes Pipe.
  • Utilize Valves para opções configuráveis.
  • Trate erros com elegância para melhorar a experiência do usuário.
  • Consulte a documentação mais recente para quaisquer atualizações ou mudanças.

Funções Filter: Modificando Entradas e Saídas

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).

O que são Filters na Deepze?

Imagine a Deepze como um fluxo de água correndo através de tubulações:

  • As entradas do usuário e saídas do modelo são a água.
  • Os Filters são os estágios de tratamento de água que limpam, modificam e adaptam a água antes que ela chegue ao destino final.

Os Filters ficam no meio do fluxo — como pontos de verificação — onde você decide o que precisa ser ajustado.

O que os Filters fazem:
  1. Modificam Entradas do Usuário (Função inlet): Ajustam os dados de entrada antes que cheguem ao modelo de IA. É aqui que você melhora a clareza, adiciona contexto, sanitiza texto ou reformata mensagens para atender a requisitos específicos.
  2. Interceptam Saídas do Modelo (Função stream): Capturam e ajustam as respostas da IA à medida que são geradas pelo modelo. Isso é útil para modificações em tempo real, como filtrar informações sensíveis ou formatar a saída para melhor legibilidade.
  3. Modificam Saídas do Modelo (Função outlet): Ajustam a resposta da IA após ser processada, antes de mostrá-la ao usuário. Isso pode ajudar a refinar, registrar ou adaptar os dados para uma experiência de usuário mais limpa.
Conceito-chave: Os Filters não são modelos independentes, mas ferramentas que aprimoram ou transformam os dados que viajam para e dos modelos.
Estrutura de uma Filter Function

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
Componentes Principais
Classe Valves (Configurações Opcionais)

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.

Função inlet (Pré-Processamento de Entrada)

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
Função stream (Interceptação em Tempo Real)

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:

  • Modificar respostas em streaming antes que sejam exibidas aos usuários.
  • Implementar censura ou limpeza em tempo real.
  • Monitorar dados transmitidos para registro/depuração.

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
Função outlet (Pós-Processamento de Saída)

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
Filters em Ação: Exemplos Práticos
Exemplo #1: Adicionar Contexto a Cada Entrada do Usuário

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
Exemplo #2: Destacar Saídas para Facilitar a Leitura

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
Frequently Asked Questions

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:

  • Podem integrar APIs externas ou transformar significativamente como o backend lida com operações.
  • Expõem lógica personalizada como modelos inteiramente novos.

Você pode, mas não é a melhor prática:

  • Os Filters são projetados para fazer alterações leves ou aplicar registro.
  • Se modificações pesadas forem necessárias, considere uma Pipe Function.

Use stream quando:

  • Precisar modificar fragmentos de texto à medida que são gerados em tempo real.
  • Quiser implementar censura ou formatação em tempo real.
  • Precisar monitorar o fluxo de dados para depuração.

Use outlet quando:

  • Precisar processar a resposta completa após sua geração.
  • Quiser fazer modificações que dependem da resposta inteira.
Resumo: Por que criar Filter Functions?
  1. inlet manipula entradas do usuário (pré-processamento).
  2. stream intercepta e modifica saídas do modelo em streaming (tempo real).
  3. outlet ajusta saídas da IA (pós-processamento).
  4. Filters são ideais para alterações leves e em tempo real no fluxo de dados.
  5. Com Valves, você capacita os usuários a configurar Filters dinamicamente para comportamento personalizado.

API

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.

Autenticação

Para garantir o acesso seguro à API, a autenticação é obrigatória. Você pode autenticar suas requisições API usando o mecanismo Bearer Token:

  • Obtenha sua chave API em Configurações > Conta na plataforma Deepze
  • Inclua essa chave no cabeçalho de autorização de todas as requisições
curl -H "Authorization: Bearer SUA_CHAVE_API" https://nome_cliente.chat.deepze.ai/api/v1/models
Endpoints Principais
Recuperar Todos os Modelos

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
Chat Completions

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()
Retrieval Augmented Generation (RAG)

O recurso RAG permite enriquecer as respostas incorporando dados de fontes externas. Veja como gerenciar arquivos e coleções de conhecimento via API:

Upload de Arquivos

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/
Adicionando Arquivos a Coleções de Conhecimento

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"}'
Usando Coleções em Chat Completions

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"}
      ]
    }'
Vantagens da API Deepze

A API Deepze oferece diversos benefícios:

  • Interface unificada: Simplifique suas interações com diferentes modelos de IA
  • Fácil implementação: Integração rápida com documentação abrangente
  • Compatibilidade com padrões OpenAI: Facilita migração de código existente
  • Controle de segurança: Gerenciamento granular de permissões e tokens