Criar uma ação do zero create-action-from-scratch

IMPORTANT
Aplicativos LLM está disponível para todos os clientes do AEM Sites Cloud Service para desenvolver e gerenciar seus próprios aplicativos. Depois que a medição for iniciada, cada chamada de aplicativo será contabilizada nas Solicitações de conteúdo do AEM Sites do cliente. A Adobe anunciará a taxa de medição e a data de início antes de a medição entrar em vigor.
NOTE
Este guia pressupõe uma familiaridade básica com os Serviços de entrega de borda (EDS) da Adobe. Se você é novo no EDS, primeiro leia o Tutorial do desenvolvedor do EDS e o Explorar blocos para aprender o básico — blocos, a função decorate e a estrutura do projeto do EDS — antes de conectar um widget.

Adicione um recurso que a plataforma não criou. Defina a ação em LLM Apps, grave o manipulador no repositório vinculado e adicione um widget, se necessário.

Neste guia: Aprenda a definir uma ação, implementar seu manipulador e conectar um widget opcional. Teste a ação localmente, implante o aplicativo e tente a ação em uma plataforma LLM compatível.

Para seu primeiro aplicativo, comece com Configuração de infraestrutura e depois Criar ações. O guia de ações Criar explica a geração automática de um site e a criação manual.

Antes de começar

Você precisa:

  • Um aplicativo LLM existente.
  • Um repositório de manipulador vinculado.
  • Um clone local do repositório com suas dependências instaladas.
  • Um projeto EDS se a ação exibir um widget.
  • Uma API ou fonte de dados limpa para os resultados da produção.

Planejar a ação

Projete cada ação em torno de uma tarefa de usuário limpa. Antes de abrir a interface do usuário, defina:

  • Intenção — o que o usuário está tentando fazer.
  • Descrição — quando selecionar a ação.
  • Entradas — as informações mínimas necessárias do usuário.
  • Resultado — o texto e os dados estruturados retornados pelo manipulador.
  • Comportamento — se a ação lê dados, altera dados ou chama sistemas externos.
  • Widget — se o resultado precisa de uma interface visual.

Por exemplo, use este plano para uma ação Pesquisar Produtos:

Intent: Find products matching a category or search phrase
Inputs:
  category: optional string
  query: optional string
Result:
  content: text summary
  structuredContent: products and total count
Behavior: read-only, idempotent, open-world
Widget: product cards

Mantenha as tarefas relacionadas, mas diferentes, separadas. Use ações separadas para pesquisa de produto e compra de produto porque as tarefas têm diferentes requisitos de entrada, riscos e confirmação.

Criar os metadados da ação

Abra o aplicativo e selecione Ações e, em seguida, Criar Ação.

A caixa de diálogo Criar nova ação tem quatro guias: Detalhes da ação, Detalhes do widget LLM, Insights do aplicativo e Extensões de ChatGPT. A caixa de diálogo é aberta em Detalhes da ação. O editor de ação salva usa as mesmas guias.

As configurações opcionais de extensões ChatGPT permitem que as pessoas abram o aplicativo diretamente, usem um visualizador de arquivo personalizado ou encontrem recursos no compositor em clientes compatíveis. Configure-os depois que o comportamento correspondente do widget e da ação estiver pronto. Consulte Configurar extensões ChatGPT.

Inserir as informações da ação e os parâmetros de entrada

Criar nova ação — Detalhes da ação com o nome da ação, identificador de código, descrição e dois parâmetros de entrada

Em Informações de ação, digite:

  • Nome da ação — um nome de tarefa curto, como Pesquisar Produtos.
  • Descrição — explique quando usar a ação e o que ela retorna.

A caixa de diálogo deriva um Identificador de código do nome, como search-products. O identificador é corrigido após a criação e deve ser exclusivo no aplicativo. Use o identificador exato para a pasta do manipulador.

Uma descrição útil é específica:

Search the product catalog by category or keyword. Returns matching
products with their names, prices, categories, and image URLs.

Evite descrições vagas como Obtém informações sobre o produto. A plataforma LLM usa a descrição para escolher entre as ações.

Em Parâmetros de entrada, selecione Adicionar parâmetro uma vez para cada valor aceito pelo manipulador. Para cada parâmetro, insira:

  • Nome do parâmetro — a chave que o manipulador recebe.
  • Tipo — String, Número, Inteiro, Booleano, Objeto ou Arquivo.
  • Obrigatório — se a ação requer o valor.
  • Descrição — como extrair o valor.

Para Pesquisar Produtos:

category
  Type: String
  Required: No
  Description: Product category used to narrow the catalog.

query
  Type: String
  Required: No
  Description: Product name or search phrase.

Use nomes de parâmetros estáveis. Alterar um nome também requer alterar o manipulador e seus testes.

Definir as configurações do LLM

Expandir configurações LLM. A seção é recolhida por padrão.

Criar nova ação — Configurações LLM com anotações, textos de status de metadados OpenAI e visibilidade

