{"id":24423185,"url":"https://github.com/webability-go/alexa","last_synced_at":"2025-04-12T07:20:23.714Z","repository":{"id":57514495,"uuid":"179540318","full_name":"webability-go/alexa","owner":"webability-go","description":"A GO Ready to use SDK and framework for Alexa devices","archived":false,"fork":false,"pushed_at":"2020-04-12T18:50:08.000Z","size":97,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-26T02:33:49.402Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/webability-go.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-04-04T16:59:26.000Z","updated_at":"2024-07-18T18:49:50.000Z","dependencies_parsed_at":"2022-09-06T03:01:44.537Z","dependency_job_id":null,"html_url":"https://github.com/webability-go/alexa","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webability-go%2Falexa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webability-go%2Falexa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webability-go%2Falexa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webability-go%2Falexa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webability-go","download_url":"https://codeload.github.com/webability-go/alexa/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248530737,"owners_count":21119624,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-20T10:17:07.168Z","updated_at":"2025-04-12T07:20:23.695Z","avatar_url":"https://github.com/webability-go.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"@UTF-8\n\n# Alexa Ready to use SDK and Framework for GO\n\nAlexa v0.4\n=============================\n\nThe library is a full SDK with a framework, ready to deploy a lambda function on Amazon AWS to build a skill.\nThe SDK support all type of Alexa Requests, Attributes and Responses.\nThe Framework is multilanguage, supports SSML, Cards, Templates and APLs\nThe Framework comes also with all default intents pre-programmed (they answer the name of the intent) for basic operation.\n\nFull manual is below.\n\nFirst start:\n\nEnter in your go environment and install the needed libraries:\n\n```\ngo get github.com/aws/aws-sdk-go\ngo get github.com/aws/aws-lambda-go\ngo get github.com/webability-go/alexa\n```\n\nCreates a directory named \"skill\" into your go environment:\n\n```\nmkdir ¬/go/src/skill\n```\n\ncreates a file called skill.go into your ¬/go/src/skill\n\n```\npackage main\n\nimport \"github.com/webability-go/alexa\"\n\nfunction main() {\n  alexa.Start()\n}\n```\n\nThen compile your file and zip it:\n\n```\ngo build skill.go\nzip -a skill.zip skill\n```\n\nThen import your zip file to your lambda function, with language GO 1.x\nName the Controler to the name of your executable (in this case, \"skill\")\n\n( I will pass the \"how to creates and compile an interaction model and link it with your lambda function\",\n  there are enough tutorials of that already )\n\nOnce it is all linked, launch your skill in your test environment, and the skill works, magically.\n\nIt will tell the intents you say, for example if you invoke your skill with \"my skill to test\":\n\n```\nUser: \"Alexa, open my skill to test\"\nAlexa: \"Alexa Skill Default Launch Handler.\"\nUser: \"Help\"\nAlexa: \"Alexa Skill Default Handler For HelpIntent\"\nUser: \"End skill\"\nAlexa: \"Alexa Skill Default Handler For CancelIntent. Goodbye\"\n```\n\nRefer to the full manual below to implement your intents, use the SDK, framework and much more.\n\n\nTO DO:\n======\nImportant:\n- Full APL support (it works but not all the posibilities i.e. missing transformers)\n- Get user account address and country still not totally working\n- Implement Dynamic Entities for Customized Interactions\n\nNot so important:\n- Finish the implementation of Amazon API for user data (still missing todo lists and shopping lists)\n- Verify beta intent request canfulfillintentrequest for english skills\n- Verify special requests (game requests, playback requests, gadgets requests)\n- Gadget controlers responses ( i.e. buttons )\n\n\n\n# Reference Manual:\n=======================\n\nDefine your own Handlers map:\n=======================\n\n```\npackage main\n\nimport (\n  ...\n\n  \"github.com/webability-go/alexa/request\"\n  \"github.com/webability-go/alexa/response\"\n)\n\n// Build the handlers map befor calling the start\n// The full supported handlers are in handlersmap.go library for reference\n\nfunc main()\n{\n  // Handlers types:\n  alexa.AddHandlersType(map[string]func(request.AlexaRequest) (*response.AlexaResponse, error) {\n    alexa.LaunchRequest:                 yourLaunchHandler,\n    alexa.SessionEndedRequest:           yourSessionEndedHandler,\n    alexa.Fallback:                      yourFallbackHandler,\n  })\n\n  // Handlers intents:\n  alexa.AddHandlersIntent(map[string]func(request.AlexaRequest) (*response.AlexaResponse, error) {\n    // native intents\n    alexa.CancelIntent:                  yourCancelIntentHandler,\n    alexa.StopIntent:                    yourCancelIntentHandler,\n    alexa.HelpIntent:                    yourHelpIntentHandler,\n    alexa.NextIntent:                    yourNextIntentHandler,\n    alexa.PreviousIntent:                yourPreviousIntentHandler,\n    alexa.RepeatIntent:                  yourRepeatIntentHandler,\n    alexa.StartOverIntent:               yourStartOverIntentHandler,\n    alexa.MoreIntent:                    yourMoreIntentHandler,\n    alexa.ElementSelectedHandler:        yourElementSelectedHandler,\n\n    // custom intents\n    \"yourOwnIntent\":                     yourOwnIntentHandler,\n    \"anotherCurtomIntent\":               yourAnotherCustomIntentHandler,\n    \"navigationIntent\":                  yourNavigationIntentHandler,\n\n    // fallback\n    alexa.Fallback:                      yourFallbackIntentHandler,\n\n  })\n\n  alexa.Start()\n}\n\n// ======================================================================\n// EXAMPLE: LAUNCH HANDLER\n// ======================================================================\nfunc yourLaunchHandler(req request.AlexaRequest) (*response.AlexaResponse, error) {\n\n  resp := response.NewResponse(false)   // false: launch does not close the skill\n\n  // support SSML (mandatory)\n  speech := response.NewSSMLBuilder()\n  speech.Say(\"Welcome to Demo Skill\")\n  resp.AddSpeech(speech);\n\n  // support CARD\n  card := response.NewCardBuilder( \"Welcome\", \"Welcome to Demo Skill\", \"https://yourcdn.com/icon-1024.png\", \"https://yourcdn.com/icon-192.png\" )\n  resp.AddCard(card);\n\n  // support TEMPLATE\n  template := response.NewTemplateBuilder(\"BodyTemplate3\").(*response.BodyTemplate3)\n  template.WithTitle(\"Example:\")\n  template.WithImage(\"https://yourcdn.com/icon-1024.png\");\n  template.WithPrimaryRichText(\"\u003cdiv align='center'\u003eHelp.\u003cbr/\u003eStart over.\u003cbr/\u003eClose the skill.\u003c/div\u003e\");\n  resp.AddTemplate(template);\n\n  // support APL\n  aplsources := response.NewAPLDataSources()\n  apldata := aplsources.NewAPLDataSource(\"welcomedata\", \"object\")\n  apldata.AddData(\"logo\", \"https://yourcdn.com/icon-192.png\")\n  apldata.AddData(\"image\", \"https://yourcdn.com/icon-1024.png\")\n  apldata.AddData(\"maintitle\", \"Welcome\")\n  apldata.AddData(\"titleshort\", \"Examples:\")\n  apldata.AddData(\"title\", \"Examples of what you can say:\")\n  apldata.AddData(\"subtitle\", \"Search something, Make an action like that:\")\n  apldata.AddData(\"primaryText\", \"Help.\u003cbr/\u003eStart over.\u003cbr/\u003eClose the skill.\u003cbr/\u003eSay something intelligent.\")\n\n  apl := response.NewAPLBuilder( \"Alexa.Presentation.APL.RenderDocument\", \"1.0\", \"./application/apl/yourapl.json\", aplsources )\n  resp.AddAPL(apl);\n\n  return resp, nil\n}\n\n// all the other defined handlers\n\n```\n\nAttributes:\n======================\n\n```\n  const REGION = \"us-east-1\"\n  const TABLENAME = \"my_dynamo_table\"\n\n  // Before start:\n  alexa.WithDynamoDbClient(\"latest\", REGION)\n  alexa.WithTableName(TABLENAME)\n  alexa.WithAutoCreateTable(true)\n  alexa.Start()\n```\n\nRequest data:\n======================\n\n```\n\n  reqtype        := Request.GetRequestType()            // string\n  intentname     := Request.GetRequestIntentName()      // string\n  sessionid      := Request.GetSessionId()              // string\n  isnewsession   := Request.GetNewSession()             // bool\n  userid         := Request.GetUserId()                 // string\n  attributes     := Request.GetAttributes()             // object\n  slots          := Request.GetSlots()                  // *map[string]Slot\n\n  display        := Request.GetDisplay()                // object\n  video          := Request.GetVideo()                  // object\n  apl            := Request.GetAPL()                    // object\n  hasdisplay     := Request.HasDisplay()                // bool\n  hasvideo       := Request.HasVideo()                  // bool\n  hasapl         := Request.HasAPL()                    // bool\n\n  newSession     := Request.GetNewSession()             // bool\n  locale         := Request.GetLocale()                 // string es_MX\n\n```\n\n\nUse attributes:\n======================\n\n```\n  att := \u0026MySkillAttributes{}    // if hijacked , (see example below)\n\n  // load persistent attributes with dynamoDB\n  err := alexa.LoadPersistentAttributes(req, att)\n  if err != nil {\n    fmt.Println(err)\n  }\n\n  // no persistent attributes ? load the request attributes\n  att := Request.GetAttributes()\n\n  ...\n\n  // play with attributes\n  att[\"Something\"] = \"Some data\"\n  // Create att.AddData, GetData AddString, GetString, GetBool, GetInt etc (or use xcore.DataSet)\n\n  // Add the attributes to the response\n  resp.AddAttributes(att)     // rename to SetAttributes ?   ADD should Ads something to a set of attributes.\n\n  // set persistent attributes with dynamoDB\n  err := alexa.SavePersistentAttributes(req, att)\n  if err != nil {\n    fmt.Println(err)\n  }\n\n```\n\nHijack default attribute with your own attribute structure\n======================\n\n```\nfunc main() {\n\n  alexa.SetSessionUnmarshalerHandler(AttributesHijack)   // Custom attributes\n  err := alexa.Start()\n  if err != nil {\n    fmt.Println(err)\n  }\n}\n\ntype MySkillAttributes struct {\n  Version             int            // attributes version\n  Sessions            int            // Quantity of launched sessions\n  First               time.Time      // First use of the skill\n  Last                time.Time      // Last use of the skill\n}\n\nfunc AttributesHijack(data []byte, session *request.Session) error {\n\n  type Alias request.Session\n  aux := \u0026struct {\n    Attributes *MySkillAttributes `json:\"attributes\"`\n    *Alias\n  }{\n    Alias: (*Alias)(session),\n  }\n  if err := json.Unmarshal(data, \u0026aux); err != nil {\n    return err\n  }\n  session.Attributes = aux.Attributes\n  return nil\n}\n\n\nfunc yourIntentHandler(req request.AlexaRequest) (*response.AlexaResponse, error) {\n\n  MyAttributes := req.GetAttributes().(*MySkillAttributes)    // is now a MySkillAttributes, not a default map[string]interface{}\n  (*MyAttributes).Sessions ++\n\n  resp := response.NewResponse(false)   // false: launch does not close the skill\n\n  // support SSML (mandatory)\n  speech := response.NewSSMLBuilder()\n  speech.Say(\"Hello \" + givenname)\n  resp.AddSpeech(speech);\n\n  resp.AddAttributes(MyAttributes)\n\n  return rest, nil\n}\n\n\n```\n\n\nLocale:\n======================\n\n```\n\nfunc yourIntentHandler(req request.AlexaRequest) (*response.AlexaResponse, error) {\n\n  loc := req.GetLocale()\n\n  // You can implement locale dependant translation table for your skill texts\n\n  resp := response.NewResponse(false)   // false: launch does not close the skill\n\n  // support SSML (mandatory)\n  speech := response.NewSSMLBuilder()\n  speech.Say(\"Your locale is \" + loc)\n  resp.AddSpeech(speech);\n\n  return rest, nil\n}\n\n```\n\nBuild a Speech / SSML\n======================\n\nEvery function you call on a builder will ADDs the message to the output\n\n```\n\n  resp := response.NewResponse(false)   // false: launch does not close the skill\n\n  // SSML build\n  speech := response.NewSSMLBuilder()\n  // adds a raw text (syntax is supposed to be \"good\")\n  speech.Raw(\"\u003cs\u003eWelcome to Demo Skill\u003c/s\u003e \u003csay-as interpret-as=\"cardinal\"\u003e12345\u003c/say-as\u003e. \u003csay-as interpret-as='spell-out'\u003ehello\u003c/say-as\u003e.\")\n\n  // Simple text\n  speech.Say(\"Welcome to Demo Skill\")\n\n  // With a break\n  speech.Break(\"0.5s\")\n\n  // sentence\n  speech.Say(\"This is a sentence\")\n  speech.SetSentence()   // apply on previous \"Say\"\n\n  // paragraph\n  speech.Say(\"This is a paragraph\")\n  speech.SetParagraph()   // apply on previous \"Say\"\n\n\n  speech.Say(\"This is a text with lots of effects\")\n  speech.AddEffect(\"whispered\")    // apply on previous \"Say\"     values in Alexa developpers SSML Manuals\n  speech.AddEmphasis(\"moderate\")   // apply on previous \"Say\"     values in Alexa developpers SSML Manuals\n  speech.AddLang(\"fr-FR\")          // apply on previous \"Say\"     values in Alexa developpers SSML Manuals\n  speech.AddVoice(\"Kendra\")        // apply on previous \"Say\"     values in Alexa developpers SSML Manuals\n\n  speech.Say(\"12345\")\n  speech.AddSayAs(\"spell-out\")\n\n  // Finally adds an audio sound\n  speech.Audio(\"soundbank://soundlibrary/animals/amzn_sfx_bear_groan_roar_01\")\n\n  resp.AddSpeech(speech);\n\n```\n\n\nBuild a Card\n======================\n\n```\n  resp := response.NewResponse(false)   // false: launch does not close the skill\n\n  // support CARD\n  card := response.NewCardBuilder( \"Welcome\", \"Welcome to Demo Skill\", \"https://yourcdn.com/icon-1024.png\", \"https://yourcdn.com/icon-192.png\" )\n\n  resp.AddCard(card);\n\n```\n\nBuild a Permission Card\n======================\n\n```\n  resp := response.NewResponse(false)   // false: launch does not close the skill\n\n  // permission CARD\n  card := response.NewPermissionCardBuilder([]string{response.PERMISSION_EMAIL, response.PERMISSION_FIRSTNAME,})\n\n  resp.AddCard(card);\n\n```\n\nPossible permissions:\n\n```\nconst (\n  PERMISSION_FULLNAME = \"alexa::profile:name:read\"\n  PERMISSION_FIRSTNAME = \"alexa::profile:given_name:read\"\n  PERMISSION_EMAIL = \"alexa::profile:email:read\"\n  PERMISSION_MOBILE = \"alexa::profile:mobile_number:read\"\n  PERMISSION_COUNTRY_AND_POSTAL_CODE = \"read::alexa:device:all:address:country_and_postal_code\"\n  PERMISSION_ADDRESS = \"read::alexa:device:all:address\"\n)\n```\n\n\n\n\nBuild a Template\n======================\n\n```\n  resp := response.NewResponse(false)   // false: launch does not close the skill\n\n  // support TEMPLATE\n  template := response.NewTemplateBuilder(\"BodyTemplate3\").(*response.BodyTemplate3)\n  template.WithTitle(\"Example:\")\n  template.WithImage(\"https://yourcdn.com/icon-1024.png\");\n  template.WithPrimaryRichText(\"\u003cdiv align='center'\u003eHelp.\u003cbr/\u003eStart over.\u003cbr/\u003eClose the skill.\u003c/div\u003e\");\n\n  resp.AddTemplate(template);\n\n```\n\nBuild a Template with a list\n======================\n\n```\n  resp := response.NewResponse(false)   // false: launch does not close the skill\n\n  // support TEMPLATE\n  template := response.NewTemplateBuilder(\"ListTemplate1\").(*response.ListTemplate1)\n  template.WithTitle(\"Select Something:\")\n  template.WithPrimaryRichText(\"\u003cdiv align='center'\u003eHelp.\u003cbr/\u003eStart over.\u003cbr/\u003eClose the skill.\u003c/div\u003e\")\n  template.AddListItem(\"Element 1\", \"https://yourcdn.com/icon1-1024.png\", \"The name of your item 1\")\n  template.AddListItem(\"Element 2\", \"https://yourcdn.com/icon2-1024.png\", \"The name of your item 2\")\n  template.AddListItem(\"Element 3\", \"https://yourcdn.com/icon3-1024.png\", \"The name of your item 3\")\n  template.AddListItem(\"Element 4\", \"https://yourcdn.com/icon4-1024.png\", \"The name of your item 4\")\n  template.AddListItem(\"Element 5\", \"https://yourcdn.com/icon5-1024.png\", \"The name of your item 5\")\n\n  resp.AddTemplate(template);\n\n```\n\n\nBuild an APL\n======================\n\n```\n  resp := response.NewResponse(false)   // false: launch does not close the skill\n\n  // support APL\n  aplsources := response.NewAPLDataSources()\n  apldata := aplsources.NewAPLDataSource(\"welcomedata\", \"object\")\n  apldata.AddData(\"logo\", \"https://yourcdn.com/icon-192.png\")\n  apldata.AddData(\"image\", \"https://yourcdn.com/icon-1024.png\")\n  apldata.AddData(\"maintitle\", \"Welcome\")\n  apldata.AddData(\"titleshort\", \"Examples:\")\n  apldata.AddData(\"title\", \"Examples of what you can say:\")\n  apldata.AddData(\"subtitle\", \"Search something, Make an action like that:\")\n  apldata.AddData(\"primaryText\", \"Help.\u003cbr/\u003eStart over.\u003cbr/\u003eClose the skill.\u003cbr/\u003eSay something intelligent.\")\n\n  apl := response.NewAPLBuilder( \"Alexa.Presentation.APL.RenderDocument\", \"1.0\", \"./application/apl/yourapl.json\", aplsources )\n  resp.AddAPL(apl);\n\n```\n\n\nLaunch a video\n======================\n\n```\n\n  var resp *response.AlexaResponse\n\n  video := \u0026response.DirectiveVideoAppLaunch{}\n  video.Type = \"VideoApp.Launch\"\n  video.VideoItem.Source = \"Your_Video_Source_MP4_or_M3U\"\n  video.VideoItem.Metadata = \u0026response.VideoMetadata{ Title: \"Title of the video\", Subtitle: \"Description of the video\" }\n  resp.AddVideo(video);\n\n```\n\n\nConsume Alexa/Amazon APIs\n======================\n\nEvery API data is supposed to be authorized by the user of the skill\n\nThe timezone, distante and temperatureunit does not need authorization.\n\n```\n\nfunc yourIntentHandler(req request.AlexaRequest) (*response.AlexaResponse, error) {\n\n  fullname, _ := alexa.GetAccountFullName(req)\n  givenname, _ := alexa.GetAccountGivenName(req)\n  email, _ := alexa.GetAccountEmail(req)\n  number, _ := alexa.GetAccountMobileNumber(req)\n  country_and_postalcode, _ := alexa.GetDeviceCountry(req)\n  address, _ := alexa.GetDeviceAddress(req)\n  timezone, _ := alexa.GetDeviceTimeZone(req)\n  distunit, _ := alexa.GetDeviceDistanceUnit(req)\n  tempunit, _ := alexa.GetDeviceTemperatureUnit(req)\n\n  resp := response.NewResponse(false)   // false: launch does not close the skill\n\n  // support SSML (mandatory)\n  speech := response.NewSSMLBuilder()\n  speech.Say(\"Hello \" + givenname)\n  resp.AddSpeech(speech);\n\n  return rest, nil\n}\n\n```\n\n\n\nVersion Changes Control\n=======================\n\nv0.4.0 - 2020-02-25\n-----------------------\n- Licence added\n- Few changes for publication\n- Few bugs corrected\n\nv0.3.3 - 2019-06-19\n-----------------------\n- Response.ssml enhanced to support some effects and raw text\n\nv0.3.2 - 2019-05-10\n-----------------------\n- Upgrade documentation with all previous changes\n\n\nv0.3.1 - 2019-05-08\n-----------------------\n- Alexa API Settings working (timezone, distance and temperature units)\n- Alexa API Address implemented (not fully working yet)\n- Response Permission cards added for address and country/postal code\n\n\nv0.3.0 - 2019-05-06\n-----------------------\n- Alexa API working (get user account email, name, full name, mobile number implemented)\n- Permission cards implemented\n- Some minor bugs corrected\n\n\nv0.2.0 - 2019-04-29\n-----------------------\n- Added Fallback Handlers\n- Added error propagation on all the handlers to be more compliant with error management. If you catch the error and manage it, then you should return \"nil\" as error parameter.\n- The error is captured and modified into the default main handler, and transformed to a voice error message. This can be deactivated with the SetErrorCapture(false) function\n\n\nv0.1.0 - 2019-04-22\n-----------------------\n- DynamoDB implemented to manage attributes persistance: create table, LoadPersistentAttributes, SavePersistentAttributes\n- Amazon API implemented (name, fullname, email, mobile number, address, country, timezone, distanceunit, temperatureunit)\n\n\nv0.0.9 - 2019-04-19\n-----------------------\n- Removed ./attributes and code. Attributes is just an interface{} by default and can be used to store anything.\n- The hijack function works now correctly to build an app own attributes structure\n\n\nv0.0.8 - 2019-04-16\n-----------------------\n- ShouldEndSession parameter is now a *bool since it must be omited when the directive is a video launch. Code adjusted\n\n\nv0.0.7 - 2019-04-15\n-----------------------\n- Video Directive implemented in response\n- Bug corrected on ResolutionsPerAuthority object in the request (missing an \"s\")\n\n\nv0.0.6 - 2019-04-12\n-----------------------\n- Some bugs corrected on NewTextResponse on the text analyse to decode to correct type.\n\n\nv0.0.5 - 2019-04-11\n-----------------------\n- NewTextResponse implemented. NewSSMLResponse removed. Please use NewTextResponse, the text can be a string or an SSMLBuilder, the system reacts intelligently to it and build the correct text string.\n\n\nv0.0.4 - 2019-04-10\n-----------------------\n- Default CancelIntent and StopIntent now ends the skill (changed in default intents map)\n- APL builder enhanced, to build better the datasources, functions added: NewDataSet, NewDataList, NewDataListItem\n- APL builder: \"properties\" subset removed. If a properties subset si needed, please use NewDataSet(\"properties\")\n- Attributes handler can be hijacked to unmarshal attributes into a custom structure instead of a map[string]interface{} structure\n- Request Attributes and Response Attributes are now an interface to be able to be overloaded with a custom attributes structure\n\n\nv0.0.3 - 2019-04-09\n-----------------------\n- Added HasVideo, HasDisplay and HasAPL in request implementation\n- Request, Intent and Slots ordered and cleaned\n- Added Request.GetSlots function\n- Added attributes basic access functions (Set, Get, GetInt, GetBool, GetString, GetFloat)\n\n\nv0.0.2 - 2019-04-08\n-----------------------\n- Full implementation of BodyTemplate1, BodyTemplate2, BodyTemplate3 (WithToken, WithTitle, WithBackButton, WithImage, WithBackgroundImage, WithPrimaryText)\n- Functions added to control DisplayImage and TextContent objects (WithSize, WithPrimaryText, WithSecondaryText, WithTertiaryText, AddSource)\n- Full implementation of ListTemplate1, ListTemplate2 and ListItem (WithToken, WithTitle, WithBackButton, WithImage, WithBackgroundImage, AddListItem)\n\n\nV0.0.1 - 2019-04-04\n-----------------------\n- Framework working, SDK working\n- AlexaRequest interpreter, Attributes interpreter and basic functions, AlexaResponse builder\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebability-go%2Falexa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebability-go%2Falexa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebability-go%2Falexa/lists"}