Agent skill

documents

Stars 163
Forks 31

Install this agent skill to your Project

npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/devops/documents

SKILL.md

自定义技能

文档更新于2018/12/29,点击查看更新日志

自定义技能一般用于通过设计对话的场景和交互流程,并最终通过来满足用户特定的需求,比如:天气技能用于满足用户天气查询的需求,当用户说“叮当叮当,深圳今天天气怎样”,天气技能根据解析出来的参数查询深圳当天的天气,并组织成文本回复语交给腾讯云叮当,腾讯云叮当利用语音合成技术(TTS,Text-To-Speech)将回复语播报给用户。交互流程大致如下图: 详细流程描述为:

  1. 用户对腾讯叮当终端说“叮当叮当,深圳今天天气怎样”;
  2. 腾讯叮当语音识别服务将用户音频转化为文本“深圳今天天气怎样”;
  3. 腾讯叮当语义理解服务判断“深圳今天天气怎样”为“天气”技能的“天气查询”意图,并解析出槽位city=深圳; date=今天;
  4. “天气”技能根据意图、槽位确定要执行查询深圳当天天气的任务,并将结果组织成自然语言返回给腾讯叮当;
  5. 腾讯叮当语音合成服务将技能给出的播报文本合成语音播报给用户:“深圳今天阴转小雨,出门记得带伞”。

创建自定义技能大体分两部分工作,一部分是意图设计,另一部分是服务开发,以下内容主要介绍服务开发部分技能服务需要支持的协议。

请求数据格式

用户发起请求后,叮当会将该请求按照约定的协议以HTTP请求的方式转发给技能服务。对于腾讯云SCF部署的技能的,由于技能只能接收到context数据,因此数据会按照如下格式将原有的HTTP数据封装到context

json
{
	"header": {
		"Authorization": "TSK-HMAC-SHA256-BASIC Datetime=20180101T203559Z, Signature=d8612ab1ff0301e1016d817c02350a2b76ea62e0"
	},
	"body": "{\"version\": \"1.0\",\"session\": {\".......}"
}

HTTP Header

http
POST / HTTP/1.1
Content-Type : application/json;charset=UTF-8
Host : your.application.endpoint
Accept : application/json
Accept-Charset : utf-8
Authorization: TSK-HMAC-SHA256-BASIC Datetime=20180101T203559Z, Signature=d8612ab1ff0301e1016d817c02350a2b76ea62e0

HTTP Body

请求数据将以JSON格式发送到技能所在的服务地址上,以下是一个正常的叮当请求的例子:

json
{
  "version": "1.0",
  "session": {
    "new": true,
    "sessionId": "sssss.....id"
  },
  "context": {
    "System": {
      "device": {
        "deviceId": "string",
        "supportedInterfaces": {
          "AudioPlayer": {
            "Play": true,
            "Stop": false,
            "ClearQueue": false
          }
        }
      },
      "application": {
        "applicationId": "sssssskill.......id"
      },
      "user": {
        "userId": "uuuuuuuu....id",
        "accessToken": "account....token"
      }
    }
  },
  "request": {
    "type": "IntentRequest",
    "requestId": "rrrrrr.....id",
    "timestamp": "20170720T193559Z",
    "dialogState": "string",
    "queryText": "string",
    "intent": {
      "name": "string",
      "confirmationStatus": "string",
      "slots": {
        "{{SlotName}}": {
          "name": "{{SlotName}}",
          "confirmationStatus": "string",
          "values": [{
            "value": {
              "type": "text",
              "value": "string",
              "origin": "string"
            }
          }]
        }
      }
    }
  }
}

{{SlotName}}是技能在开放平台定义的槽位名,request.intent.slots可能有多个槽位,比如Query“明天上海的天气怎样”,可以提取到“明天”、“上海”两个槽位。

请求参数说明

