🛠️ 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 umTools
aula.
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 chamadasValves
eUserValves
, 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 oUserValves
objeto 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 Calling
argumento doAdvanced Params
seção da página do modelo deDefault
paraNative
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 = False
em seuTools
aula__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ê clicarSave
a linha será analisada epip install
será 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-webui
si 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
"" "