创建并配置插件
详细创建流程可参考文档使用 IDE 创建插件,此处仅提供简化操作流程
-
创建插件与工具
- 创建插件
- 创建工具
插件中的每个工具代表一个API接口,一般“查询”、“执行”等动作分别代表一个工具
-
配置写入代码
-
添加示例代码
在这个位置添加示例代码
示例****代码来自“接入说明”部分。服务文档中有如截图所示的接入说明部分的服务,都可以按当前方案接入
示例代码:
import json
import sys
import os
import base64
import datetime
import hashlib
import hmac
import requests
method = 'POST'
host = 'visual.volcengineapi.com'
region = 'cn-north-1'
endpoint = 'https://visual.volcengineapi.com'
service = 'cv'
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
def getSignatureKey(key, dateStamp, regionName, serviceName):
kDate = sign(key.encode('utf-8'), dateStamp)
kRegion = sign(kDate, regionName)
kService = sign(kRegion, serviceName)
kSigning = sign(kService, 'request')
return kSigning
def formatQuery(parameters):
request_parameters_init = ''
for key in sorted(parameters):
request_parameters_init += key + '=' + parameters[key] + '&'
request_parameters = request_parameters_init[:-1]
return request_parameters
def signV4Request(access_key, secret_key, service, req_query, req_body):
if access_key is None or secret_key is None:
print('No access key is available.')
sys.exit()
t = datetime.datetime.utcnow()
current_date = t.strftime('%Y%m%dT%H%M%SZ')
# current_date = '20210818T095729Z'
datestamp = t.strftime('%Y%m%d') # Date w/o time, used in credential scope
canonical_uri = '/'
canonical_querystring = req_query
signed_headers = 'content-type;host;x-content-sha256;x-date'
payload_hash = hashlib.sha256(req_body.encode('utf-8')).hexdigest()
content_type = 'application/json'
canonical_headers = 'content-type:' + content_type + '\n' + 'host:' + host + \
'\n' + 'x-content-sha256:' + payload_hash + \
'\n' + 'x-date:' + current_date + '\n'
canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + \
'\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
# print(canonical_request)
algorithm = 'HMAC-SHA256'
credential_scope = datestamp + '/' + region + '/' + service + '/' + 'request'
string_to_sign = algorithm + '\n' + current_date + '\n' + credential_scope + '\n' + hashlib.sha256(
canonical_request.encode('utf-8')).hexdigest()
# print(string_to_sign)
signing_key = getSignatureKey(secret_key, datestamp, region, service)
# print(signing_key)
signature = hmac.new(signing_key, (string_to_sign).encode(
'utf-8'), hashlib.sha256).hexdigest()
# print(signature)
authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + \
credential_scope + ', ' + 'SignedHeaders=' + \
signed_headers + ', ' + 'Signature=' + signature
# print(authorization_header)
headers = {'X-Date': current_date,
'Authorization': authorization_header,
'X-Content-Sha256': payload_hash,
'Content-Type': content_type
}
# print(headers)
# ************* SEND THE REQUEST *************
request_url = endpoint + '?' + canonical_querystring
print('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++')
print('Request URL = ' + request_url)
try:
r = requests.post(request_url, headers=headers, data=req_body)
except Exception as err:
print(f'error occurred: {err}')
raise
else:
print('\nRESPONSE++++++++++++++++++++++++++++++++++++')
print(f'Response code: {r.status_code}\n')
# 使用 replace 方法将 \u0026 替换为 &
resp_str = r.text.replace("\u0026", "&")
print(f'Response body: {resp_str}\n')
if __name__ == "__main__":
# 请求凭证,从访问控制申请
access_key = 'AK*****'
secret_key = '*****=='
# 请求Query,按照接口文档中填入即可
query_params = {
'Action': 'CVProcess',
'Version': '2022-08-31',
}
formatted_query = formatQuery(query_params)
# 请求Body,按照接口文档中填入即可
body_params = {
"req_key": "******",
# ......
}
formatted_body = json.dumps(body_params)
signV4Request(access_key, secret_key, service,
formatted_query, formatted_body)
-
调整代码
调整前
调整后
-
安装requests依赖包
-
配置参数输入输出
插件在使用时,如果想要每次调用动态传入不同参数作为API接口的入参,需要配置对应元数据使用。
- 根据具体接口文档配置想要传入的参数值。
- 代码中对参数值进行变量定义
至此,主要部分修改完毕,可以参考对应服务文档接入相关服务
示例:
示例参数根据发文时文档填写,实际使用时还请参考对应的最新接口文档
示例一:接入即梦4.0
接入即梦4.0,参考文档:https://www.volcengine.com/docs/85621/1817045
即梦4.0接口为异步接口,需要先再按上述步骤创建一个工具,作为查询接口
按文档配置请求参数
-
提交任务接口
根据文档中的内容,在代码配置相关参数
access_key secret_key 获取
https://console.volcengine.com/iam/keymanage这个网页获取
配置好后,调用测试,调用成功
-
查询任务接口
根据文档中的内容,在代码配置相关参数。
参数配置
access_key secret_key 使用与提交任务相同的access_key secret_key
运行结果
测试调用成功
注意:
1、当前测试只填写了必填参数,其他参数根据实际需求填写
2、自定义插件输出长度存在限制,不建议使用base64等超长内容输出
示例二:接入单图视频驱动
单图视频驱动产品,参考文档https://www.volcengine.com/docs/86081/1804524
按创建并配置插件部分内容,先创建两个基本插件,一个创建任务,一个查询任务
通过https://console.volcengine.com/iam/keymanage获取access_key、secret_key
根据文档内容填写参数
-
任务提交接口
设置需要传参的元数据和参数,需参考上文配置参数输入输出进行设置。
填写query_params、body_params和两个key
完整Demo:
from runtime import Args
from typings.one_pic.one_pic import Input, Output
"""
Each file needs to export a function named `handler`. This function is the entrance to the Tool.
Parameters:
args: parameters of the entry function.
args.input - input parameters, you can get test input value by args.input.xxx.
args.logger - logger instance used to print logs, injected by runtime.
Remember to fill in input/output in Metadata, it helps LLM to recognize and use tool.
Return:
The return data of the function, which should match the declared output parameters.
"""
import json
import sys
import os
import base64
import datetime
import hashlib
import hmac
import requests
method = 'POST'
host = 'visual.volcengineapi.com'
region = 'cn-north-1'
endpoint = 'https://visual.volcengineapi.com'
service = 'cv'
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
def getSignatureKey(key, dateStamp, regionName, serviceName):
kDate = sign(key.encode('utf-8'), dateStamp)
kRegion = sign(kDate, regionName)
kService = sign(kRegion, serviceName)
kSigning = sign(kService, 'request')
return kSigning
def formatQuery(parameters):
request_parameters_init = ''
for key in sorted(parameters):
request_parameters_init += key + '=' + parameters[key] + '&'
request_parameters = request_parameters_init[:-1]
return request_parameters
def signV4Request(access_key, secret_key, service, req_query, req_body):
if access_key is None or secret_key is None:
print('No access key is available.')
sys.exit()
t = datetime.datetime.utcnow()
current_date = t.strftime('%Y%m%dT%H%M%SZ')
# current_date = '20210818T095729Z'
datestamp = t.strftime('%Y%m%d') # Date w/o time, used in credential scope
canonical_uri = '/'
canonical_querystring = req_query
signed_headers = 'content-type;host;x-content-sha256;x-date'
payload_hash = hashlib.sha256(req_body.encode('utf-8')).hexdigest()
content_type = 'application/json'
canonical_headers = 'content-type:' + content_type + '\n' + 'host:' + host + \
'\n' + 'x-content-sha256:' + payload_hash + \
'\n' + 'x-date:' + current_date + '\n'
canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + \
'\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
# print(canonical_request)
algorithm = 'HMAC-SHA256'
credential_scope = datestamp + '/' + region + '/' + service + '/' + 'request'
string_to_sign = algorithm + '\n' + current_date + '\n' + credential_scope + '\n' + hashlib.sha256(
canonical_request.encode('utf-8')).hexdigest()
# print(string_to_sign)
signing_key = getSignatureKey(secret_key, datestamp, region, service)
# print(signing_key)
signature = hmac.new(signing_key, (string_to_sign).encode(
'utf-8'), hashlib.sha256).hexdigest()
# print(signature)
authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + \
credential_scope + ', ' + 'SignedHeaders=' + \
signed_headers + ', ' + 'Signature=' + signature
# print(authorization_header)
headers = {'X-Date': current_date,
'Authorization': authorization_header,
'X-Content-Sha256': payload_hash,
'Content-Type': content_type
}
# print(headers)
# ************* SEND THE REQUEST *************
request_url = endpoint + '?' + canonical_querystring
print('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++')
print('Request URL = ' + request_url)
try:
r = requests.post(request_url, headers=headers, data=req_body)
except Exception as err:
print(f'error occurred: {err}')
raise
else:
print('\nRESPONSE++++++++++++++++++++++++++++++++++++')
print(f'Response code: {r.status_code}\n')
# 使用 replace 方法将 \u0026 替换为 &
resp_str = r.text.replace("\u0026", "&")
print(f'Response body: {resp_str}\n')
return resp_str
def handler(args: Args[Input])->Output:
# 引入参数
image_url = args.input.image_url
video_url = args.input.video_url
# 请求凭证,从访问控制申请
access_key = 'AKL*****************'
secret_key = 'TTJ*********************=='
# 请求Query,按照接口文档中填入即可
query_params = {
'Action': 'CVSubmitTask',
'Version': '2022-08-31',
}
formatted_query = formatQuery(query_params)
# 请求Body,按照接口文档中填入即可
body_params = {
"req_key": "realman_avatar_imitator_v2v_gen_video",
"image_url": image_url,
"driving_video_info": {
"store_type": 0,
"video_url": video_url
}
}
formatted_body = json.dumps(body_params)
result = signV4Request(access_key, secret_key, service,
formatted_query, formatted_body)
return {"message": result}
-
查询接口
- 设置需要传参的元数据和参数,参考上文配置参数输入输出进行设置。
- 填写query_params、body_params和两个key
{
"req_key": "realman_avatar_imitator_v2v_gen_video",
"task_id": "<任务提交接口返回task_id>"
}
task_id参数是由任务提交接口返回的,填写到这个部分用于查询对应任务。
注意:
1、该接口服务处理需要一点时间,发起请求后立即查询可能无法获取到结果,当 "status" 为 "done" ,表明任务处理完成,可获取对应url。