参数 描述 类型
version 协议的版本标识,当前版本为1.0 string
session 当前会话的相关信息,该数据只在请求类型为LaunchRequestIntentRequestSessionEndedRequest时才传到技能服务中,详细说明见Session Object object
context 包含了当前腾讯叮当服务和设备的状态信息,该信息会包含在所有对技能的请求中。详细说明见Context Object object
request 用户的详细请求内容,包含了几种不同类型的请求:+ 标准请求 - LaunchRequest:用户未明确意图的首次请求,如“打开贝瓦儿歌”; - IntentRequest:用户指定意图的请求; - SessionEndedRequest:技能由于其他原因被动关闭时,这种类型的请求会被发送到你的服务上;详细说明见Request Object object

Session Object 参数说明

参数 描述 类型
new 是否新会话 boolean
sessionId 用于唯一标识一次会话,在同一个会话的多个请求其ID保持不变 string

Context Object 参数说明

参数 描述 类型
System 腾讯叮当当前的服务和设备信息,详细说明见System object
AudioPlayer 当前设备的音频播放器状态,详细说明见AudioPlayer object

System Object 参数说明

参数 描述 类型
application 当前技能的信息,用于验证该请求正确指向你的服务,其中:+ applicationId:技能ID,你可以在腾讯叮当技能平台上找到该ID object
device 当前与技能交互的设备信息:+ deviceId:转换的设备ID,唯一标识一台设备;+ supportedInterfaces:当前设备支持的接口类型, AudioPlayer {}表示该设备支持 AudioPlayer接口 object
user 当前与技能交互的用户信息:+ userId:转换的用户ID,唯一标识一个叮当用户,用户重新关注技能后可能产生新的用户ID;+ accessToken:用户在第三方系统的账号标识,仅在账号连接成功后才会提供,查阅账号连接了解更多相关信息。 object

Request Object 参数说明

当用户以文字或语音的形式与你的技能进行交互时,腾讯叮当会给技能服务发送一个标准类型的请求(如:LaunchRequestIntentRequestSessionEndedRequest)。

LaunchRequest 参数说明

LaunchRequest在用户初次进入技能并且没有明确意图的时候发送给技能,比如:

用户:叮当叮当,打开QQ音乐
叮当发送LaunchRequest到技能
技能可以给出欢迎语,并播放热门歌曲
叮当:欢迎使用QQ音乐,最动听的音乐送给我最喜欢的你。
技能也可以给出欢迎语,并询问用户想听什么歌
叮当:欢迎使用QQ音乐,请问你想听什么歌?

参数 描述 类型
type 固定为LaunchRequest string
requestId 当前请求的ID,用于唯一标识一次请求 string
timestamp 用户请求时间戳,ISO 8601格式的UTC+0时间 string
queryText 用户的说话内容 string

IntentRequest 参数说明

当用户有明确的意图时,腾讯叮当将发送IntentRequest到技能,并指明当前意图和提取出的槽位。

参数 描述 类型
type 固定为IntentRequest string
requestId 当前请求的ID,用于唯一标识一次请求 string
timestamp 用户请求时间戳,ISO 8601格式的UTC+0时间 string
dialogState 用于表示多轮对话状态的枚举值,包括: STARTED:会话开始; IN_PROGRESS:会话进行中; COMPLETED:会话结束; string
queryText 用户的说话内容 string
intent 用户的意图信息,包含意图名称及提取的参数信息,详细说明见intent object

Intent Object 参数说明

参数 描述 类型
name 意图标识 string
confirmationStatus 当前意图的确认状态,可选值有:+ NONE:未确认;+ CONFIRMED:已确认;+ DENIED:拒绝 string
slots 槽位信息 object
slots.{{SlotName}} {{SlotName}}是占位符,会被替换成实际在技能中定义的槽位标识 object
slots.{{SlotName}}.name 参数名(或者叫槽位名) string
slots.{{SlotName}}.confirmationStatus 当前参数的确认状态,可选值有:+ NONE:未确认;+ CONFIRMED:已确认;+ DENIED:拒绝 string
slots.{{SlotName}}.values 该参数对应的值列表 array
slots.{{SlotName}}.values[].value 参数的值 object
slots.{{SlotName}}.values[].value.type 参数值类型,可选值有:text:普通文本类型;unit:度量单位类型;address:地址类型;datetime:时间类型; string

Text Slot

文本类型槽位,也是最常用的槽位类型,所有的自定义实体、大部分的系统实体都会以该类型进行表示

