Sviluppo e test del gestore locale development
Utilizza questo riferimento durante lo sviluppo locale di gestori. Per il contratto dei risultati del gestore, vedere Personalizzare un gestore generato.
Requisiti
- Node.js 24 o versione successiva.
- npm.
- Clone locale dell’archivio del gestore collegato.
Struttura del progetto
L’archivio collegato segue questo layout:
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
Punti chiave:
entry.jsè il punto di ingresso del webpack. Al momento della compilazione, rileva ogni fileactions/*/index.jse lo raggruppa in un singolodist/index.js. Non modificare.actions.jsonè ignorato. La pipeline di distribuzione lo scrive automaticamente dai metadati dell’azione in LLM Apps.- I test sono attivi in
test/actions/, non inactions/. Webpack racchiude tutto ciò che si trova inactions/nell’artefatto distribuito. I test di co-localizzazione verrebbero inviati a Adobe I/O Runtime.
Sviluppo locale
Puoi sviluppare e testare i gestori localmente senza credenziali Adobe:
npm install
npm run dev:local
In questo modo viene creato il progetto con Webpack e viene avviato un server HTTP Node.js semplice su http://localhost:9080. Il server rileva automaticamente i file del gestore in actions/ e li registra come strumenti MCP.
Comportamento metadati locale
L’interfaccia utente corrente non fornisce un download actions.json. È possibile eseguire il server locale senza questo file; rileva i gestori in actions/ e li registra con metadati minimi.
Senza actions.json, gli argomenti dell’azione locale non vengono convalidati in base allo schema di input dell’interfaccia utente. Gli unit test e gli integration test utilizzano test/fixtures/actions.json per i metadati rappresentativi.
Test con curl
# 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"}}}'
Test con MCP Inspector
npx @modelcontextprotocol/inspector
Imposta Transport Type su streamable-http e URL su http://localhost:9080.
Test
Gli unit test del gestore risiedono in test/actions/ e rispecchiano il layout 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)
})
Esegui test con:
npm test # all tests
npx jest test/actions/echo # one action only
Al termine dei test locali, invia le modifiche e segui Distribuisci modifiche.