عزز Alexa الخاص بك عن طريق جعله يستجيب كـ ChatGPT.
يحتوي هذا المستودع على برنامج تعليمي حول كيفية إنشاء مهارة Alexa بسيطة تستخدم واجهة برمجة تطبيقات OpenAI لإنشاء استجابات من نموذج ChatGPT.
قم بتسجيل الدخول إلى حساب Amazon Developer الخاص بك وانتقل إلى Alexa Developer Console.
انقر فوق "إنشاء مهارة" وقم بتسمية المهارة "الدردشة". اختر اللغة الأساسية وفقًا للغتك.
اختر "أخرى" و"مخصص" للنموذج.
اختر "Alexa-hosted (Python)" لموارد الواجهة الخلفية.
لديك الآن خياران:
أو إذا كنت تريد إنشاء المهارة يدويًا
في قسم "الإنشاء"، انتقل إلى علامة التبويب "JSON Editor".
إذا قمت باستيراد المهارة مباشرة من هذا المستودع، فما عليك سوى تغيير "اسم الاستدعاء" إلى "دردشة" أو كلمة مفضلة أخرى للتنشيط وانتقل إلى الخطوة 12.
ومع ذلك، إذا اخترت إنشاء المهارة يدويًا، فاستبدل محتوى JSON الحالي بمحتوى JSON المقدم:
{
"interactionModel" : {
"languageModel" : {
"invocationName" : " chat " ,
"intents" : [
{
"name" : " GptQueryIntent " ,
"slots" : [
{
"name" : " query " ,
"type" : " AMAZON.Person "
}
],
"samples" : [
" {query} "
]
},
{
"name" : " AMAZON.CancelIntent " ,
"samples" : []
},
{
"name" : " AMAZON.HelpIntent " ,
"samples" : []
},
{
"name" : " AMAZON.StopIntent " ,
"samples" : []
},
{
"name" : " AMAZON.NavigateHomeIntent " ,
"samples" : []
}
],
"types" : []
}
}
}
احفظ النموذج وانقر على "إنشاء نموذج".
انتقل إلى قسم "الرمز" وأضف "openai" إلى ملف require.txt. يجب أن يبدو ملف require.txt الخاص بك كما يلي:
ask-sdk-core==1.11.0
boto3==1.9.216
requests>=2.20.0
قم بإنشاء مفتاح OpenAI API في صفحة مفاتيح API بالنقر فوق "+ إنشاء مفتاح سري جديد".
استبدل ملف lambda_functions.py بالملف lambda_function.py المتوفر.
from ask_sdk_core . dispatch_components import AbstractExceptionHandler
from ask_sdk_core . dispatch_components import AbstractRequestHandler
from ask_sdk_core . skill_builder import SkillBuilder
from ask_sdk_core . handler_input import HandlerInput
from ask_sdk_model import Response
import ask_sdk_core . utils as ask_utils
import requests
import logging
import json
# Set your OpenAI API key
api_key = "YOUR_API_KEY"
logger = logging . getLogger ( __name__ )
logger . setLevel ( logging . INFO )
class LaunchRequestHandler ( AbstractRequestHandler ):
"""Handler for Skill Launch."""
def can_handle ( self , handler_input ):
# type: (HandlerInput) -> bool
return ask_utils . is_request_type ( "LaunchRequest" )( handler_input )
def handle ( self , handler_input ):
# type: (HandlerInput) -> Response
speak_output = "Chat G.P.T. mode activated"
session_attr = handler_input . attributes_manager . session_attributes
session_attr [ "chat_history" ] = []
return (
handler_input . response_builder
. speak ( speak_output )
. ask ( speak_output )
. response
)
class GptQueryIntentHandler ( AbstractRequestHandler ):
"""Handler for Gpt Query Intent."""
def can_handle ( self , handler_input ):
# type: (HandlerInput) -> bool
return ask_utils . is_intent_name ( "GptQueryIntent" )( handler_input )
def handle ( self , handler_input ):
# type: (HandlerInput) -> Response
query = handler_input . request_envelope . request . intent . slots [ "query" ]. value
session_attr = handler_input . attributes_manager . session_attributes
if "chat_history" not in session_attr :
session_attr [ "chat_history" ] = []
response = generate_gpt_response ( session_attr [ "chat_history" ], query )
session_attr [ "chat_history" ]. append (( query , response ))
return (
handler_input . response_builder
. speak ( response )
. ask ( "Any other questions?" )
. response
)
class CatchAllExceptionHandler ( AbstractExceptionHandler ):
"""Generic error handling to capture any syntax or routing errors."""
def can_handle ( self , handler_input , exception ):
# type: (HandlerInput, Exception) -> bool
return True
def handle ( self , handler_input , exception ):
# type: (HandlerInput, Exception) -> Response
logger . error ( exception , exc_info = True )
speak_output = "Sorry, I had trouble doing what you asked. Please try again."
return (
handler_input . response_builder
. speak ( speak_output )
. ask ( speak_output )
. response
)
class CancelOrStopIntentHandler ( AbstractRequestHandler ):
"""Single handler for Cancel and Stop Intent."""
def can_handle ( self , handler_input ):
# type: (HandlerInput) -> bool
return ( ask_utils . is_intent_name ( "AMAZON.CancelIntent" )( handler_input ) or
ask_utils . is_intent_name ( "AMAZON.StopIntent" )( handler_input ))
def handle ( self , handler_input ):
# type: (HandlerInput) -> Response
speak_output = "Leaving Chat G.P.T. mode"
return (
handler_input . response_builder
. speak ( speak_output )
. response
)
def generate_gpt_response ( chat_history , new_question ):
"""Generates a GPT response to a new question"""
headers = {
"Authorization" : f"Bearer { api_key } " ,
"Content-Type" : "application/json"
}
url = "https://api.openai.com/v1/chat/completions"
messages = [{ "role" : "system" , "content" : "You are a helpful assistant. Answer in 50 words or less." }]
for question , answer in chat_history [ - 10 :]:
messages . append ({ "role" : "user" , "content" : question })
messages . append ({ "role" : "assistant" , "content" : answer })
messages . append ({ "role" : "user" , "content" : new_question })
data = {
"model" : "gpt-4o-mini" ,
"messages" : messages ,
"max_tokens" : 300 ,
"temperature" : 0.5
}
try :
response = requests . post ( url , headers = headers , data = json . dumps ( data ))
response_data = response . json ()
if response . ok :
return response_data [ 'choices' ][ 0 ][ 'message' ][ 'content' ]
else :
return f"Error { response . status_code } : { response_data [ 'error' ][ 'message' ] } "
except Exception as e :
return f"Error generating response: { str ( e ) } "
sb = SkillBuilder ()
sb . add_request_handler ( LaunchRequestHandler ())
sb . add_request_handler ( GptQueryIntentHandler ())
sb . add_request_handler ( CancelOrStopIntentHandler ())
sb . add_exception_handler ( CatchAllExceptionHandler ())
lambda_handler = sb . lambda_handler ()
ضع مفتاح OpenAI API الذي حصلت عليه من حساب OpenAI الخاص بك
حفظ ونشر. انتقل إلى قسم "الاختبار" وقم بتمكين "اختبار المهارات" في "التطوير".
أنت الآن جاهز لاستخدام Alexa في وضع ChatGPT. يجب أن ترى نتائج مثل هذا:
يرجى ملاحظة أن تشغيل هذه المهارة سيتحمل تكاليف استخدام كل من AWS Lambda وOpenAI API. تأكد من فهم هيكل التسعير ومراقبة استخدامك لتجنب الرسوم غير المتوقعة.