Firewall e residência dos dados.

Aprender DXPR BuilderGerir o siteCumprir requisitos legais

O DXPR Builder guarda as suas páginas na sua própria base de dados Drupal. Contacta os serviços DXPR para verificações de licença, recursos do editor e pedidos de IA. Esta página lista cada ligação, o que cada uma transporta, onde correm os modelos DXAI Kavya, como a chave de produto é guardada e o que funciona quando o acesso de saída é restrito.

Ligações em resumo

Anfitrião Feita por Finalidade Necessária para
dxpr.com Servidor Drupal Estado de licença, verificação de domínio, sincronização de utilizadores licenciados Edição
cdn2.dxpr.com Navegador do editor JavaScript e CSS do editor (principal) Edição
cdn.dxpr.com Navegador do editor JavaScript e CSS do editor (alternativo) Edição
kavya.dxpr.com Servidor Drupal Pedidos de IA e saldo de créditos de IA Funcionalidades de IA
html-extract.dxpr.com Navegador do editor IA "clonar a partir de URL" Funcionalidades de IA
r.jina.ai (terceiros) Navegador do editor Lê páginas web cujos URLs aparecem numa pergunta Funcionalidades de IA
tuur.dxpr.com Navegador do editor Análise de utilização do editor Opcional

Todas as ligações usam HTTPS na porta 443. Os visitantes do site nunca carregam nada dos servidores DXPR: as páginas publicadas são apresentadas a partir de HTML guardado na base de dados, e o script público (dxpr_builder/dxpr_frontend.min.js) vem dentro do módulo. app.dxpr.com aparece só em ligações mostradas a administradores.

Verificações de licença (dxpr.com)

O servidor Drupal chama quatro endpoints definidos em src/Service/DxprBuilderLicenseServiceInterface.php, cada um com a chave de produto como cabeçalho Authorization: Bearer.

Endpoint Quando Dados enviados
GET /api/user-license De 24 em 24 horas quando autorizado, de 30 em 30 minutos quando não gba e users_tier (número de contas com a permissão edit with dxpr builder e o escalão correspondente), values_count (itens de conteúdo com campo de construtor), site_base_url, site (um HMAC do salt de hash do site; o salt não é enviado), site_mail (de system.site), project, version
GET /api/domain-blacklist/{hostname} De hora a hora Só o nome de anfitrião; sem cabeçalho de autorização
POST /api/central-user-storage/{add,remove,sync} Quando contas, permissões ou a chave de produto mudam; acompanhamentos são postos em fila e correm no cron Nome de anfitrião mais, para cada conta com permissão de edição, o endereço de e-mail e os nomes de funções. Contas sem endereço de e-mail válido são saltadas
GET /api/user-license/users Quando a página User Licenses é aberta Nada além da chave

O conteúdo das páginas nunca faz parte de um pedido de licença. O módulo também imprime um <div> oculto na página inicial com uma cadeia marcadora fixa, o escalão de licença, a contagem de editores e a contagem de gravações (dxpr_builder_page_bottom() em dxpr_builder.module). É legível no fonte da página.

Recursos do editor (cdn2.dxpr.com, cdn.dxpr.com)

Quando Editor Assets está em Cloud (a predefinição), o navegador do editor carrega o JavaScript e CSS do construtor de https://cdn2.dxpr.com/<version>/, com recurso a https://cdn.dxpr.com/<version>/ após uma sonda /health falhada. A chave de produto é anexada a cada URL de recurso como parâmetro de consulta jwt (dxpr_builder_library_info_build()). A CDN verifica essa chave: uma resposta 401 faz js/editor_validation.js mostrar "Your product key is not valid".

As opções Local (minified) e Local (unminified) só aparecem no formulário de definições quando existe uma cópia compilada do editor no diretório dxpr_builder/ do módulo, e tal cópia é usada automaticamente mesmo quando Cloud está selecionado. O repositório git não acompanha estes ficheiros compilados, por isso uma versão descarregada de drupal.org carrega o editor a partir da CDN.

