Ошибка при вызове конечной точки AWS SageMaker с использованием boto3: «Не удается проанализировать данные в формате JSON. Убедитесь, что для заголовка Content-Type установлено значение «application / json»

#amazon-web-services #boto3 #amazon-sagemaker

#amazon-web-services #boto3 #amazon-sagemaker

Вопрос:

Я пытаюсь вызвать конечную точку AWS SageMaker с помощью следующего простого кода с использованием boto3

 import boto3

session = boto3.Session(profile_name='mlacc',
                        region_name='us-west-2')

sagemaker_client = session.client('sagemaker-runtime')

request_body = "{n    "requestSource": "unittest",n    "clusters": [{n        "clusterMetadata": {n "
""clusterId": "id1",n            "topic": ["corona virus", "Donald Trump"],n            "
""clusterSize": 2n        },n        "documents": [{n            "uid": "1",n            "
""content": "content2",n            "domain": "CNN.com",n            "title": "This is a "
"title",n            "similarityScore": 1.3,n            "published_at": 1566264017,n            "
""domain_rank": 1,n            "trust_domain_score": 1n        }, {n            "uid": "2","
"n            "content": "content2",n            "domain": "CNN.com",n            "title": "
""This is a title",n            "similarityScore": 1.3,n            "published_at": 1566264017,"
"n            "domain_rank": 1,n            "trust_domain_score": 1n        }, {n            "uid": "
""2",n            "content": "content3",n            "domain": "CNN.com",n            "title": "
""This is a title",n            "similarityScore": 1.3,n            "published_at": 1566264017,"
"n            "domain_rank": 1,n            "trust_domain_score": 1n        }]n    }]n}"


response = sagemaker_client.invoke_endpoint(
    EndpointName='myEndpoint22',
    Body=request_body,
    ContentType='application/json',
)

response_json = response['Body'].read().decode('utf-8')

print(response_json)
  

Я получаю следующую ошибку при запуске этого кода

 Traceback (most recent call last):
  File "/Users/rppatwa/Desktop/WorkDocs/CodePlayground/SimplePythonProject/src/PrototypeTesting/SummarizationLocal.py", line 205, in <module>
    main()
  File "/Users/rppatwa/Desktop/WorkDocs/CodePlayground/SimplePythonProject/src/PrototypeTesting/SummarizationLocal.py", line 186, in main
    ContentType='application/json',
  File "/Users/rppatwa/anaconda3/lib/python3.7/site-packages/botocore/client.py", line 316, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/Users/rppatwa/anaconda3/lib/python3.7/site-packages/botocore/client.py", line 635, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.ModelError: An error occurred (ModelError) when calling the InvokeEndpoint operation: Received client error (400) from model with message "Unable to parse data as JSON. Make sure the Content-Type header is set to "application/json"". See https://us-west-2.console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEventViewer:group=/aws/sagemaker/Endpoints/KeyurshaASMLModel in account 753843489946 for more information.
  

Если я встрою тело (не используя request_json), этот вызов завершится успешно. Пожалуйста, дайте мне знать, чего мне не хватает.

Спасибо

Комментарии:

1. удалите конечную запятую после типа содержимого и попробуйте импортировать json json.dumps (request_body), чтобы убедиться, что json действителен, и выполните test=json.dumps(request_body).encode () затем передайте test в тело как Body=test

2. Это сработало для меня. Большое спасибо за ваш ответ, Прабхакар!

3. Спасибо, Рахул. Я написал ответ. Пожалуйста, отметьте этот случай как ответ, если это помогло.

Ответ №1:

Вам нужно удалить конечную запятую после ContentType='application/json', и попробовать приведенный ниже фрагмент для передачи JSON в поле body.

 import json 
json.dumps(request_body) 
test=json.dumps(request_body).encode()
  

Это также подтвердит передаваемый вами JSON.Теперь передайте тест телу для вызова конечной точки.