Skip to content

Commit 4a4ad0b

Browse files
fix(py): ensure bundle target only bundles required dependencies (#235)
* fix(py): ensure bundle target only bundles required dependencies The bundle target for FastAPI and Python lambda functions was including the dependencies for all packages in the workspace, rather than just those for the target package. Updated to include only the appropriate dependencies. Also fix the python documentation on local dependencies as it was incorrect. * docs: update translations --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent 17397df commit 4a4ad0b

File tree

21 files changed

+584
-460
lines changed

21 files changed

+584
-460
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ Now we will update the `story_api` to support the [Lambda Web Adapter](https://g
104104
"outputs": ["{workspaceRoot}/dist/packages/story_api/bundle"],
105105
"options": {
106106
"commands": [
107-
"uv export --frozen --no-dev --no-editable --project story_api -o dist/packages/story_api/bundle/requirements.txt",
107+
"uv export --frozen --no-dev --no-editable --project packages/story_api --package dungeon_adventure.story_api -o dist/packages/story_api/bundle/requirements.txt",
108108
"uv pip install -n --no-installer-metadata --no-compile-bytecode --python-platform x86_64-manylinux2014 --target dist/packages/story_api/bundle -r dist/packages/story_api/bundle/requirements.txt",
109109
+ "copyfiles -f packages/story_api/run.sh dist/packages/story_api/bundle"
110110
],
@@ -208,11 +208,11 @@ function acurl {
208208
[Parameter(Mandatory=$true)][string]$Service,
209209
[Parameter(ValueFromRemainingArguments=$true)][string[]]$CurlArgs
210210
)
211-
211+
212212
$AccessKey = aws configure get aws_access_key_id
213213
$SecretKey = aws configure get aws_secret_access_key
214214
$SessionToken = aws configure get aws_session_token
215-
215+
216216
& curl --aws-sigv4 "aws:amz:$Region`:$Service" --user "$AccessKey`:$SecretKey" -H "X-Amz-Security-Token: $SessionToken" @CurlArgs
217217
}
218218
```

docs/src/content/docs/en/guides/python-project.mdx

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,25 @@ Add your Python source code in the `<module-name>` directory.
5656

5757
### Importing your Library Code in Other Projects
5858

59-
Since [UV workspaces](https://docs.astral.sh/uv/concepts/projects/workspaces/) are set up for you, you can reference your Python project from any other Python project in your workspace:
59+
Use the `add` target to add a dependency to a Python project.
6060

61-
```python title="packages/my_other_project/my_other_project/main.py"
62-
from "my_library.hello" import say_hello
61+
Suppose we have created two python projects, `my_app` and `my_lib`. These will have fully qualified project names of `my_scope.my_app` and `my_scope.my_lib`, and by default will each have module names of `my_scope_my_app` and `my_scope_my_lib`.
62+
63+
For `my_app` to depend on `my_lib`, we can run the following command:
64+
65+
<NxCommands commands={['run my_scope.my_app:add my_scope.my_lib']} />
66+
67+
:::note
68+
We use the fully qualified project name for both the dependant and dependee. We can use the shorthand syntax for the project we want to add the dependency to, but must fully qualify the name of the project to depend on.
69+
:::
70+
71+
You can then import your library code:
72+
73+
```python title="packages/my_app/my_scope_my_app/main.py"
74+
from my_scope_my_lib.hello import say_hello
6375
```
6476

65-
Above, `my_library` is the module name, `hello` corresponds to the Python source file `hello.py`, and `say_hello` is a method defined in `hello.py`
77+
Above, `my_scope_my_lib` is the module name for the lib, `hello` corresponds to the Python source file `hello.py`, and `say_hello` is a method defined in `hello.py`
6678

6779
### Dependencies
6880

@@ -87,7 +99,7 @@ When you use your Python project as runtime code (for example as the handler for
8799
"outputs": ["{workspaceRoot}/dist/packages/my_library/bundle"],
88100
"options": {
89101
"commands": [
90-
"uv export --frozen --no-dev --no-editable --project packages/my_library -o dist/packages/my_library/bundle/requirements.txt",
102+
"uv export --frozen --no-dev --no-editable --project packages/my_library --package my_scope.my_library -o dist/packages/my_library/bundle/requirements.txt",
91103
"uv pip install -n --no-installer-metadata --no-compile-bytecode --python-platform x86_64-manylinux2014 --python `uv python pin` --target dist/packages/my_library/bundle -r dist/packages/my_library/bundle/requirements.txt"
92104
],
93105
"parallel": false

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

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: "Juego de Mazmorra con IA"
3-
description: "Un tutorial de cómo construir un juego de aventuras de mazmorra con IA utilizando el @aws/nx-plugin."
3+
description: "Un tutorial de cómo construir un juego de aventuras de mazmorra con IA usando el @aws/nx-plugin."
44
---
55

66

@@ -29,15 +29,15 @@ import gameConversationPng from '@assets/game-conversation.png'
2929
Asegúrate de haber otorgado acceso al modelo **Anthropic Claude 3.5 Sonnet v2** siguiendo los pasos descritos en [esta guía](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access-modify.html).
3030
</Aside>
3131

32-
La StoryApi consta de una única API `generate_story` que, dado un `Game` y una lista de `Action`s como contexto, generará una progresión de la historia. Esta API se implementará como una API de streaming en Python/FastAPI y demostrará cómo realizar modificaciones al código generado para adaptarlo a su propósito.
32+
La StoryApi consta de una única API `generate_story` que, dado un `Game` y una lista de `Action`s como contexto, generará una progresión de la historia. Esta API se implementará como una API de streaming en Python/FastAPI y además demostrará cómo se pueden realizar modificaciones al código generado para adaptarlo a su propósito.
3333

3434
### Implementación de la API
3535

3636
Para crear nuestra API, primero necesitamos instalar algunas dependencias adicionales:
3737

38-
- `boto3` se usará para interactuar con Amazon Bedrock;
39-
- `uvicorn` se utilizará para iniciar nuestra API en combinación con el [Lambda Web Adapter (LWA)](https://github.com/awslabs/aws-lambda-web-adapter);
40-
- `copyfiles` es una dependencia de npm necesaria para soportar la copia multiplataforma de archivos al actualizar nuestra tarea `bundle`.
38+
- `boto3` se usará para llamar a Amazon Bedrock;
39+
- `uvicorn` se usará para iniciar nuestra API en conjunto con el [Lambda Web Adapter (LWA)](https://github.com/awslabs/aws-lambda-web-adapter).
40+
- `copyfiles` es una dependencia de npm que necesitaremos para soportar la copia multiplataforma de archivos al actualizar nuestra tarea `bundle`.
4141

4242
Para instalar estas dependencias, ejecuta los siguientes comandos:
4343

@@ -54,28 +54,28 @@ Ahora reemplazaremos el contenido de los siguientes archivos en `packages/story_
5454
<E2ECode path="dungeon-adventure/3/init.py.template" lang="python" />
5555

5656
:::note
57-
El cambio anterior en `init.py` simplemente elimina el middleware CORS para evitar conflictos con el manejo de cabeceras CORS propio de las Lambda Function URLs.
57+
El cambio anterior en `init.py` simplemente elimina el middleware CORS para evitar conflictos con el manejo propio de cabeceras CORS de Lambda Function URL.
5858
:::
5959

6060
</TabItem>
6161
</Tabs>
6262

6363
Analizando el código anterior:
6464

65-
- Usamos la configuración `x-streaming` para indicar que es una API de streaming al generar nuestro SDK cliente. Esto nos permitirá consumir esta API en modo streaming manteniendo la seguridad de tipos.
66-
- Nuestra API simplemente devuelve un flujo de texto definido por `media_type="text/plain"` y `response_class=PlainTextResponse`
65+
- Usamos la configuración `x-streaming` para indicar que esta es una API de streaming cuando generemos nuestro SDK cliente. ¡Esto nos permitirá consumir esta API en modo streaming manteniendo la seguridad de tipos!
66+
- Nuestra API simplemente devuelve un flujo de texto definido tanto por `media_type="text/plain"` como por `response_class=PlainTextResponse`
6767

6868
:::note
69-
Cada vez que realices cambios en tu FastAPI, necesitarás reconstruir el proyecto para ver esos cambios reflejados en el cliente generado en tu sitio web.
69+
Cada vez que realices cambios en tu FastAPI, necesitarás reconstruir tu proyecto para ver esos cambios reflejados en el cliente generado en tu sitio web.
7070

71-
Haremos algunos cambios más antes de reconstruir.
71+
Haremos algunos cambios más a continuación antes de reconstruir.
7272
:::
7373

7474
### Infraestructura
7575

76-
La <Link path="get_started/tutorials/dungeon-game/1#game-ui-infrastructure">infraestructura configurada previamente</Link> asume que todas las APIs usan API Gateway integrado con funciones Lambda. Para nuestra `story_api` no queremos usar API Gateway ya que no soporta respuestas en streaming. En su lugar, usaremos una [Lambda Function URL configurada con response streaming](https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html).
76+
La <Link path="get_started/tutorials/dungeon-game/1#game-ui-infrastructure">infraestructura que configuramos anteriormente</Link> asume que todas las APIs tienen una API Gateway integrada con funciones Lambda. Para nuestra `story_api` no queremos usar API Gateway ya que no soporta respuestas en streaming. En su lugar, usaremos una [Lambda Function URL configurada con response streaming](https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html).
7777

78-
Para implementar esto, actualizaremos primero nuestros constructos de CDK:
78+
Para soportar esto, primero actualizaremos nuestros constructos de CDK de la siguiente manera:
7979

8080
<Tabs>
8181
<TabItem label="story-api.ts">
@@ -86,7 +86,7 @@ Para implementar esto, actualizaremos primero nuestros constructos de CDK:
8686
</TabItem>
8787
</Tabs>
8888

89-
Ahora actualizaremos la `story_api` para soportar el despliegue con [Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter):
89+
Ahora actualizaremos la `story_api` para soportar el despliegue con [Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter).
9090

9191
<Tabs>
9292
<TabItem label="run.sh">
@@ -106,7 +106,7 @@ Ahora actualizaremos la `story_api` para soportar el despliegue con [Lambda Web
106106
"outputs": ["{workspaceRoot}/dist/packages/story_api/bundle"],
107107
"options": {
108108
"commands": [
109-
"uv export --frozen --no-dev --no-editable --project story_api -o dist/packages/story_api/bundle/requirements.txt",
109+
"uv export --frozen --no-dev --no-editable --project packages/story_api --package dungeon_adventure.story_api -o dist/packages/story_api/bundle/requirements.txt",
110110
"uv pip install -n --no-installer-metadata --no-compile-bytecode --python-platform x86_64-manylinux2014 --target dist/packages/story_api/bundle -r dist/packages/story_api/bundle/requirements.txt",
111111
+ "copyfiles -f packages/story_api/run.sh dist/packages/story_api/bundle"
112112
],
@@ -123,33 +123,33 @@ Ahora actualizaremos la `story_api` para soportar el despliegue con [Lambda Web
123123

124124
### Despliegue y pruebas
125125

126-
Primero, construyamos el código base:
126+
Primero, construyamos la base de código:
127127

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

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

133133
<NxCommands commands={['run-many --target lint --configuration=fix --all']} />
134134
</Aside>
135135

136-
Ahora puedes desplegar la aplicación ejecutando:
136+
Ahora puedes desplegar tu aplicación ejecutando el siguiente comando:
137137

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

140-
Este despliegue tomará aproximadamente 2 minutos.
140+
Este despliegue tomará aproximadamente 2 minutos en completarse.
141141

142-
<Drawer title="Comando de despliegue" trigger="También puedes desplegar todos los stacks a la vez. Haz clic para más detalles.">
142+
<Drawer title="Comando de despliegue" trigger="También puedes desplegar todos los stacks a la vez. Haz clic aquí para más detalles.">
143143

144-
Puedes desplegar todos los stacks de la aplicación CDK ejecutando:
144+
También puedes desplegar todos los stacks contenidos en la aplicación CDK ejecutando:
145145

146146
<NxCommands commands={['run @dungeon-adventure/infra:deploy --all']} />
147147

148-
Esto **no se recomienda** ya que podrías tener stacks separados para diferentes etapas de despliegue (ej. infra-prod). En ese caso, el flag `--all` intentaría desplegar todo, pudiendo resultar en despliegues no deseados.
148+
Esto **no se recomienda** ya que podrías elegir separar tus etapas de despliegue como stacks separados `ej. infra-prod`. En este caso, el flag `--all` intentará desplegar todos los stacks lo que puede resultar en despliegues no deseados.
149149

150150
</Drawer>
151151

152-
Una vez completado el despliegue, verás salidas similares a estas _(algunos valores fueron omitidos)_:
152+
Una vez completado el despliegue, deberías ver algunas salidas similares a las siguientes _(algunos valores han sido omitidos)_:
153153

154154
```bash
155155
dungeon-adventure-infra-sandbox
@@ -168,16 +168,15 @@ dungeon-adventure-infra-sandbox.UserIdentityUserIdentityIdentityPoolIdXXX = regi
168168
dungeon-adventure-infra-sandbox.UserIdentityUserIdentityUserPoolIdXXX = region_xxx
169169
```
170170

171-
Podemos probar nuestra API de dos formas:
171+
Podemos probar nuestra API de dos maneras:
172172
<ul>
173-
<li>Iniciando una instancia local del servidor FastAPI e invocando las APIs con `curl`</li>
173+
<li>Iniciando una instancia local del servidor FastAPI e invocando las APIs usando `curl`.</li>
174174
<li>
175-
<Drawer title="curl con Sigv4 habilitado" trigger="Llamar directamente a la API desplegada usando curl con Sigv4">
175+
<Drawer title="Curl con Sigv4 habilitado" trigger="Llamando a la API desplegada usando curl con Sigv4 directamente">
176176

177177
<Tabs>
178178
<TabItem label="Bash/Linux/macOS">
179-
Puedes agregar este script a tu archivo `.bashrc` (y hacer `source`) o pegarlo directamente en la terminal:
180-
179+
Puedes agregar el siguiente script a tu archivo `.bashrc` (y hacer `source`) o simplemente pegarlo en la misma terminal donde quieras ejecutar el comando.
181180
```bash
182181
// ~/.bashrc
183182
acurl () {
@@ -188,45 +187,45 @@ acurl () {
188187
}
189188
```
190189

191-
Ejemplos de uso:
190+
Luego para hacer una petición curl autenticada con sigv4, puedes invocar `acurl` como en los siguientes ejemplos:
192191

193192
###### API Gateway
194193
```bash
195194
acurl ap-southeast-2 execute-api -X GET https://xxx
196195
```
197196

198-
###### Lambda Function URL con streaming
197+
###### URL de función Lambda con streaming
199198
```bash
200199
acurl ap-southeast-2 lambda -N -X POST https://xxx
201200
```
202201
</TabItem>
203202
<TabItem label="Windows PowerShell">
204-
Agrega esta función a tu perfil de PowerShell o pégala en la sesión actual:
205-
203+
Puedes agregar la siguiente función a tu perfil de PowerShell o simplemente pegarla en la misma sesión donde quieras ejecutar el comando.
206204
```powershell
205+
# Perfil de PowerShell o sesión actual
207206
function acurl {
208207
param(
209208
[Parameter(Mandatory=$true)][string]$Region,
210209
[Parameter(Mandatory=$true)][string]$Service,
211210
[Parameter(ValueFromRemainingArguments=$true)][string[]]$CurlArgs
212211
)
213-
212+
214213
$AccessKey = aws configure get aws_access_key_id
215214
$SecretKey = aws configure get aws_secret_access_key
216215
$SessionToken = aws configure get aws_session_token
217-
216+
218217
& curl --aws-sigv4 "aws:amz:$Region`:$Service" --user "$AccessKey`:$SecretKey" -H "X-Amz-Security-Token: $SessionToken" @CurlArgs
219218
}
220219
```
221220

222-
Ejemplos de uso:
221+
Luego para hacer una petición curl autenticada con sigv4, puedes invocar `acurl` como en los siguientes ejemplos:
223222

224223
###### API Gateway
225224
```powershell
226225
acurl ap-southeast-2 execute-api -X GET https://xxx
227226
```
228227

229-
###### Lambda Function URL con streaming
228+
###### URL de función Lambda con streaming
230229
```powershell
231230
acurl ap-southeast-2 lambda -N -X POST https://xxx
232231
```
@@ -239,11 +238,11 @@ acurl ap-southeast-2 lambda -N -X POST https://xxx
239238

240239
<Tabs>
241240
<TabItem label="Local">
242-
Inicia el servidor FastAPI localmente con:
241+
Inicia tu servidor FastAPI local ejecutando:
243242
<NxCommands commands={["run dungeon_adventure.story_api:serve"]} />
244243

245-
Una vez en ejecución, llama a la API con:
246-
244+
Una vez que el servidor FastAPI esté en ejecución, llámalo con:
245+
247246
```bash
248247
curl -N -X POST http://127.0.0.1:8000/story/generate \
249248
-d '{"genre":"superhero", "actions":[], "playerName":"UnnamedHero"}' \
@@ -263,10 +262,10 @@ acurl ap-southeast-2 lambda -N -X POST \
263262
</TabItem>
264263
</Tabs>
265264

266-
Si el comando se ejecuta correctamente, verás una respuesta en streaming similar a:
265+
Si el comando se ejecuta correctamente, deberías ver una respuesta transmitida similar a:
267266

268267
```
269-
UnnamedHero stood tall, his cape billowing in the wind....
268+
UnnamedHero se alzó imponente, su capa ondeando al viento....
270269
```
271270

272271
¡Felicidades! Has construido y desplegado tu primera API usando FastAPI. 🎉🎉🎉

0 commit comments

Comments
 (0)