Pedidos de IA (kavya.dxpr.com)

O navegador nunca contacta kavya.dxpr.com. O editor publica para rotas no seu próprio site (/dxpr_builder/ajax/ai/chat, /dxpr_builder/ajax/ai/image, /dxpr_builder/ajax/ai/image/edit; todas exigem a permissão edit with dxpr builder, um token CSRF e uma conta licenciada). O site retransmite cada pedido através do fornecedor DXPR do módulo Drupal AI (ai_provider_dxpr) para https://kavya.dxpr.com/v1/chat/completions, /v1/images/generations ou /v1/images/edits, autenticado com a chave de API DXPR guardada no módulo Key. A definição host do fornecedor (ai_provider_dxpr.settings) pode apontar os pedidos para outro anfitrião. Separadamente, a página de definições de IA chama GET https://kavya.dxpr.com/v1/account/balance com a chave de produto para mostrar o seu saldo de créditos.

O que um pedido de IA contém

Só as funcionalidades de IA enviam conteúdo da página para fora do site, e só quando um editor as aciona (dxpr_builder/build/dxpr-global/ai-service.js).

Pedido Conteúdo enviado
Geração de texto e páginas Pergunta de sistema, pergunta do editor, histórico de conversa
Com um elemento selecionado O HTML exterior do elemento: inteiro se tiver 500 caracteres ou menos, senão os primeiros e últimos 200 caracteres
Operações ao nível da página O HTML existente da página, até 50 000 caracteres; a página completa quando toda a página está a ser substituída
Campos opcionais Nome do modelo, ordem de fornecedores ativos, resultado HTML previsto, etiquetas e classes permitidas, sinalizador web_search, formato de resposta
Geração de imagens Pergunta, tamanho, qualidade, fundo
Edição de imagens O mesmo mais a imagem de origem, codificada em base64

Duas conveniências obtêm páginas web do navegador do editor (ai-service-url-fetch.js): um URL numa pergunta é pedido com .md anexado e, se isso falhar, através de https://r.jina.ai/<url>, um serviço de leitura de terceiros não operado pela DXPR; uma pergunta que pede para clonar uma página envia o URL para https://html-extract.dxpr.com/?url=.... Em ambos os casos só o URL é enviado.

A saída da IA é filtrada no regresso. Domínios permitidos, etiquetas bloqueadas e etiquetas permitidas definem-se em /admin/dxpr_studio/dxpr_builder/ai_settings em AI Output Filtering.

Onde correm os modelos DXAI Kavya

O DXPR Builder oferece três modelos (src/Constants/AiModelConstants.php):

Modelo Nome de API Descrição mostrada no formulário de definições
DXAI Kavya M1 kavya-m1 Best performance (OpenAI, Google Gemini, Anthropic)
DXAI Kavya M1 EU kavya-m1-eu Privacy-focused (MistralAI)
DXAI Kavya M1 Fast kavya-m1-fast Fastest responses, lower quality

Não há definição de região em nenhum módulo. A residência dos dados é escolhida pelo modelo e pelos fornecedores a montante que ativar:

  • kavya-m1 alterna entre cinco fornecedores, listados com o país no formulário de definições DXPR AI Provider: Anthropic (United States), Google Gemini (United States), MistralAI (France), OpenAI (United States), XAI (United States). No modo Manual priority arrasta fornecedores entre Enabled e Disabled e define a ordem.
  • kavya-m1-eu usa só MistralAI. O README do DXPR AI Provider afirma que "keeps data within European boundaries (servers in Netherlands)"; a documentação afirma que o servidor Kavya corre nos Países Baixos com cópia de segurança na Alemanha, que os pedidos passam por servidores MistralAI em França, e que nunca recorre a um fornecedor fora da UE. Estas localizações são documentadas pela DXPR, não impostas por nada no código Drupal.

Com ai_provider_dxpr instalado, o modelo é escolhido em /admin/config/ai/providers/dxpr, e a sua definição allowed_models controla que modelos os editores podem escolher. Sem ele, modelo e ordem de fornecedores definem-se em /admin/dxpr_studio/dxpr_builder/ai_settings.