参数 描述 类型
type 固定值:text string
value 槽位的实体值 string
origin 用户原始说法 string

Unit Slot

用于表示带单位的系统实体,比如长度、货币等。使用该类型槽位的实体有:

  • sys.unit:所有单位
  • sys.unit.currency:货币
  • sys.unit.length:长度
  • sys.unit.duration:时间
  • sys.unit.age:年龄
参数 描述 类型
type 固定值:unit string
amount 数值 string
unit 单位 string
origin 用户原始说法 string

Address Slot

用于表示复杂地址类型的系统实体,比如“广东省深圳市南山区深南大道10000号腾讯大厦”,使用该槽位类型的实体有:

  • sys.geo.province
  • sys.geo.county
  • sys.geo.address
参数 描述 类型
type 固定值:address string
country 国家 string
province string
city 城市 string
district 区/县 string
town 乡镇 string
village string
title 地名 string
origin 用户原始说法 string

Datetime Slot

用于表示复杂的系统时间实体,使用该槽位类型的实体有:

  • sys.date
  • sys.date.freq
  • sys.datetime
  • sys.datetime.freq
  • sys.datetime.duration
  • sys.datetime.future
参数 描述 类型
type 固定值:datetime string
value 时间表示,分以下三种类型:+ Normal datetime:单时间点,如“明天早上八点”+ Interval datetime:时间段,如“下周末”+ Repeat datetime:重复时间,如“每个工作日” object
origin 用户原始说法 string

Normal Datetime value

用于常规的时间表示,比如今天、明年等

参数 描述 类型
type 固定值:NORMAL string
datetime 具体时间点表示 object
datetime.date 日期,如“2018”,“2018-01”,“2018-01-01” string
datetime.time 24小时制时间,如“23:59:59" string

Interval Datetime value

用于表示时间间隔的实体,比如这周末、明后天等

参数 描述 类型
type 固定值:INTERVAL string
start 同Normal Datetime Value的datetime object
end 同Normal Datetime Value的datetime string

Repeat Datetime value

用于表示循环时间的实体,比如每周一、每个工作日等

参数 描述 类型
type 固定值:REPEAT string
amount 循环量 string
repeatType 循环单位,有以下几种类型:+ YEAR:年+ MONTH:月+ WEEK:周+ DAY:天+ HOUR:小时+ MINUTE:分钟+ WORKDAY:工作日+ WEEKEND:周末 string
start 同Normal Datetime Value的datetime object
end 同Normal Datetime Value的datetime object

SessionEndedRequest 参数说明

当用户主动退出该技能或者技能回复数据出现问题时,叮当会给叮当发送SessionEndedRequestSessionEndedRequest的响应限制如下:

  • shouldEndSession只能为true
  • 只允许Display.RenderTemplate类型的指令;

示例场景如下:

用户:叮当叮当,退出QQ音乐
叮当发送SessionEndRequest到技能 技能可以给出退出回复语
叮当:再见,QQ音乐期待下次与你相遇

参数 描述 类型
type 固定为SessionEndedRequest string
requestId 当前请求的ID,用于唯一标识一次请求 string
timestamp 用户请求时间戳,ISO 8601格式的UTC+0时间 string
reason 会话结束的原因 - USER_INITIATED:用户主动退出 - ERROR:出现意外错误 string
error 对错误信息的详细描述 object
error.type 错误类型,包括: INVALID_RESPONSE:技能响应有问题 INTERNAL_ERROR:叮当内部错误 string
error.message 错误信息说明 string

Connections.Response.Charge 扣款事件参数说明

由于技能可以通过Connections.SendRequest.Charge指令发起支付,在支付完成后会向技能发起该事件告知技能支付结果,此时技能可以返回内容继续为用户提供后续服务。

参数 描述 类型
type 固定为Connections.Response string
name 当前支持:Charge:支付结束 string
requestId 当前请求的ID,用于唯一标识一次请求 string
timestamp 用户请求时间戳,ISO 8601格式的UTC+0时间 string
payload.dingdangOrderId 叮当此次交易生成的订单ID string
payload.partnerOrderId 商户生成的订单ID string

