html 🛠️ Desenvolvimento | Nullcore
Pule para o conteúdo principal

🛠️ Desenvolvimento

Escrevendo um kit de ferramentas personalizado

Os kits de ferramentas são definidos em um único arquivo python, com um documento de nível superior com metadados e umToolsaula.

Exemplo Docstring de nível superior

"" "
Título: String Inverse
Autor: Seu nome
Author_url: https://website.com
git_url: https://github.com/username/string-reverse.git
Descrição: Esta ferramenta calcula o inverso de uma string
requerir_open_webui_version: 0.4.0
Requisitos: Langchain-Openai, Langgraph, Ollama, Langchain_ollama
Versão: 0.4.0
Licença: MIT
"" "

Classe de ferramentas

As ferramentas precisam ser definidas como métodos dentro de uma classe chamadaTools, com subclasses opcionais chamadasValveseUserValves, por exemplo:

aula Ferramentas
def __init__auto
"" "Inicialize a ferramenta." ""
autoválvulasautoVálvulas

aula VálvulasBasemodel
api_key str Campo, Assim,descrição"Sua chave da API aqui"

def reverse_stringauto, Assim,corda str str
"" "
Reverte a sequência de entrada.
: param string: a string para reverter
"" "
# Exemplo de uso de válvulas
seautoválvulasapi_key! = "42"
retornar "Chave da API errada"
retornarcorda[[1

Dicas de tipo

Cada ferramenta deve ter dicas de tipo para argumentos. Os tipos também podem ser aninhados, comoqueries_and_docs: list[tuple[str, int]]. Essas dicas de tipo são usadas para gerar o esquema JSON enviado ao modelo. As ferramentas sem dicas de tipo funcionarão com muito menos consistência.

Válvulas e UserValves - (opcional, mas altamente encorajado)

Válvulas e UserValves são usados ​​para especificar configurações personalizáveis ​​da ferramenta, você pode ler mais sobre o dedicadoVálvulas e UserValvespágina.

Argumentos opcionais

Abaixo está uma lista de argumentos opcionais em que seus ferramentas podem depender:

  • __event_emitter__: Eventos emitidos (consulte a seção a seguir)
  • __event_call__: O mesmo que emissor de eventos, mas pode ser usado para interações do usuário
  • __user__: Um dicionário com informações do usuário. Também contém oUserValvesobjeto em__user__["valves"]
  • __metadata__: Dicionário com metadados de bate -papo
  • __messages__: Lista de mensagens anteriores
  • __files__: Arquivos anexados
  • __model__: Um dicionário com informações do modelo

Basta adicioná -los como argumento a qualquer método da sua classe de ferramentas, assim como__user__No exemplo acima.

Emissores de eventos

Os emissores de eventos são usados ​​para adicionar informações adicionais à interface de bate -papo. Da mesma forma que os pontos de venda dos filtros, os emissores de eventos são capazes de anexar conteúdo ao bate -papo. Ao contrário das saídas de filtro, elas não são capazes de remover informações. Além disso, os emissores podem ser ativados em qualquer estágio durante a ferramenta.

Existem dois tipos diferentes de emissores de eventos:

Se o modelo parecer incapaz de chamar a ferramenta, verifique se está ativado (por meio da página do modelo ou por meio do+assine ao lado do campo de entrada de bate -papo). Você também pode girar oFunction Callingargumento doAdvanced Paramsseção da página do modelo deDefaultparaNative

Status

Isso é usado para adicionar status a uma mensagem enquanto estiver executando etapas. Estes podem ser feitos em qualquer estágio durante a ferramenta. Esses status aparecem logo acima do conteúdo da mensagem. Eles são muito úteis para ferramentas que atrasam a resposta do LLM ou processam grandes quantidades de informações. Isso permite que você informe os usuários o que está sendo processado em tempo real.

aguarde__event_emitter__
{
"tipo" "status", Assim, # Definimos o tipo aqui
"dados" {"descrição" "Mensagem que aparece no bate -papo", Assim, "feito" Falso, Assim, "escondido" Falso, Assim,
# Nota feita é falsa aqui indicando que ainda estamos emitindo status


Exemplo
assíncrono def test_function
auto, Assim,incitar str, Assim,__usuário__ dito, Assim,__event_emitter__Nenhum
str
"" "
Esta é uma demonstração

: Teste de param: este é um parâmetro de teste
"" "

aguarde__event_emitter__
{
"tipo" "status", Assim, # Definimos o tipo aqui
"dados" {"descrição" "Mensagem que aparece no bate -papo", Assim, "feito" Falso, Assim,
# Nota feita é falsa aqui indicando que ainda estamos emitindo status



# Faça alguma outra lógica aqui
aguarde__event_emitter__
{
"tipo" "status", Assim,
"dados" {"descrição" "Concluiu uma mensagem de tarefa", Assim, "feito" Verdadeiro, Assim, "escondido" Falso, Assim,
# Nota feita é verdade aqui, indicando que acabamos de emitir statuses
# Você também pode definir "Hidden": true se quiser remover o status depois que a mensagem for retornada



excetoExceçãocomoe
aguarde__event_emitter__
{
"tipo" "status", Assim,
"dados" {"descrição" f "Ocorreu um erro:{e, Assim, "feito" Verdadeiro, Assim,



retornar f "diga ao usuário:{e

Mensagem

Esse tipo é usado para anexar uma mensagem ao LLM em qualquer estágio da ferramenta. Isso significa que você pode anexar mensagens, incorporar imagens e até renderizar páginas da web antes, ou depois, ou durante a resposta do LLM.

aguarde__event_emitter__
{
"tipo" "mensagem", Assim, # Definimos o tipo aqui
"dados" {"contente" "Esta mensagem será anexada ao bate -papo.", Assim,
# Observe que, com tipos de mensagens, não precisamos definir uma condição feita


Exemplo
assíncrono def test_function
auto, Assim,incitar str, Assim,__usuário__ dito, Assim,__event_emitter__Nenhum
str
"" "
Esta é uma demonstração

: Teste de param: este é um parâmetro de teste
"" "

aguarde__event_emitter__
{
"tipo" "mensagem", Assim, # Definimos o tipo aqui
"dados" {"contente" "Esta mensagem será anexada ao bate -papo.", Assim,
# Observe que, com tipos de mensagens, não precisamos definir uma condição feita



excetoExceçãocomoe
aguarde__event_emitter__
{
"tipo" "status", Assim,
"dados" {"descrição" f "Ocorreu um erro:{e, Assim, "feito" Verdadeiro, Assim,



retornar f "diga ao usuário:{e

Citações

Este tipo é usado para fornecer citações ou referências no bate -papo. Você pode utilizá -lo para especificar o conteúdo, a fonte e qualquer metadado relevante. Abaixo está um exemplo de como emitir um evento de citação:

aguarde__event_emitter__
{
"tipo" "citação", Assim,
"dados" {
"documento" [[contente, Assim,
"metadados" [[
{
"date_acced"DateTimeagoraisoformato, Assim,
"fonte"título, Assim,

, Assim,
"fonte" {"nome"título, Assim, "Url"url, Assim,
, Assim,


Se você estiver enviando várias citações, pode iterar sobre citações e chamar o emissor várias vezes. Ao implementar citações personalizadas, verifique se você definiuself.citation = Falseem seuToolsaula__init__método. Caso contrário, as citações embutidas substituirão as que você pressionou. Por exemplo:

def __init__auto
autocitação Falso

Aviso: se você definirself.citation = True, isso substituirá todas as citações personalizadas que você enviar pela citação de retorno gerado automaticamente. Ao desativá -lo, você pode gerenciar completamente suas próprias referências de citação.

Exemplo
aula Ferramentas
aula UserValvesBasemodel
teste bool Campo
padrãoVerdadeiro, Assim,descrição"teste"


def __init__auto
autocitação Falso

assíncrono def test_function
auto, Assim,incitar str, Assim,__usuário__ dito, Assim,__event_emitter__Nenhum
str
"" "
Esta é uma demonstração que apenas cria uma citação

: Teste de param: este é um parâmetro de teste
"" "

aguarde__event_emitter__
{
"tipo" "citação", Assim,
"dados" {
"documento" [["Esta mensagem será anexada ao bate -papo como uma citação quando clicado em", Assim,
"metadados" [[
{
"date_acced"DateTimeagoraisoformato, Assim,
"fonte"título, Assim,

, Assim,
"fonte" {"nome" "Título do conteúdo", Assim, "Url" "http: // link-to-citation", Assim,
, Assim,


Pacotes externos

Nos metadados da definição de ferramentas, você pode especificar pacotes personalizados. Quando você clicarSavea linha será analisada epip installserá executado em todos os requisitos de uma só vez.

Lembre -se de que, como o PIP é usado no mesmo processo que o Nullcore, a interface do usuário não responde completamente durante a instalação.

Não são tomadas medidas para lidar com conflitos de pacotes com os requisitos do Nullcore. Isso significa que a especificação de requisitos pode interromper o WebUI aberto se você não tomar cuidado. Você pode ser capaz de contornar isso especificandoopen-webuisi mesmo como um requisito.

Exemplo
"" "
Título: MyToolName
Autor: MyName
Funding_url: [Qualquer link aqui será mostrado por trás de um botão `Heart` para os usuários mostrarem seu suporte a você]
Versão: 1.0.0
# A versão é exibida na interface do usuário para ajudar os usuários a acompanhar as atualizações.
Licença: GPLV3
Descrição: [Recomendado]
Requisitos: Package1> = 2.7.0, Package2, Package3
"" "