Введение
Команде сводки документа нужны предсказуемые границы для зависимости от ИИ. Вы добавите ограниченный клиент Bedrock в приложение, отклоните слишком длинный ввод до обращения к модели и обработаете сбой или медленный ответ без раскрытия исходных исключений.
Нужны основы Python и проверка структурированного вывода из предыдущей работы. Интерфейс и парсер предоставлены, чтобы вы сосредоточились на границах запросов. У новой VM собственный документ, настроенная идентификация и доступный лимит.
Связь с сертификацией
| Сертификация | Задача экзамена | Практика |
|---|---|---|
| AI Practitioner (AIF-C01) | Задачи 3.1, 3.2 | Ограничить вывод модели и обработать ответы внутри приложения. |

Подключите ограниченный клиент Bedrock
На этом шаге вы реализуете клиент предоставленной команды и получите реальную структурированную сводку.
Начните в рабочем каталоге:
cd /home/labex/project
Прочитайте исходный документ и параметры команды:
cat incident.txt
/opt/labex/aws/venv/bin/python application.py --help
Инцидент — INC-204. application.py читает документ и печатает JSON. Он вызывает client.request_summary; предоставленный response_parser.py проверяет завершение и три изученных строковых поля. Начальный client.py сообщает о незавершённой реализации и не отправляет запрос.
Ограничение входа защищает приложение до расходования лимита. Пример принимает непустой текст длиной 1–1000 символов, ограничивает вывод 768 токенами и явно задаёт тайм-ауты соединения и чтения. total_max_attempts: 1 означает один первоначальный запрос без автоматического повтора. Тайм-аут чтения ограничивает ожидание в соединении, а не обещает завершение любой операции ровно в этот момент.
Замените начальный клиент реализацией ниже. ClientError означает ответ об ошибке сервиса, ReadTimeoutError — истёкшее ожидание чтения. Оба превращаются в небольшие JSON-диагностики. Полные исключения, заголовки и учётные данные никогда не включаются в результат:
cat > client.py <<'EOF'
import boto3
from botocore.config import Config
from botocore.exceptions import BotoCoreError, ClientError, ReadTimeoutError
from response_parser import summarize_response
def request_summary(document, endpoint_url, read_timeout):
if not document.strip() or len(document) > 1000:
return {'status': 'rejected', 'reason': 'input_limit'}
client = boto3.client('bedrock-runtime', endpoint_url=endpoint_url,
config=Config(proxies={}, connect_timeout=3, read_timeout=read_timeout,
retries={'total_max_attempts': 1}))
try:
response = client.converse(
modelId='labex.text-v1:0',
system=[{'text': 'Summarize only facts supplied in the incident document. Return exactly one JSON object with string fields incident_id, impact and next_action. No Markdown fences, extra keys or surrounding prose. Do not turn planned work into completed work.'}],
messages=[{'role': 'user', 'content': [{'text': document}]}],
inferenceConfig={'maxTokens': 768, 'temperature': 0})
except ReadTimeoutError:
return {'status': 'unavailable', 'reason': 'read_timeout'}
except ClientError as error:
code = error.response.get('Error', {}).get('Code')
reason = 'busy' if code == 'ThrottlingException' else 'service_unavailable'
return {'status': 'unavailable', 'reason': reason}
except BotoCoreError:
return {'status': 'unavailable', 'reason': 'connection_failed'}
return summarize_response(response)
EOF
Запустите приложение с обычным настроенным endpoint Bedrock. > accepted.json сохраняет напечатанную выдачу:
/opt/labex/aws/venv/bin/python application.py > accepted.json
Прочитайте её:
cat accepted.json
Ожидайте status: ok и три поля. Сравните смысл с документом. Разверните реальный завершённый запрос в AWS View и сравните текст. Ограничение вывода сдерживает токены; предел входных символов — отдельная политика. Кешированный ответ может использовать реальный результат без нового расхода credits.

Отклоните длинный ввод до обращения к модели
На этом шаге вы подтвердите отказ для документа, превышающего входной бюджет.
Предоставленный oversized.txt содержит больше 1000 символов. wc -m считает символы:
wc -m oversized.txt
Обработайте файл тем же приложением:
/opt/labex/aws/venv/bin/python application.py --document oversized.txt > too-long.json
Это намеренное отклонение даёт код 2. echo $? печатает код предыдущей команды:
echo $?
Прочитайте безопасный результат:
cat too-long.json
Ожидайте status: rejected и reason: input_limit. Проверка происходит до построения запроса, поэтому в AWS View остаётся только прежний завершённый запрос. Отказ предотвращает новый расход; удаление результата не отменяет прежнюю оплату.
Обработайте сбой сервиса и тайм-аут чтения
На этом шаге вы проверите границы ошибок двумя явно локальными тестовыми транспортными сервисами.
Эти endpoints специально возвращают ошибку или задерживают ответ. Они не обращаются к модели и не расходуют credits. Это тестовые зависимости, не альтернативные поставщики успешного вывода.
Используйте тест недоступного сервиса на порту 5001:
/opt/labex/aws/venv/bin/python application.py --endpoint-url http://127.0.0.1:5001 > unavailable.json
Ожидаемый сбой даёт код 3. Изучите диагностику:
cat unavailable.json
Ожидайте status: unavailable и reason: service_unavailable без трассировки, полного текста ошибки SDK или учётных данных.
Сервис порта 5002 ждёт три секунды. Для теста задайте одну секунду ожидания чтения:
/opt/labex/aws/venv/bin/python application.py --endpoint-url http://127.0.0.1:5002 --read-timeout 1 > timed-out.json
Прочитайте результат:
cat timed-out.json
Ожидайте status: unavailable и reason: read_timeout. SDK делает одну попытку. Тайм-аут не доказывает отмену или бесплатность запроса к модели: реальный upstream может закончить после прекращения ожидания клиентом. Проверьте ожидающие/неудачные запросы и лимит перед повтором; не добавляйте безусловный цикл повторов.
В AWS View должен оставаться только реальный запрос шага 1. Обычные 150 секунд чтения — конечное значение для упражнения; реальное приложение выбирает тайм-ауты, повторы и обратную связь по бюджету задержки. Официальная справка Config объясняет отдельные пределы соединения, чтения и числа попыток.
Удалите тестовые результаты и сохраните приложение
На этом шаге вы удалите четыре локальных результата, сохранив рабочий клиент и приложение.
Функциональные и ошибочные пути нужно проверить до очистки. Удалите только названные результаты:
rm accepted.json too-long.json unavailable.json timed-out.json
Выведите оставшиеся файлы:
ls
Сохраните application.py, client.py, response_parser.py, документ и примеры. Converse не создал постоянную облачную нагрузку; удаление результатов не возвращает credits. Исходный код доступен для практики до завершения VM.
Заключение
Вы подключили реальный запрос Bedrock, ограничили вход и вывод, отключили автоматические повторы и задали конечное ожидание. Вы проверили сбой и тайм-аут без подмены успешного вывода, вернули безопасную диагностику и удалили только локальные результаты.