注意:对该事件的响应内容不能包含Dialog类型的指令,且shouldEndSession会置为true

Display.ElementSelected 事件参数说明

在用户点击了宫格列表中的元素时,云小微会向技能发送Display.ElementSelected事件,技能可进行相应的处理并给出响应。

参数 描述 类型
type 固定为Display.ElementSelected string
requestId 当前请求的ID,用于唯一标识一次请求 string
timestamp 用户请求时间戳,ISO 8601格式的UTC+0时间 string
token 当前被选中的Item的token string

响应数据格式

HTTP Header

http
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

HTTP Body

响应数据是技能服务收到叮当请求后的返回,用于朗读TTS或者播放音视频、展示图形界面等,以下是一个技能响应数据的例子:

json
{
  "version": "string",
  "feedbackAttributes": {
    "key1": "string value1"
  },
  "response": {
    "outputSpeech": {
      "type": "PlainText",
      "text": "Plain text string to speak"
    },
    "card": {
      "type": "LinkAccount"
    },
    "directives": [
      {
        "type": "InterfaceName.Directive"
        ...
      }
    ],
    "shouldEndSession": true
  }
}

响应参数说明

参数 描述 类型 必需
version 协议的版本标识,当前版本为1.0 string
response 技能响应内容以及是否结束当前会话状态,详细说明见Response Object object
feedbackAttributes 设备厂商自建技能专用,用于从自建技能将数据透传给终端,需要保证请求的设备和技能在同一项目下,该字段数据大小需限制在1K以下 map

Response Object 参数说明

参数 描述 类型 必需
outputSpeech 回答用户的语音内容,将以TTS技术朗读出来 object
outputSpeech.type 当前只支持PlainText string
outputSpeech.text 回答用户的语音内容 string 是(当typePlainText时)
shouldEndSession 用于通知腾讯叮当是否结束当前会话,该字段不存在时使用默认值true:+ true表示结束当前会话;+ false表示会话继续,一般情况下返回false终端会自动打开麦克风收音; boolean
directives 指令列表,支持的类型有:+ AudioPlayer 类型的指令+ VideoPlayer 类型的指令+ Display 类型的指令+ Dialog 类型的指令+ Connections.SendRequest.Charge 类型的指令 array
card 卡片数据,可以在需要用户登陆时弹出账号连接卡片,卡片可能被发送到有屏设备或者手机APP上 object
card.type 卡片类型,目前支持: + LinkAccount: 账号连接卡片,关于账号连接见文档说明

AudioPlayer类型的指令

该类型的指令用于指示腾讯叮当终端执行音频播控相关的操作。

AudioPlayer.Play指令

播放音频列表。

  • 消息样例
json
{
  "type": "AudioPlayer.Play",
  "playlist": [
    {
      "stream": {
        "url": "string",
        "token": "string"
      },
      "info": {
        "title": "string",
        "subtitle": "string",
        "art": {
          "source": {
            "url": "string"
          }
        }
      },
      "pay": false
    }
  ]
}
  • 参数说明
参数 描述 类型 必需
type 固定值:AudioPlayer.Play string
playlist 音频列表 array
playlist[].stream 音频流信息 object
playlist[].stream.url 音频流地址 string
playlist[].stream.token 唯一标识此音频流的token string
playlist[].info 音频信息 object
playlist[].info.title 音频的标题 string
playlist[].info.subtitle 音频的副标题,建议是音乐类别或歌手姓名 string
playlist[].info.art 音频的封面图片信息,见Image Object object
playlist[].pay 音频是否需要付费,默认为falsetrue表示该音频未购买,需要购买才能后才能收听(playlist[].stream.url需要同时设置为空);false表示该音频已购买或者不需要付费购买 boolean

VideoPlayer类型的指令

该类型的指令用于指示腾讯叮当终端执行视频播控相关的操作。

VideoPlayer.Play指令

播放视频(当前只支持播放单个视频,视频列表播放能力后续支持)。

  • 消息样例
json
{
  "type": "VideoPlayer.Play",
  "playBehavior": "string",
  "playlist": [
    {
      "stream": {
        "url": "string",
        "token": "string"
      }
    }
  ]
}
  • 参数说明