Em Anotações, selecione somente as dicas que são verdadeiras para a ação:

  • Dica destrutiva — a ação pode excluir ou alterar dados permanentemente.
  • Idempotente (mesmos argumentos = sem efeito extra) — repetir a mesma solicitação tem o mesmo efeito.
  • Abrir dica do mundo — a ação se comunica com sistemas externos.
  • Dica somente leitura — a ação não altera os dados.

Por exemplo, a pesquisa de produtos normalmente é somente leitura, idempotente e de mundo aberto.

Em Metadados de OpenAI, insira mensagens curtas exibidas enquanto a ação é executada e, após sua conclusão, até 64 caracteres cada:

Invoking status text: Searching products...
Invoked status text: Products found

Em Visibilidade:

  • Expor ao modelo de IA permite que o modelo selecione a ação.
  • Mostrar como widget na superfície do aplicativo exibe o widget configurado.

A Visibilidade não escolhe o tipo de widget. Para uma ação somente texto, selecione Nenhuma interface do usuário interativa em Detalhes do widget LLM > Tipo de widget.

Configurar Application Insights configure-analytics

Abra o Application Insights. Por padrão, a opção Coletar intenção de usuário está selecionada: a plataforma LLM cria um resumo curto e anônimo do que o usuário estava tentando realizar quando a ação foi executada.

Se você configurar seu próprio Adobe Analytics ou Customer Journey Analytics, a intenção do usuário também será enviada para lá. Consulte Configurar Adobe Analytics e Customer Journey Analytics.

Revise as instruções abaixo da caixa de seleção, que orientam o resumo. Limite-as a intenções não confidenciais e anônimas e descreva sua coleta de dados na política de privacidade. As instruções aceitam até 2.000 caracteres Limpe Coletar intenção de usuário para não coletar resumo.

Criar nova ação — Application Insights com a intenção de usuário Coletar e as instruções padrão

Para obter definições completas de campo, consulte Campos de ação e widget.

Configurar o widget

Abra Detalhes do Widget do LLM. Para uma ação somente texto, selecione Nenhuma interface do usuário interativa em Tipo de widget e ignore as configurações restantes do widget.

Criar nova ação — Detalhes do Widget do LLM com bloco do Edge Delivery Services selecionado e URLs de modelo de exemplo

Em Informações do widget, configure:

  • Tipo de widget — selecione Bloco Edge Delivery Services para um widget interativo.
  • Domínio do widget — a origem da sandbox do widget. A interface o identifica conforme necessário para o envio do aplicativo e exclusivo por aplicativo; não é o mesmo que o URL da página de EDS.
  • Descrição do widget — o que o modelo diz depois que o widget é renderizado, até 512 caracteres.

A descrição do widget é diferente da descrição da ação:

  • A descrição da ação ajuda o modelo a decidir quando invocar a ação.
  • A Descrição do widget mapeia para _meta["openai/widgetDescription"] e resume o que o componente renderizado mostra, reduzindo a narração repetida.

LLM Apps aplica a descrição do widget como metadados do componente. Não retorne a descrição do manipulador.

Expanda URLs de modelo e insira:

  • URL do Script — o ponto de entrada do widget EDS.
  • URL do Widget — a página de EDS publicada para esta ação.

Os URLs típicos são:

Script URL:
https://main--<repo>--<owner>.aem.live/scripts/aem-embed.js

Widget URL:
https://main--<repo>--<owner>.aem.live/<widget-page>

Em Configuração da CSP, adicione apenas as origens que o dispositivo precisa para ativos e solicitações de rede. Um widget que carrega recursos externos pode não ser renderizado se o CSP estiver incompleto.

Criar nova ação — Configuração da CSP com listas de recursos, conexões, quadros, redirecionamentos e base do domínio URI

Se a página do projeto ou widget do EDS ainda não existir, conclua Trazer seu próprio projeto EDS e retorne à ação.

Salvar a ação

Selecione Criar nova ação. A ação aparece na página Ações com um selo Não implantado.

Salvar cria os metadados, mas a ação ainda precisa de um manipulador.

Quando você reabre a ação salva, o editor mostra as mesmas guias. Para salvar edições posteriores, selecione Salvar alterações.

Implementar o manipulador

Clonar o repositório do manipulador vinculado e instalar suas dependências:

npm install

Criar:

actions/
└── search-products/
    └── index.js

O nome da pasta deve corresponder ao identificador de código da ação mostrado no editor de ações.

Para obter o contrato de resultado completo e a relação manipulador-widget, consulte Personalizar um manipulador gerado.

Contrato do manipulador

Exportar uma função assíncrona:

module.exports = async (args) => {
  return {
    content: [
      { type: 'text', text: 'Response for the LLM platform.' }
    ],
    structuredContent: {
      // Data for the widget.
    }
  };
};

O manipulador recebe os parâmetros definidos na interface do usuário do.

Retornar content

A plataforma LLM lê content como fallback de texto:

content: [
  { type: 'text', text: 'Found 3 matching products.' }
]

