
Documentação Oficial da 0dAPI
Comece!
pip install zerodai==0.0.0.20
export zerodapi_key="TU_API_KEY"
Obtenha sua api key https://zerodai.com Chat Conversacional Simples - Sem memória
from zerodai import zerodai
import os
zerodai.api_auth(os.getenv("zerodapi_key"))
messages = []
while True:
prompt = input("> ")
if prompt == "exit":
break
messages.append({"role": "user", "content": prompt})
messages.append({"role": "system", "content": "Eres 0dAI um assistente de cibersegurança cuja única função é..."})
zerodai.inference(model="0dai70b", messages=messages, temperature=0.7, stream=True)
Zerodai é uma biblioteca de processamento de linguagem natural orientada à cibersegurança que busca automatizar parcialmente processos baseados no processamento humano de informações, raciocínio, planejamento e execução. Buscamos criar um framework de agentes para cibersegurança com as seguintes capacidades:
É o método base de interação com o modelo e conta com os seguintes parâmetros. É importante que estes parâmetros sejam aprendidos e compreendidos bem, pois são a base da biblioteca.
model: O modelo de linguagem a ser utilizado. Os modelos disponíveis são:
0dai7b: Modelo básico com uso ilimitado, rápido e perfeito para conversas simples e assistência em programação. Defende bem em cibersegurança.
0dai8x7b: Modelo flexível com uma janela de contexto grande, nível GPT-4 em termos de código, bom para perguntas e scripts complexos de cibersegurança.
0daifn: Modelo recomendado para function calls, o melhor em function calls, muito contexto, mais leve que 0dai70b, além disso, em nível de function calls multipasso está ao nível do melhor gpt
0dai70b (Recomendado): Atualmente SOTA em cibersegurança, capaz de fazer complexos raciocínios lógicos com base em muito contexto e resolver testes de pentesting de forma semiautônoma. Conta com function calls e pode responder em mensagens estruturadas. É o mais lento, mas oferece um grande salto de qualidade.
messages: As mensagens que serão enviadas ao modelo. Aqui temos que entender 3 papéis:
As mensagens devem seguir este formato:
messages = [
{"role": "system", "content": """Você é 0dAI, sua função é..."""},
{"role": "user", "content": "0dAI escreva um exploit em C"},
]
functions: As funções que podem ser chamadas durante a interação. Iremos detalhar mais sobre as funções em fn_c. Neste caso, simplesmente nos dará o JSON.
Uma função é declarada assim:
function_shodan = [ {
"name": "shodan_dork",
"description": "This tools is used to generate a shodan query",
"parameter_definitions": {
"dork": {
"type": "string",
"description": "The shodan dork",
"required": True
}
}
}, ]
temperature: Controla a aleatoriedade das respostas do modelo. Quanto maior a temperatura, mais aleatoriedade; quanto menor a temperatura, menos aleatoriedade.
stream (bool): Se deve transmitir a resposta em tempo real.
from zerodai import zerodai
messages = []
messages.append({"role": "user", "content": prompt})
messages.append({"role": "system", "content": "Você é 0dAI, um assistente de cibersegurança cuja única função é..."})
zerodai.inference(model="0dai70b", messages=messages, temperature=0.7, stream=True)
Com base em uma função ou uma lista de funções no parâmetro function, o Modelo será capaz de gerar uma resposta estruturada que nos possa servir após uma inferência: Função base
function_shodan = [ {
"name": "shodan_dork",
"description": "This tools is used to generate a shodan query",
"parameter_definitions": {
"dork": {
"type": "string",
"description": "The shodan dork",
"required": True
}
}
}, ]
Resposta do modelo com base nesta função
[
{
"tool_name": "shodan_dork",
"parameters": {
"dork": "hacked-router-help-sos"
}
}
]
Estas funções podem ser multipasso ou não, isso será definido pelo número de posições do JSON. Uma resposta multipasso se parece com isso
[
{
"tool_name": "shodan_dork",
"parameters": {
"dork": "hacked-router-help-sos"
}
},
{
"tool_name": "shodan_dork",
"parameters": {
"dork": "\"smb\" \"authentication: disabled\""
}
},
{
"tool_name": "shodan_dork",
"parameters": {
"dork": ".docuword_exploited.txt"
}
}
]
Também pode existir uma lógica recursiva em inferência - função que se retroalimentam. Imaginemos este caso:
Função subdomínios
funcion_subdomains = [ {
"name": "subdominios",
"description": "This tools is used to collect domains to extract subdomains",
"parameter_definitions": {
"domain": {
"type": "string",
"description": "The domain",
"required": True
}
}
}, ]
Função crawler
crawler_endpoints = [ {
"name": "crawler",
"description": "This tools is used to crawle ndpoints for a host",
"parameter_definitions": {
"host": {
"type": "string",
"description": "The domain",
"required": True
}
}
}, ]
Input:
Preciso obter os subdomínios de openai.com e omegaai.io
Output 1. Função:
[
{
"tool_name": "subdomains",
"parameters": {
"domain": "openai.com"
}
},
{
"tool_name": "subdomains",
"parameters": {
"domain": "omegaai.io"
}
},
]
Após extrair os subdomínios do input, aplicamos nossa lógica de execução, que seria obter os subdomínios...
subdomain1.openai.com
subdomain2.openai.com
subdomain3.openai.com
subdomain1.omegaai.io
subdomain2.omegaai.io
subdomain3.omegaai.io
Após passar isso para a função do crawler, seria algo como:
Output 2. Função:
[
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio1.openai.com"
}
},
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio1.omegaai.io"
}
},
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio2.openai.com"
}
},
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio2.omegaai.io"
}
},
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio3.openai.com"
}
},
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio3.omegaai.io"
}
},
]
fn_c O que nos permite é coletar os parâmetros e o nome da tool diretamente sem ter que passar por essa lógica de filtrar o JSON em si.