参数 描述 类型 必需
type 固定值:VideoPlayer.Play string
playBehavior 控制视频播放操作及播放队列,有两种取值:+ REPLACE_ALL:默认值,停止当前正在播放的视频并替换队列中的所有视频;+ ENQUEUE:将视频加入到播放队列的末尾; string
playlist 播放列表 array
playlist[].stream 视频流 object
playlist[].stream.url 视频流地址 string
playlist[].stream.token 唯一标识此视频流的token string

Display类型的指令

Display.RenderTemplate指令

Display.RenderTemplate指令用于支持技能能够在带屏幕终端展示,技能服务使用平台定义的模板构造适合技能的展示样式。TSK技能开放平台提供两种类型的展示模板:

  1. 单条内容显示模板,用于展示文本及图文信息;
  2. 列表显示模板,用于显示列表的数据,列表的组成元素可以是文本、图文;

不同的模板在终端上其元素的大小、位置可能不尽相同,但是每个模板都是经过精心选择并有相对稳定的结构。技能开发者在构造包含显示模板的响应时,可以根据需要精心选择合适的模板,并配上响应的文本、图像、音频,给用户提供最好的、一致的体验。

NewsBodyTemplate 单图文模板

目前单图文模板只支持3行文本(约54个汉字)显示,多于3行的内容将隐藏。

  • 消息样例
json
{
  "type": "Display.RenderTemplate",
  "token": "string",
  "template": {
    "type": "NewsBodyTemplate",
    "textContent": TextContent,
    "backgroundImage": Image,
    "backgroundAudio": Audio
  }
}
  • 参数说明
参数 描述 类型 必需
type 固定值:Display.RenderTemplate string
token 模板token,用于标识该内容 string
template 显示模板 object
template.type 固定值:NewsBodyTemplate string
template.textContent 文本内容,见TextContent Object object
template.backgroundImage 背景图片,见Image Object object
template.backgroundAudio 背景音频,见Audio Object object
  • 卡片样例
NewsBodyTemplate1 单图文模板

目前单图文模板1只支持2行文本显示,多于2行的内容将隐藏。

  • 消息样例
json
{
  "type": "Display.RenderTemplate",
  "token": "string",
  "template": {
    "type": "NewsBodyTemplate1",
    "textContent": TextContent,
    "backgroundImage": Image,
    "backgroundAudio": Audio
  }
}
  • 参数说明
参数 描述 类型 必需
type 固定值:Display.RenderTemplate string
token 模板token,用于标识该内容 string
template 显示模板 object
template.type 固定值:NewsBodyTemplate1 string
template.textContent 文本内容,见TextContent Object object
template.backgroundImage 背景图片,见Image Object object
template.backgroundAudio 背景音频,见Audio Object object
  • 卡片样例
TextBodyTemplate 单文本模板
  • 消息样例
json
{
  "type": "Display.RenderTemplate",
  "token": "string",
  "template": {
    "type": "TextBodyTemplate",
    "textContent": TextContent
  }
}
  • 参数说明
参数 描述 类型 必需
type 固定值:Display.RenderTemplate string
token 模板token,用于标识该内容 string
template 显示模板 object
template.type 固定值:TextBodyTemplate string
template.textContent 文本内容,见TextContent Object object
  • 卡片样例
HorizontialListTemplate 横向列表模板
  • 消息样例
json
{
  "type": "Display.RenderTemplate",
  "token": "string",
  "template": {
    "type": "HorizontialListTemplate ",
    "listItems":[{
        "token": "string",
        "textContent": TextContent,
        "image": Image
      }]
  }
}
  • 参数说明
参数 描述 类型 必需
type 固定值:Display.RenderTemplate string
token 模板token,用于标识该内容 string
template 显示模板 object
template.type 固定值:HorizontialListTemplate string
template.listItems 列表 array
template.listItems[].token 列表元素的token string
template.listItems[].image 图片,见Image Object object
template.listItems[].textContent 文本内容,见TextContent Object object
  • 卡片样例
TextContent Object 参数说明
  • 消息样例
