Pular para o conteúdo

Jogo de Dungeons de IA Agêntica

Vamos começar criando um novo monorepo. Dentro do diretório desejado, execute o seguinte comando:

Terminal window
npx create-nx-workspace@21.6.4 dungeon-adventure --pm=pnpm --preset=@aws/nx-plugin --iacProvider=CDK --ci=skip --aiAgents

Isso configurará um monorepo NX dentro do diretório dungeon-adventure que você pode abrir no vscode. Deve parecer com o seguinte:

  • Directory.nx/
  • Directory.vscode/
  • Directorynode_modules/
  • Directorypackages/ aqui residirão seus subprojetos
  • .gitignore
  • .npmrc
  • .prettierignore
  • .prettierrc
  • nx.json configura o CLI do NX e padrões do monorepo
  • package.json todas as dependências Node são definidas aqui
  • pnpm-lock.yaml ou bun.lock, yarn.lock, package-lock.json dependendo do gerenciador de pacotes
  • pnpm-workspace.yaml se usar pnpm
  • README.md
  • tsconfig.base.json todos os subprojetos baseados em Node estendem este
  • tsconfig.json
  • aws-nx-plugin.config.mts configuração do Nx Plugin para AWS

Agora estamos prontos para começar a criar nossos diferentes subprojetos usando o @aws/nx-plugin.

Primeiro vamos criar nossa Game API. Para isso, vamos criar uma API tRPC chamada GameApi seguindo os passos abaixo:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#trpc-api
  5. Preencha os parâmetros obrigatórios
    • name: GameApi
  6. Clique em Generate

Você deve ver que alguns novos arquivos apareceram na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Agora vamos criar nosso Story Agent. Para isso, primeiro vamos criar um Projeto Python:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - py#project
  5. Preencha os parâmetros obrigatórios
    • name: story
  6. Clique em Generate

Você deve ver que alguns novos arquivos apareceram na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Em seguida, vamos adicionar um agente Strands ao projeto com o gerador py#strands-agent:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - py#strands-agent
  5. Preencha os parâmetros obrigatórios
    • project: story
  6. Clique em Generate

Você deve ver que alguns novos arquivos apareceram na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Agora vamos criar um servidor MCP que fornecerá ferramentas para nosso Story Agent gerenciar o inventário de um jogador.

Primeiro, criamos um projeto TypeScript:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#project
  5. Preencha os parâmetros obrigatórios
    • name: inventory
  6. Clique em Generate

Isso criará um projeto TypeScript vazio.

Clique aqui para examinar estes arquivos em mais detalhes.

Em seguida, adicionaremos um servidor MCP ao nosso projeto TypeScript:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#mcp-server
  5. Preencha os parâmetros obrigatórios
    • project: inventory
  6. Clique em Generate

Isso adicionará

Clique aqui para examinar estes arquivos em mais detalhes.

Agora vamos criar a UI que permitirá interagir com o jogo. Para isso, vamos criar um website chamado GameUI seguindo os passos abaixo:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#react-website
  5. Preencha os parâmetros obrigatórios
    • name: GameUI
  6. Clique em Generate

Você deve ver que alguns novos arquivos apareceram na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Agora vamos configurar nossa Game UI para exigir acesso autenticado via Amazon Cognito seguindo os passos abaixo:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#react-website#auth
  5. Preencha os parâmetros obrigatórios
    • cognitoDomain: game-ui
    • project: @dungeon-adventure/game-ui
    • allowSignup: true
  6. Clique em Generate

Você deve ver que alguns novos arquivos apareceram/mudaram na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Agora vamos configurar nossa Game UI para se conectar à nossa Game API criada anteriormente:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - api-connection
  5. Preencha os parâmetros obrigatórios
    • sourceProject: @dungeon-adventure/game-ui
    • targetProject: @dungeon-adventure/game-api
  6. Clique em Generate

Você deve ver que alguns novos arquivos apareceram/mudaram na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Agora o subprojeto final que precisamos criar é para a infraestrutura CDK. Para criar isso, siga os passos abaixo:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#infra
  5. Preencha os parâmetros obrigatórios
    • name: infra
  6. Clique em Generate

