Desarrollo y prueba del controlador local development
Utilice esta referencia al desarrollar controladores localmente. Para el contrato de resultados del controlador, vea Personalizar un controlador generado.
Requisitos
- Node.js 24 o posterior.
- npm.
- Un clon local del repositorio del controlador vinculado.
Estructura del proyecto
El repositorio vinculado sigue este diseño:
your-llm-app/
├── entry.js # Webpack entry — do not modify
├── actions/ # One folder per action
│ └── echo/
│ └── index.js # Example handler
├── test/
│ ├── actions/
│ │ └── echo.test.js
│ ├── fixtures/
│ │ └── actions.json
│ ├── html-transform.js
│ ├── jest.setup.js
│ └── server.test.js
├── server/
│ └── local.js # Local dev server (port 9080)
├── actions.json # Gitignored — optional local metadata
├── app.config.yaml # Adobe I/O Runtime config
├── webpack.config.js
└── package.json
Puntos clave:
entry.jses el punto de entrada del Webpack. En el momento de la compilación, detecta cada archivo deactions/*/index.jsy lo agrupa en un único archivo dedist/index.js. No modificar.- Se ignora a
actions.json. La canalización de implementación lo escribe automáticamente a partir de los metadatos de la acción en LLM Apps. - Pruebas en vivo bajo
test/actions/, no dentro deactions/. Webpack agrupa todo lo que hay bajoactions/en el artefacto implementado; las pruebas de co-ubicación las enviarían a Adobe I/O Runtime.
Desarrollo local
Puede desarrollar y probar controladores localmente sin credenciales de Adobe:
npm install
npm run dev:local
Esto genera el proyecto con Webpack e inicia un servidor HTTP Node.js sin formato en http://localhost:9080. El servidor detecta automáticamente los archivos del controlador bajo actions/ y los registra como herramientas de MCP.
Comportamiento de metadatos locales
La IU actual no proporciona una descarga de actions.json. Puede ejecutar el servidor local sin este archivo; detecta los controladores bajo actions/ y los registra con metadatos mínimos.
Sin actions.json, los argumentos de acción local no se validan en el esquema de entrada de la interfaz de usuario. Las pruebas de unidad e integración usan test/fixtures/actions.json para los metadatos representativos.
Prueba con rizo
# List all registered tools
curl -sX POST "http://localhost:9080" \
-H 'content-type: application/json' \
-H 'accept: application/json;q=1.0, text/event-stream;q=0.5' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
# Call the boilerplate echo action
curl -sX POST "http://localhost:9080" \
-H 'content-type: application/json' \
-H 'accept: application/json;q=1.0, text/event-stream;q=0.5' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"echo","arguments":{"message":"hello"}}}'
Probar con el Inspector MCP
npx @modelcontextprotocol/inspector
Establezca Tipo de transporte en streamable-http y URL en http://localhost:9080.
Pruebas
Las pruebas unitarias del controlador están activas en test/actions/ y reflejan el diseño de actions/:
// test/actions/echo.test.js
const handler = require('../../actions/echo/index.js')
test('echoes the message', async () => {
const result = await handler({ message: 'hello' })
expect(result.content[0].text).toBe('Echo: hello')
})
test('always returns content parts', async () => {
const result = await handler({})
expect(Array.isArray(result.content)).toBe(true)
})
Ejecutar pruebas con:
npm test # all tests
npx jest test/actions/echo # one action only
Una vez superadas las pruebas locales, inserta los cambios y sigue Implementar cambios.