json
{
  "title": "string",
  "description": "string"
}
  • 参数说明
参数 描述 类型 必须
title 标题文本 string
description 内容描述文本,一般用于对标题的补充,对内容的进一步说明 string
Image Object 参数说明
  • 消息样例
json
{
  "contentDescription": "string",
  "source": {
    "url": "string"
  }
}
  • 参数说明
参数 描述 类型 必须
contentDescription 图片内容描述,该字段只用于图片加载中、加载失败情况下,替代图片显示用途,正常情况下不显示 string
source 图片源 object
source.url 图片源URL string
Audio Object 参数说明
  • 消息样例
json
{
  "source": {
    "url": "string"
  }
}
  • 参数说明
参数 描述 类型 必须
source 音频源 object
source.url 音频URL string

Dialog 类型的指令

Dialog类型的指令主要用于对话流程的控制,比如更新会话过程中的意图、参数,控制会话流程等。一个技能在完成一次响应可能需要经过多次的往返询问和确认。

Dialog.ElicitSlot指令

用于向用户询问某个槽位,用户的下一次正确回答将被填充到该槽位中。

  • 消息样例

用户:叮当叮当,帮我打个车
技能返回Dialog.ElicitSlot指令,指明slotToElicitdestination
叮当:请问你要去哪里?
用户:公司
叮当将“公司”提取为destination的槽位值

json
{
  "type": "Dialog.ElicitSlot",
  "slotToElicit": "{{SlotName1}}",
  "updatedIntent": {
    "name": "string",
    "confirmationStatus": "string",
    "slots": {
      "{{SlotName2}}": {
        "name": "{{SlotName2}}",
        "confirmationStatus": "string",
        "values": [{
          "value": {
            "type": "text",
            "value": "string",
            "origin": "string"
          }
        }]
      }
    }
  }
}
  • {{SlotName}}是技能在开放平台定义的槽位名,在上述打车例子中,将替换成destination
  • updatedIntent中的语义信息将覆盖原有会话的语义信息,因此如果技能只是更新部分槽位值,应该在请求中request.intent的基础上进行更新。
  • 参数说明
参数 描述 类型 必需
type 固定值:Dialog.ElicitSlot string
slotToElicit 指示腾讯叮当需要询问的参数名 string
updatedIntent 意图结构体,技能服务可以通过改变结构体的参数值或确认状态,详细信息见Intent Object object

Connections.SendRequest类型的指令

Charge支付指令

支付指令主要用于在语音交互中向终端发起支付请求,以便让用户完成支付,更多关于订单创建、订单查询、退款等支付相关的接口请查阅支付说明文档

  • 消息样例
json
{
  "type": "Connections.SendRequest",
  "name": "Charge",
  "payload": {
      "chargeInfo": {
          "name": "string",
          "description": "string",
          "userId": "string",
          "items": [{
              "itemId": "string",
              "itemName": "string",
              "price": 10,
              "totalFee": 100,
              "count": 10
          }]
      }
  }
}
  • 参数说明
参数 描述 类型 必需
type 固定值:Connections.SendRequest string
name 固定为Charge,表示支付指令 string
payload.chargeInfo 收费信息 object
payload.chargeInfo.userId 用户在商户平台的用户ID,用于后续的信息回传,若不支持账号连接,需要传该字段 string
payload.chargeInfo.name 收费名称 string
payload.chargeInfo.description 收费描述 string
payload.chargeInfo.items 商品子类 array
payload.chargeInfo.items[].itemId 商品ID string
payload.chargeInfo.items[].itemName 商品名称 string
payload.chargeInfo.items[].totalFee 总金额,单位为分 int
payload.chargeInfo.items[].price 商品单价,单位为分 int
payload.chargeInfo.items[].count 商品数量 int

更新日志

2019/09/19 更新

  • 切换支付相关指令;

2018/11/22 更新

  • 修正updateIntentslots[]结构的错误;

2018/12/26 更新

  • 新增VideoPlayer.Play指令;

2018/12/29 更新

  • 新增账号连接card卡片说明;

Didn't find tool you were looking for?

Be as detailed as possible for better results