Skip to content

Commit 94b9c02

Browse files
docs(diff): display two tabs for diffs additions and additions/deletions (#336)
* docs(diff): display two tabs for diffs additions and additions/deletions To save copy/paste errors when following the dungeon adventure tutorial, by default we show only the "after" content (highlighting added lines). Also include a tab for users to see the full diff too. Fixes #332 * docs: display diffs which were previously too complex to display * docs: update translations --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent ea2b060 commit 94b9c02

File tree

20 files changed

+409
-329
lines changed

20 files changed

+409
-329
lines changed

docs/src/components/diff.astro

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
import { Code } from '@astrojs/starlight/components';
2+
import { Code, Tabs, TabItem } from '@astrojs/starlight/components';
33
import { diffLines } from 'diff';
44
55
const { before, after, lang } = Astro.props;
@@ -10,5 +10,26 @@ const diff = diffLines(before, after, { newlineIsToken: false })
1010
return change.value.slice(0, -1).split('\n').map(line => `${prefix}${line}`).join('\n') + '\n';
1111
}).join('');
1212
13+
let removedLines = 0;
14+
const afterMeta = diff.split('\n').map((line, i) => {
15+
if (line.startsWith('+')) {
16+
return `ins={${i + 1 - removedLines}}`;
17+
} else if (line.startsWith('-')) {
18+
removedLines++;
19+
}
20+
return undefined;
21+
}).filter(x => x).join(' ');
22+
1323
---
14-
<Code lang="diff" code={diff} {...(lang ? { meta: `lang="${lang}"`} : {})} />
24+
{
25+
removedLines > 0 ? (
26+
<Tabs syncKey="diff">
27+
<TabItem label="+">
28+
<Code lang={lang} code={after} meta={afterMeta} />
29+
</TabItem>
30+
<TabItem label="+-">
31+
<Code lang="diff" code={diff} {...(lang ? { meta: `lang="${lang}"`} : {})} />
32+
</TabItem>
33+
</Tabs>
34+
) : <Code lang="diff" code={diff} {...(lang ? { meta: `lang="${lang}"`} : {})} />
35+
}

docs/src/content/docs/en/get_started/tutorials/dungeon-game/3.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ Let's implement our agent. Update the following files in `packages/story/dungeon
3939

4040
<Tabs>
4141
<TabItem label="main.py">
42-
<E2ECode lang="python" path="dungeon-adventure/3/main.py.template" />
42+
<E2EDiff lang="python" before="dungeon-adventure/3/main.py.old.template" after="dungeon-adventure/3/main.py.template" />
4343
</TabItem>
4444
<TabItem label="agent.py">
45-
<E2ECode lang="python" path="dungeon-adventure/3/agent.py.template" />
45+
<E2EDiff lang="python" before="dungeon-adventure/3/agent.py.old.template" after="dungeon-adventure/3/agent.py.template" />
4646
</TabItem>
4747
</Tabs>
4848

docs/src/content/docs/en/get_started/tutorials/dungeon-game/4.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Let's also update the `index.tsx` file to load our new `/game` route by default.
7070

7171
<Tabs>
7272
<TabItem label="routes/index.tsx">
73-
<E2ECode path="dungeon-adventure/4/routes/index.tsx.template" lang="tsx" />
73+
<E2EDiff before="dungeon-adventure/4/routes/index.tsx.old.template" after="dungeon-adventure/4/routes/index.tsx.template" lang="tsx" />
7474
</TabItem>
7575
</Tabs>
7676

docs/src/content/docs/es/get_started/tutorials/dungeon-game/3.mdx

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ import gameConversationPng from '@assets/game-conversation.png'
2626
## Módulo 3: Implementación del Agente de Historia
2727