Sempre retornar content úteis, mesmo quando a ação tiver um widget.

Retornar structuredContent

O widget consome structuredContent como um objeto simples:

structuredContent: {
  products: [
    { id: 'P-100', name: 'Product A', price: '$20' }
  ],
  total: 1
}

A forma deve corresponder ao que o bloco EDS lê de bridge.toolResult.

Conectar uma API

Manter chamadas de API no manipulador do lado do servidor. Este exemplo chama uma API de produto pública. Configure a origem HTTPS da API em uma variável de aplicativo chamada PRODUCT_API_ORIGIN. O exemplo aceita os parâmetros query e category definidos acima, requer pelo menos um parâmetro e não requer credenciais.

const { getVariable } = require('@adobe/llm-apps-runtime');

module.exports = async ({ query = '', category = '' } = {}, extra) => {
  const normalizedQuery = typeof query === 'string' ? query.trim() : '';
  const normalizedCategory = typeof category === 'string' ? category.trim() : '';
  if (typeof query !== 'string' || typeof category !== 'string'
      || (!normalizedQuery && !normalizedCategory)
      || normalizedQuery.length > 200 || normalizedCategory.length > 100) {
    return {
      isError: true,
      content: [{ type: 'text', text: 'Enter a valid product search.' }],
      structuredContent: { products: [], total: 0 }
    };
  }

  const apiOrigin = getVariable(extra, 'PRODUCT_API_ORIGIN');
  if (!apiOrigin) {
    throw new Error('Product API configuration is unavailable.');
  }

  const origin = new URL(apiOrigin);
  if (origin.protocol !== 'https:') {
    throw new Error('Product API configuration must use HTTPS.');
  }

  const url = new URL('/v1/products', origin);
  if (normalizedQuery) {
    url.searchParams.set('query', normalizedQuery);
  }
  if (normalizedCategory) {
    url.searchParams.set('category', normalizedCategory);
  }

  const response = await fetch(url, {
    signal: AbortSignal.timeout(8000)
  });

  if (!response.ok) {
    throw new Error('Product service request failed.');
  }

  const payload = await response.json();
  if (!payload || !Array.isArray(payload.products)
      || !payload.products.every((product) =>
        product
        && typeof product.id === 'string'
        && typeof product.name === 'string'
        && typeof product.price === 'string')) {
    throw new Error('Product service returned an unexpected response.');
  }

  const products = payload.products.map((product) => ({
    id: product.id,
    name: product.name,
    price: product.price
  }));

  return {
    content: [
      { type: 'text', text: `Found ${products.length} matching products.` }
    ],
    structuredContent: {
      products,
      total: products.length
    }
  };
};

Não coloque credenciais de API no código-fonte, nos metadados de ação, no JavaScript widget, nos logs ou em erros voltados para o usuário. Atualmente, a interface do usuário Variáveis e segredos aceita somente variáveis não confidenciais, não segredos. Não armazene um token de API em uma variável. Se sua API upstream exigir credenciais, organize um mecanismo de credenciais do lado do servidor aprovado antes de conectá-lo.

Para código de produção, valide a resposta upstream completa antes de mapear campos aprovados para structuredContent.

Adicionar testes de manipulador

Criar o teste correspondente:

test/
└── actions/
    └── search-products.test.js

Testar pelo menos:

  • Entrada válida.
  • Entrada ausente ou inválida.
  • Resultados vazios.
  • Tempo limite ou falha da API.
  • Dados de API malformados.
  • A forma structuredContent esperada pelo widget.

Executar:

npm test

Para layout de projeto e teste de MCP local, consulte Desenvolvimento e teste de manipulador local.

Testar a ação localmente

Executar:

npm run dev:local

Sem um actions.json local, o servidor descobre o manipulador com o mínimo de metadados e sem validação do esquema de entrada.

Use o Inspetor de MCP ou curl para:

  1. Listar as ações registradas.
  2. Chame a nova ação com argumentos representativos.
  3. Verificar content e structuredContent.
  4. Teste solicitações inválidas e vazias.

Conectar e testar o widget

Se a ação tiver um widget:

  1. Faça com que o widget leia o structuredContent do manipulador.
  2. Renderize valores externos com APIs DOM seguras, como textContent.
  3. Adicionar estados de carregamento, vazio e erro.
  4. Visualize a página de EDS localmente.
  5. Verifique a CSP, o CORS e os URLs do widget.

Consulte Trazer seu próprio projeto de EDS.

Implantar e testar

  1. Confirme e envie por push as alterações do manipulador e do widget.
  2. Implante o aplicativo para o Preparo.
  3. Teste o aplicativo em ChatGPT ou Claude.
  4. Verifique a seleção da ação com prompts que correspondam à ação e prompts não relacionados que não a chamem.
  5. Após o Êxito do preparo, implante para produção.

Se os metadados existirem sem um manipulador correspondente, a implantação registrará a ação com um stub padrão. Adicione o manipulador antes de disponibilizar a ação aos usuários.

recommendation-more-help
llm-apps-help-main-toc