Você deve ver que alguns novos arquivos apareceram/mudaram na sua árvore de arquivos.

Clique aqui para examinar estes arquivos em mais detalhes.

Vamos atualizar nosso packages/infra/src/stacks/application-stack.ts para instanciar alguns de nossos constructs já gerados:

import {
GameApi,
GameUI,
InventoryMcpServer,
RuntimeConfig,
StoryAgent,
UserIdentity,
} from ':dungeon-adventure/common-constructs';
import { Stack, StackProps, CfnOutput } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class ApplicationStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const userIdentity = new UserIdentity(this, 'UserIdentity');
const gameApi = new GameApi(this, 'GameApi', {
integrations: GameApi.defaultIntegrations(this).build(),
});
const { userPool, userPoolClient } = userIdentity;
const mcpServer = new InventoryMcpServer(this, 'InventoryMcpServer');
// Use Cognito for user authentication with the agent
const storyAgent = new StoryAgent(this, 'StoryAgent', {
authorizerConfiguration: {
customJwtAuthorizer: {
discoveryUrl: `https://cognito-idp.${Stack.of(userPool).region}.amazonaws.com/${userPool.userPoolId}/.well-known/openid-configuration`,
allowedAudience: [userPoolClient.userPoolClientId],
},
},
environment: {
INVENTORY_MCP_ARN: mcpServer.agentCoreRuntime.arn,
},
});
// Add the Story Agent ARN to runtime-config.json so it can be referenced by the website
RuntimeConfig.ensure(this).config.agentArn =
storyAgent.agentCoreRuntime.arn;
new CfnOutput(this, 'StoryAgentArn', {
value: storyAgent.agentCoreRuntime.arn,
});
new CfnOutput(this, 'InventoryMcpArn', {
value: mcpServer.agentCoreRuntime.arn,
});
// Grant the agent permissions to invoke our mcp server
mcpServer.agentCoreRuntime.grantInvoke(storyAgent.agentCoreRuntime);
// Grant the authenticated role access to invoke the api
gameApi.grantInvokeAccess(userIdentity.identityPool.authenticatedRole);
// Ensure this is instantiated last so our runtime-config.json can be automatically configured
new GameUI(this, 'GameUI');
}
}

Note que fornecemos integrações padrão para nossa Game API. Por padrão, cada operação em nossa API é mapeada para uma função lambda individual para lidar com essa operação.

Agora é hora de construir nosso código pela primeira vez
Terminal window
pnpm nx run-many --target build --all

Você deve ser questionado com o seguinte:

Terminal window
NX The workspace is out of sync
[@nx/js:typescript-sync]: Some TypeScript configuration files are missing project references to the projects they depend on or contain outdated project references.
This will result in an error in CI.
? Would you like to sync the identified changes to get your workspace up to date?
Yes, sync the changes and run the tasks
No, run the tasks without syncing the changes

Esta mensagem indica que o NX detectou alguns arquivos que podem ser atualizados automaticamente. Neste caso, está se referindo aos arquivos tsconfig.json que não têm referências de projeto TypeScript configuradas em projetos dependentes. Selecione a opção Yes, sync the changes and run the tasks para prosseguir. Você deve notar que todos os erros de importação relacionados à IDE são resolvidos automaticamente, pois o gerador de sincronização adicionará as referências TypeScript faltantes automaticamente!

Todos os artefatos construídos estão agora disponíveis dentro da pasta dist/ na raiz do monorepo. Esta é uma prática padrão ao usar projetos gerados pelo @aws/nx-plugin, pois não polui sua árvore de arquivos com arquivos gerados. Caso queira limpar seus arquivos, você pode simplesmente deletar a pasta dist/ sem se preocupar com arquivos gerados espalhados pela árvore de arquivos.

Parabéns! Você criou todos os subprojetos necessários para começar a implementar o núcleo do nosso jogo Dunegeon Adventure. 🎉🎉🎉