Como a chave de produto é guardada

A secção License de /admin/dxpr_studio/dxpr_builder/settings oferece duas opções de Storage method (src/Form/DxprBuilderSettingsForm.php, src/Service/DxprBuilderKeyService.php):

  • Key module: a chave é lida da entidade Key escolhida em Key. dxpr_builder_update_9020() move uma chave encontrada em dxpr_builder.settings para a entidade Key dxpr_builder_jwt, cujo fornecedor Configuration ainda a exporta. Só o fornecedor File ou Environment mantém a chave fora das exportações de configuração.
  • Configuration storage: a chave é guardada em texto claro como dxpr_builder.settings.json_web_token e é incluída nas exportações de configuração.

A chave de produto é um JSON Web Token que autentica chamadas de licença, a chamada de saldo de créditos e os URLs de recursos da CDN; trate-a como credencial.

Configuração de firewall

De Permitir HTTPS de saída para Notas
Servidor Drupal dxpr.com Licença
Servidor Drupal kavya.dxpr.com Só IA
Estações de trabalho dos editores cdn2.dxpr.com, cdn.dxpr.com Recursos do editor
Estações de trabalho dos editores html-extract.dxpr.com, r.jina.ai Só IA; bloqueá-los só desativa pesquisa de URL e clonagem
Estações de trabalho dos editores tuur.dxpr.com Análise; bloquear não afeta a edição

Análise (dxpr_builder/build/dxpr-analytics/, PostHog) identifica eventos pelo endereço de e-mail do editor e o nome de anfitrião do site. Desligue-a com drush config:set dxpr_builder.settings record_analytics 0; a chave não tem campo de formulário. Mais duas chaves sem campo de formulário são lidas de dxpr_builder.settings: cloud_url substitui o URL base da CDN (VERSION é substituído pela versão do módulo) e license_endpoint substitui o endpoint central de armazenamento de utilizadores. Defina-as com uma substituição de configuração em settings.php.

Configuração de proxy

Chamadas de licença e IA usam o cliente HTTP do Drupal, por isso um proxy configura-se em settings.php:

$settings['http_client_config']['proxy'] = [
  'http' => 'http://proxy.example.com:8080',
  'https' => 'http://proxy.example.com:8080',
  'no' => ['localhost', '127.0.0.1'],
];

Os navegadores dos editores carregam os recursos da CDN e chamam os serviços de análise e leitura diretamente, por isso esses pedidos seguem as definições de proxy da estação de trabalho.

Implementações isoladas e no local

O DXPR Builder corre no seu próprio servidor; nenhum conteúdo passa por um componente alojado. Quando nem o servidor nem os editores alcançam a DXPR:

Capacidade Sem qualquer acesso DXPR
Apresentar páginas publicadas Funciona; nada é carregado da DXPR
Armazenamento de conteúdo Funciona; as páginas são valores de campo na sua base de dados
Carregar o editor Falha, a não ser que exista uma compilação local do editor em dxpr_builder/
Validação de licença Falha. O módulo regista o erro, mostra "We are having trouble connecting to the DXPR servers" aos administradores e tenta de 30 em 30 minutos. A edição não é bloqueada enquanto uma chave de produto estiver configurada
Página User Licenses Vazia; precisa de dxpr.com
Funcionalidades de IA Indisponíveis; cada pedido passa por kavya.dxpr.com
Análise, pesquisa de URL, clonar a partir de URL Saltadas em silêncio

Sem qualquer chave de produto, o módulo aplica os limites do escalão gratuito no código: um editor e 100 itens de conteúdo.

Uma implementação totalmente no local funciona portanto para apresentar e guardar conteúdo; a edição precisa de acesso à CDN ou de uma compilação local do editor, e a validação de licença precisa de dxpr.com. Contacte a DXPR se precisar de uma compilação do editor para alojar internamente.

E a seguir?