2828
<Aside type="caution">
29-
Asegúrate de que tu cuenta AWS tenga acceso habilitado al [modelo predeterminado de Strands](https://strandsagents.com/latest/documentation/docs/user-guide/concepts/model-providers/amazon-bedrock/) dentro de Bedrock para tu región objetivo siguiendo los pasos de [esta guía](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access-modify.html). Al momento de escribir esto, el modelo es Anthropic Claude Sonnet 4.
29+
Asegúrate de que tu cuenta de AWS haya habilitado acceso al [modelo predeterminado de Strands](https://strandsagents.com/latest/documentation/docs/user-guide/concepts/model-providers/amazon-bedrock/) dentro de Bedrock para tu región objetivo siguiendo los pasos descritos en [esta guía](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access-modify.html). Al momento de escribir esto, el modelo es Anthropic Claude Sonnet 4.
3030
</Aside>
3131

3232
El Agente de Historia es un agente de [Strands](https://strandsagents.com/) que, dado un `Game` y una lista de `Action`s como contexto, avanzará una historia. Configuraremos el agente para interactuar con nuestro Inventory MCP Server y gestionar los objetos disponibles del jugador.
3333

3434
:::note
35-
Para simplificar este tutorial, implementamos el Agente de forma "sin estado", donde cada invocación es una sesión independiente que incluye todo el historial de mensajes. Para producción, considera integrar con [Bedrock AgentCore Memory](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/memory.html). Más documentación sobre el uso de AgentCore Memory con Strands está [disponible aquí](https://github.com/aws/bedrock-agentcore-sdk-python/tree/main/src/bedrock_agentcore/memory/integrations/strands).
35+
Para simplificar este tutorial, implementamos el Agente de forma "sin estado" donde cada invocación es una sesión independiente que incluye todo el historial de mensajes. Para entornos de producción, considera integrar con [Bedrock AgentCore Memory](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/memory.html). Más documentación sobre el uso de AgentCore Memory con Strands está [disponible aquí](https://github.com/aws/bedrock-agentcore-sdk-python/tree/main/src/bedrock_agentcore/memory/integrations/strands).
3636
:::
3737

3838
### Implementación del Agente
@@ -41,10 +41,10 @@ Implementemos nuestro agente. Actualiza los siguientes archivos en `packages/sto
4141

4242
<Tabs>
4343
<TabItem label="main.py">
44-
<E2ECode lang="python" path="dungeon-adventure/3/main.py.template" />
44+
<E2EDiff lang="python" before="dungeon-adventure/3/main.py.old.template" after="dungeon-adventure/3/main.py.template" />
4545
</TabItem>
4646
<TabItem label="agent.py">
47-
<E2ECode lang="python" path="dungeon-adventure/3/agent.py.template" />
47+
<E2EDiff lang="python" before="dungeon-adventure/3/agent.py.old.template" after="dungeon-adventure/3/agent.py.template" />
4848
</TabItem>
4949
</Tabs>
5050

@@ -61,7 +61,7 @@ Primero, compilemos el código base:
6161
<NxCommands commands={['run-many --target build --all']} />
6262

6363
<Aside type="tip">
64-
Si encuentras errores de linting, ejecuta este comando para corregirlos automáticamente:
64+
Si encuentras errores de linting, puedes ejecutar el siguiente comando para corregirlos automáticamente.
6565

6666
<NxCommands commands={['run-many --target lint --configuration=fix --all']} />
6767
</Aside>
@@ -72,7 +72,7 @@ Ahora puedes desplegar la aplicación ejecutando:
7272

7373
Este despliegue tomará aproximadamente 2 minutos en completarse.
7474

75-
Una vez completado, verás salidas similares a estas _(algunos valores fueron omitidos)_:
75+
Una vez completado el despliegue, verás salidas similares a las siguientes _(algunos valores han sido omitidos)_:
7676

7777
```bash
7878
dungeon-adventure-infra-sandbox-Application
@@ -104,10 +104,10 @@ Podemos probar nuestra API de dos formas:
104104
<NxCommands highlights={['arn:aws:bedrock-agentcore:region:xxxxxxx:runtime/dungeonadventureventoryMcpServerXXXX-YYYY', 'region']} env={{PORT: '9999', INVENTORY_MCP_ARN:"arn:aws:bedrock-agentcore:region:xxxxxxx:runtime/dungeonadventureventoryMcpServerXXXX-YYYY", AWS_REGION: '<region>'}} commands={["run dungeon_adventure.story:agent-serve"]} />
105105

106106
:::caution
107-
Usa la salida `InventoryMcpArn` del despliegue CDK arriba, y especifica tu `AWS_REGION` objetivo.
107+
Usa el output `InventoryMcpArn` del despliegue CDK arriba, además de especificar tu `AWS_REGION` objetivo.
108108
:::
109109

110-
Cuando el servidor esté activo (¡no verás ninguna salida!), invócalo con:
110+
Una vez que el servidor del Agente esté en ejecución (¡no verás ninguna salida!), invócalo con:
111111

112112
```bash
113113
curl -N -X POST http://127.0.0.1:9999/invocations \
@@ -117,16 +117,16 @@ Podemos probar nuestra API de dos formas:
117117
```
118118
</TabItem>
119119
<TabItem label="Desplegado">
120-
Para probar el agente desplegado, necesitas autenticarte con Cognito y obtener un token JWT. Primero configura tus variables de entorno:
120+
Para probar el agente desplegado, necesitarás autenticarte con Cognito y obtener un token JWT. Primero configura tus variables de entorno:
121121

122122
```bash
123-
# Usa el User Pool ID y Client ID de las salidas CDK
124-
export POOL_ID="<UserPoolId de salidas CDK>"
125-
export CLIENT_ID="<UserPoolClientId de salidas CDK>"
126-
export REGION="<tu-región>"
123+
# Establece tu User Pool ID y Client ID de Cognito desde los outputs de CDK
124+
export POOL_ID="<UserPoolId from CDK outputs>"
125+
export CLIENT_ID="<UserPoolClientId from CDK outputs>"
126+
export REGION="<your-region>"
127127
```
128128

129-
Crea un usuario de prueba y obtén un token:
129+
Crea un usuario de prueba y obtén un token de autenticación:
130130

131131
```bash
132132
# Crear usuario
@@ -137,7 +137,7 @@ Podemos probar nuestra API de dos formas:
137137
--region $REGION \
138138
--message-action SUPPRESS > /dev/null
139139

140-
# Establecer contraseña permanente
140+
# Establecer contraseña permanente (¡reemplaza con algo más seguro!)
141141
aws cognito-idp admin-set-user-password \
142142
--user-pool-id $POOL_ID \
143143
--username "testuser" \
@@ -154,22 +154,22 @@ Podemos probar nuestra API de dos formas:
154154
```
155155

156156
:::caution
157-
Usa la salida `UserIdentityUserIdentityUserPoolIdXXX` para `POOL_ID` y asegúrate de tener el Client ID correspondiente de las salidas CDK.
157+
Usa el output `UserIdentityUserIdentityUserPoolIdXXX` para `POOL_ID` y asegúrate de tener el Client ID correspondiente en tus outputs de despliegue CDK.
158158
:::
159159

160-
Ahora invoca el agente desplegado usando la URL de Bedrock AgentCore:
160+
Ahora invoca el agente desplegado usando la URL de Bedrock AgentCore Runtime:
161161

162162
```bash
163-
# Usa el StoryAgentArn de las salidas CDK
164-
export AGENT_ARN="<StoryAgentArn de salidas CDK>"
163+
# Establece el ARN del Agente de Historia desde los outputs de CDK
164+
export AGENT_ARN="<StoryAgentArn from CDK outputs>"
165165

166-
# Codificar ARN para URL
166+
# Codifica el ARN en URL
167167
export ENCODED_ARN=$(echo $AGENT_ARN | sed 's/:/%3A/g' | sed 's/\//%2F/g')
168168

169-
# Construir URL de invocación
169+
# Construye la URL de invocación
170170
export MCP_URL="https://bedrock-agentcore.$REGION.amazonaws.com/runtimes/$ENCODED_ARN/invocations?qualifier=DEFAULT"
171171

172-
# Invocar el agente
172+
# Invoca el agente
173173
curl -N -X POST "$MCP_URL" \
174174
-H "authorization: Bearer $BEARER_TOKEN" \
175175
-H "Content-Type: application/json" \
@@ -178,12 +178,12 @@ Podemos probar nuestra API de dos formas:
178178
```
179179

180180
:::note
181-
La codificación URL es necesaria para formatear correctamente el ARN en el endpoint de Bedrock AgentCore.
181+
La codificación URL es necesaria para formatear correctamente el ARN en el endpoint de API de Bedrock AgentCore.
182182
:::
183183
</TabItem>
184184
</Tabs>
185185

186-
Si el comando tiene éxito, verás eventos transmitidos similares a:
186+
Si el comando se ejecuta correctamente, verás eventos transmitidos similares a:
187187

188188
```
189189
data: {"init_event_loop": true}
@@ -199,4 +199,4 @@ data: {"event": {"contentBlockDelta": {"delta": {"text": "Welcome"}, "contentBlo
199199
...
200200
```
201201

202-
¡Felicidades! Has implementado tu primer Agente de Strands en Bedrock AgentCore Runtime. 🎉🎉🎉
202+
¡Felicidades! Has construido y desplegado tu primer Agente de Strands en Bedrock AgentCore Runtime. 🎉🎉🎉

docs/src/content/docs/es/get_started/tutorials/dungeon-game/4.mdx

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ Para comenzar a construir la interfaz de usuario, necesitamos configurar nuestro
2828

2929
<NxCommands commands={["run @dungeon-adventure/game-ui:load:runtime-config"]} />
3030

31-
Este comando descargará el archivo `runtime-config.json` que está desplegado y lo almacenará localmente en la carpeta `packages/game-ui/public`.
31+
Este comando descargará el `runtime-config.json` que está desplegado y lo almacenará localmente en la carpeta `packages/game-ui/public`.
3232

3333
Ahora podemos iniciar el servidor de desarrollo con el siguiente comando:
3434

3535
<NxCommands commands={["run @dungeon-adventure/game-ui:serve"]} />
3636

37-
Luego puedes abrir el sitio web local en tu navegador, donde se te pedirá iniciar sesión y seguir las instrucciones para crear un nuevo usuario. Una vez completado, deberías ver el sitio web base:
37+
Luego puedes abrir el sitio web local en tu navegador, donde se te pedirá iniciar sesión y seguir las indicaciones para crear un nuevo usuario. Una vez completado, deberías ver el sitio web base:
3838

3939
<Image src={baselineWebsitePng} alt="baseline-website.png" width="800" height="600" />
4040

@@ -43,14 +43,14 @@ _Mantendremos el servidor de desarrollo en ejecución durante el resto de este m
4343
</Aside>
4444

4545
:::tip
46-
Puedes ejecutar <NxCommands commands={["run @dungeon-adventure/game-ui:serve-local"]} /> para iniciar también los servidores locales de APIs conectadas, permitiéndote iterar simultáneamente en tu API tRPC y tu sitio web.
46+
Puedes ejecutar <NxCommands commands={["run @dungeon-adventure/game-ui:serve-local"]} /> en su lugar, lo que adicionalmente iniciará cualquier servidor API local conectado, permitiéndote iterar tanto en tu API tRPC como en tu sitio web simultáneamente.
4747
:::
4848

4949
### Crear una nueva ruta '/game'
5050

51-
Mostraremos las capacidades de `@tanstack/react-router` creando una nueva ruta tipada. Para hacerlo, simplemente crea un archivo vacío en: `packages/game-ui/src/routes/game/index.tsx`. Notarás que el archivo se actualiza inmediatamente.
51+
Mostraremos las capacidades de `@tanstack/react-router` creando una nueva ruta tipada. Para esto, simplemente crea un archivo vacío en la siguiente ubicación: `packages/game-ui/src/routes/game/index.tsx`. Notarás que el archivo se actualiza inmediatamente.
5252

53-
El `@tanstack/react-router` ha configurado automáticamente tu nueva ruta y observarás que el archivo recién creado ya contiene la ruta:
53+
El `@tanstack/react-router` ha configurado automáticamente tu nueva ruta y observarás que el archivo que acabas de crear ya está poblado con la ruta:
5454

5555
```tsx
5656
import { createFileRoute } from '@tanstack/react-router'
@@ -64,23 +64,23 @@ function RouteComponent() {
6464
}
6565
```
6666

67-
Si navegas a `http://localhost:4200/game`, ¡verás que se renderiza tu nueva página!
67+
Ahora, si navegas a `http://localhost:4200/game`, ¡verás que tu nueva página se ha renderizado!
6868

6969
<Image src={baselineGamePng} alt="baseline-game.png" width="800" height="600" />
7070

7171
Actualicemos también el archivo `index.tsx` para cargar nuestra nueva ruta `/game` por defecto. Observa cómo al actualizar el campo `to`, tienes una lista de rutas tipadas para elegir.
7272

7373
<Tabs>
7474
<TabItem label="routes/index.tsx">
75-
<E2ECode path="dungeon-adventure/4/routes/index.tsx.template" lang="tsx" />
75+
<E2EDiff before="dungeon-adventure/4/routes/index.tsx.old.template" after="dungeon-adventure/4/routes/index.tsx.template" lang="tsx" />
7676
</TabItem>
7777
</Tabs>
7878

7979
Finalmente podemos eliminar la carpeta `packages/game-ui/src/routes/welcome/` ya que no es necesaria.
8080

8181
### Actualizaciones de diseño
8282

83-
El diseño predeterminado se asemeja más a una aplicación empresarial estilo SaaS que a un juego. Reconfiguraremos el diseño y aplicaremos un tema más acorde a un juego de mazmorras.
83+
El diseño predeterminado está más orientado a aplicaciones empresariales estilo SaaS que a un juego. Vamos a reconfigurar el diseño y rediseñar el tema para que se asemeje más a un juego de estilo mazmorra.
8484

8585
Realicemos los siguientes cambios en `packages/game-ui/src`:
8686

@@ -100,7 +100,7 @@ Ahora eliminemos el archivo `packages/game-ui/src/hooks/useAppLayout.tsx` ya que
100100

101101
### Integración del Agente de Historia
102102

103-
A continuación crearemos un hook para interactuar con nuestro Agente de Historia.
103+
A continuación crearemos un hook para inicializar un cliente que interactúe con nuestro Agente de Historia.
104104

105105
<Tabs>
106106
<TabItem label="hooks/useStoryAgent.tsx">
@@ -116,12 +116,12 @@ Esto realiza lo siguiente:
116116
- Retorna un iterador asíncrono para consumir fragmentos de mensajes transmitidos
117117

118118
:::tip
119-
Notarás que la integración con nuestra Game API ya está configurada - no necesitamos hacer nada gracias al generador `api-connection`. Por favor vota [+1 en este issue de GitHub](https://github.com/awslabs/nx-plugin-for-aws/issues/326) si deseas una experiencia similar para agentes.
119+
Notarás que la integración con nuestra Game API ya está configurada - no tenemos que hacer nada manualmente ya que usamos el generador `api-connection`. Por favor da +1 a [este issue de GitHub](https://github.com/awslabs/nx-plugin-for-aws/issues/326) si deseas una experiencia similar para agentes.
120120
:::
121121

122122
### Páginas del juego
123123

124-
Creemos las páginas del juego que consumirán nuestras APIs y completarán la implementación. Actualiza los siguientes archivos en `packages/game-ui/src/routes/game`:
124+
Creemos las páginas del juego que llamarán a nuestras APIs y completarán la implementación del juego. Actualiza los siguientes archivos en `packages/game-ui/src/routes/game`:
125125

126126
<Tabs>
127127
<TabItem label="index.tsx">
@@ -132,24 +132,24 @@ Creemos las páginas del juego que consumirán nuestras APIs y completarán la i
132132
<E2ECode path="dungeon-adventure/4/routes/game/$playerName.tsx.template" lang="tsx" />
133133

134134
<Aside type="tip">
135-
La sintaxis `$playerName` indica a `@tanstack/react-router` que trate `playerName` como un [parámetro de ruta](https://tanstack.com/router/v1/docs/framework/react/guide/path-params). Además implementamos el método `validateSearch` que asegura que el parámetro de consulta `genre` tenga un tipo fuerte según nuestro enum de géneros.
135+
La sintaxis `$playerName` indicará a `@tanstack/react-router` que trate `playerName` como un [parámetro de ruta](https://tanstack.com/router/v1/docs/framework/react/guide/path-params). Adicionalmente, implementamos el método `validateSearch` que asegura que el parámetro de consulta `genre` esté tipado según nuestro enum de géneros.
136136
</Aside>
137137
</TabItem>
138138
</Tabs>
139139

140-
Al realizar estos cambios, ¡tu servidor de desarrollo local (http://localhost:4200/) debería tener el juego listo para jugar!
140+
Al realizar estos cambios, ¡tu servidor de desarrollo local (http://localhost:4200/) debería tener ahora el juego listo para jugar!
141141

142-
<Drawer title="Compilar y desplegar" trigger="También puedes compilar y desplegar tu código en Cloudfront si prefieres.">
142+
<Drawer title="Compilar e implementar" trigger="También puedes compilar e implementar tu código en Cloudfront si lo prefieres.">
143143

144144
Para compilar tu código, ejecuta:
145145

146146
<NxCommands commands={['run-many --target build --all']} />
147147

148-
Ahora despliega tu aplicación:
148+
Ahora implementa tu aplicación:
149149

150150
<NxCommands commands={['run @dungeon-adventure/infra:deploy dungeon-adventure-infra-sandbox/*']} />
151151

152-
Una vez desplegado, navega a tu URL de Cloudfront que puedes encontrar en las salidas del despliegue de CDK.
152+
Una vez implementado, navega a tu URL de Cloudfront que puedes encontrar inspeccionando las salidas del despliegue de CDK.
153153

154154
</Drawer>
155155

@@ -158,4 +158,4 @@ Una vez desplegado, navega a tu URL de Cloudfront que puedes encontrar en las sa
158158
<Image src={gameConversationPng} alt="game-conversation.png" width="500" height="400" />
159159
</div>
160160

161-
¡Felicidades! Has construido y desplegado tu Juego de Mazmorras con Agentes Inteligentes. 🎉🎉🎉
161+
¡Felicidades! Has construido y desplegado tu Juego de Aventuras de Mazmorras con Agentes. 🎉🎉🎉

0 commit comments

Comments
 (0)