gpt4 book ai didi

python - 在 Python 中为 Alexa 技能添加 session 属性

转载 作者:行者123 更新时间:2023-11-28 22:29:26 24 4
gpt4 key购买 nike

我的 Alexa 技能 intent 模式中有 3 个槽(accountdollar_valuerecipient_first),我想保存任何槽由演讲者在 session 属性中提供。

我正在使用以下方法设置 session 属性:

def create_dollar_value_attribute(dollar_value):
return {"dollar_value": dollar_value}

def create_account_attribute(account):
return {"account": account}

def create_recipient_first_attribute(recipient_first):
return {"recipient_first": recipient_first}

但是,正如您可能猜到的那样,如果我想在 sessionAttributes 中保存多个槽作为数据,sessionAttributes 将被覆盖,如下例所示:

session_attributes = {}
if session.get('attributes', {}) and "recipient_first" not in session.get('attributes', {}):
recipient_first = intent['slots']['recipient_first']['value']
session_attributes = create_recipient_first_attribute(recipient_first)


if session.get('attributes', {}) and "dollar_value" not in session.get('attributes', {}):
dollar_value = intent['slots']['dollar_value']['value']
session_attributes = create_dollar_value_attribute(dollar_value)

我的 lambda 函数对其中提供了两个插槽(dollar_valuerecipient_first)的语音输入的 JSON 响应如下(我的猜测是 第二个 if 语句中的 create_dollar_value_attribute 方法覆盖了第一个):

{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "Some text output"
},
"card": {
"content": "SessionSpeechlet - Some text output",
"title": "SessionSpeechlet - Send Money",
"type": "Simple"
},
"reprompt": {
"outputSpeech": {
"type": "PlainText"
}
},
"shouldEndSession": false
},
"sessionAttributes": {
"dollar_value": "30"
}
}

sessionAttributes 的正确响应应该是:

"sessionAttributes": {
"dollar_value": "30",
"recipient_first": "Some Name"
},

如何创建此响应?有没有更好的方法来向 JSON 响应中的 sessionAttributes 添加值?

最佳答案

在我看来,使用 Python 添加 sessionAttributes 的最简单方法似乎是使用字典。例如,如果你想在 session 属性中存储一些 future 的插槽:

session['attributes']['slotKey'] = intent['slots']['slotKey']['value']

接下来,您可以将其传递给构建响应方法:

buildResponse(session['attributes'], buildSpeechletResponse(title, output, reprompt, should_end_session))

本例中的实现:

def buildSpeechletResponse(title, output, reprompt_text, should_end_session):
return {
'outputSpeech': {
'type': 'PlainText',
'text': output
},
'card': {
'type': 'Simple',
'title': "SessionSpeechlet - " + title,
'content': "SessionSpeechlet - " + output
},
'reprompt': {
'outputSpeech': {
'type': 'PlainText',
'text': reprompt_text
}
},
'shouldEndSession': should_end_session
}


def buildResponse(session_attributes, speechlet_response):
return {
'version': '1.0',
'sessionAttributes': session_attributes,
'response': speechlet_response
}

这会以推荐的方式在 Lambda 响应 JSON 中创建 sessionAttributes。

此外,仅添加一个新的 sessionAttribute 不会覆盖最后一个不存在的属性。它只会创建一个新的键值对。

请注意,这可能在服务模拟器中运行良好,但在实际 Amazon Echo 上测试时可能会返回关键属性错误。根据这个post ,

在 Service Simulator 上, session 以 Session:{ ... Attributes:{}, ... } 开头当 session 在 Echo 上启动时, session 根本没有属性键。

我解决这个问题的方法是在创建新 session 时在 lambda 处理程序中手动创建它:

 if event['session']['new']:
event['session']['attributes'] = {}
onSessionStarted( {'requestId': event['request']['requestId'] }, event['session'])
if event['request']['type'] == 'IntentRequest':
return onIntent(event['request'], event['session'])

关于python - 在 Python 中为 Alexa 技能添加 session 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42992487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com