Created
August 4, 2021 02:54
-
-
Save nulIptr/e256f569127a9042754ed0a232b17746 to your computer and use it in GitHub Desktop.
Run a workflow api test then write the response back to excel table
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: XiaoiceTesterWithMultiTables_cq | |
description: Run a workflow api test then write the response back to excel table | |
host: EXCEL | |
api_set: {} | |
script: | |
content: > | |
var PARTNERS = {}; | |
const CustomUrl = | |
"http://localhost:3000/int-xiaoicecore-aks.trafficmanager.net/api/chitchat/reply?workflow={{workflow}}";; | |
const INT_CORE_CHAT_URL = | |
"http://localhost:3000/int-xiaoicecore-commercialshare.trafficmanager.cn/api/chitchat/reply?workflow={{workflow}}"; | |
const PPE_CORE_CHAT_URL = | |
"http://localhost:3000/prod-xiaoicecore-commercialppe2.trafficmanager.cn/api/chitchat/reply?workflow={{workflow}}"; | |
const PROD_CORE_CHAT_URL = | |
"http://localhost:3000/prod-xiaoicecore-commercialshare.trafficmanager.cn/api/chitchat/reply?workflow={{workflow}}"; | |
tryCatch(setup); | |
$("#run").click(() => tryCatch(run)); | |
$("#generateMT").click(() => tryCatch(generate)); | |
async function generate() { | |
await Excel.run(async (context) => { | |
const sheet = context.workbook.worksheets.getItem("Sheet3"); | |
var uRange = sheet.getUsedRange(); | |
uRange.load("address"); | |
uRange.load("rowCount"); | |
await context.sync(); | |
var count = uRange.rowCount; | |
if (count > 1500) { | |
count = 1500; | |
} | |
var aRanges = sheet.getRange("A1:A" + count.toString()).load("values"); | |
var cRanges = sheet.getRange("C1:C" + count.toString()).load("values"); | |
var hRanges = sheet.getRange("H1:H" + (count * 2).toString()); | |
var iRanges = sheet.getRange("I1:I" + (count * 2).toString()); | |
await context.sync(); | |
var a = aRanges.values; | |
var c = cRanges.values; | |
var results = []; | |
var senderIds = []; | |
for (var i = 0; i < a.length; i++) { | |
results.push(a[i], c[i]); | |
senderIds.push(["uid_" + i], ["uid_" + i]); | |
} | |
hRanges.values = results; | |
iRanges.values = senderIds; | |
console.log(_.take(senderIds, 16)); | |
console.log(_.take(results, 16)); | |
await context.sync(); | |
}); | |
} | |
var tbl = "Single_Turn"; | |
async function run() { | |
await Excel.run(async (context) => { | |
tbl = $("#Table") | |
.find(":selected") | |
.val() | |
.toString(); | |
const sheet = context.workbook.worksheets.getItem(tbl); | |
var uRange = sheet.getUsedRange(); | |
uRange.load("address"); | |
uRange.load("rowCount"); | |
await context.sync(); | |
var count = uRange.rowCount; | |
if (count > 1500) { | |
count = 1500; | |
} | |
var qRanges = sheet.getRange("A2:A" + count.toString()).load("values"); | |
var senderIdsRanges = sheet.getRange("E2:E" + count.toString()).load("values"); | |
await context.sync(); | |
var queries = qRanges.values; | |
var senderIds = senderIdsRanges.values; | |
var responseTimes = []; | |
for (var i = 0; i < queries.length; i++) { | |
if (queries[i] == undefined || queries[i][0].toString() == "") { | |
break; | |
} | |
var startTime = Date.now(); | |
var response = await getApiQuery(queries[i][0], senderIds[i][0]) | |
.then((res) => res.json()) | |
.catch((error) => console.log(error)); | |
var t = Date.now() - startTime; | |
var bRanges = sheet.getRange("B" + (2 + i).toString() + ":D" + (2 + i).toString()); | |
var p = Math.floor((i / queries.length) * 100 + 2); | |
if (p > 100) { | |
p = 100; | |
} | |
if (i == queries.length - 1) { | |
p = 100; | |
} | |
if (p < 100) { | |
$("#run").prop("disabled", true); | |
} else { | |
$("#run").prop("disabled", false); | |
} | |
$("#Progress").text("进度 " + p.toFixed(0) + "%"); | |
if (response == undefined || response.length == 0) { | |
bRanges.values = [["No Reply", "No AnswerFeed", t]]; | |
} else { | |
bRanges.values = [[response[0].Content.Text, response[0].Content.Metadata.AnswerFeed, t]]; | |
} | |
context.sync(); | |
} | |
}); | |
} | |
async function getApiQuery(msg, senderid) { | |
var pid = $("#PartnerId") | |
.find(":selected") | |
.val(); | |
var p = PARTNERS[pid.toString()]; | |
var workflow = p["Workflow"]; | |
var isSingleTurn = $("#SingleTurn").is(":checked"); | |
var env = $("#Env") | |
.find(":selected") | |
.val(); | |
let url=""; | |
if (CustomUrl){ | |
url = CustomUrl.replace("{{workflow}}", workflow); | |
}else{ | |
url = PROD_CORE_CHAT_URL.replace("{{workflow}}", workflow); | |
switch (env) { | |
case "int": | |
url = INT_CORE_CHAT_URL.replace("{{workflow}}", workflow); | |
break; | |
case "ppe": | |
url = PPE_CORE_CHAT_URL.replace("{{workflow}}", workflow); | |
break; | |
default: | |
break; | |
} | |
} | |
let uuid = | |
Date.now().toString(36) + | |
Math.random() | |
.toString(36) | |
.substring(2); | |
if (!isSingleTurn) { | |
uuid = "Test-User-Id-From-Excel"; | |
} | |
if (senderid != "") { | |
uuid = senderid; | |
} | |
var data = { | |
MasterPuid: uuid, | |
SenderPuid: uuid, | |
MasterUuid: uuid, | |
SenderUuid: uuid, | |
Content: { | |
Text: msg, | |
Metadata: { | |
Character: p["Character"] | |
} | |
}, | |
PartnerInfo: { | |
PartnerId: pid.toString().split("-")[0] | |
} | |
}; | |
Object.keys(p["Metadata"]).forEach((k) => { | |
if (p["Metadata"][k] != undefined) { | |
data.Content.Metadata[k] = p["Metadata"][k]; | |
} | |
}); | |
return fetch(url, { | |
headers: new Headers({ | |
"Content-Type": "application/json", | |
Accept: "application/json" | |
}), | |
method: "POST", | |
body: JSON.stringify(data) | |
}); | |
} | |
async function setup() { | |
await Excel.run(async (context) => { | |
const sheet = context.workbook.worksheets.getItem("Partners"); | |
var uRange = sheet.getUsedRange(); | |
uRange.load("address"); | |
uRange.load("rowCount"); | |
await context.sync(); | |
var count = uRange.rowCount; | |
const partners = sheet.getRange("A2:E" + count.toString()); | |
partners.load("values"); | |
await sheet.context.sync(); | |
var c = context.workbook.getActiveCell(); | |
$("#PartnerId") | |
.children() | |
.remove() | |
.end(); | |
partners.values.forEach(function(item) { | |
$("#PartnerId").append("<option>" + item[0] + "</option>"); | |
PARTNERS["" + item[0]] = { | |
PartnerId: item[0], | |
PartnerName: item[1], | |
Workflow: item[2], | |
Character: item[3], | |
Metadata: JSON.parse(item[4]) | |
}; | |
}); | |
$("#PartnerId").on("change", function() { | |
var pid = $(this) | |
.find(":selected") | |
.val(); | |
var p = PARTNERS[pid.toString()]; | |
$("#PartnerName").text(p["PartnerName"]); | |
$("#Workflow").text(p["Workflow"]); | |
$("#Character").text(p["Character"]); | |
}); | |
await context.sync(); | |
}); | |
} | |
async function tryCatch(callback) { | |
try { | |
await callback(); | |
} catch (error) { | |
console.log(error); | |
$("Error").text(error); | |
} | |
} | |
language: typescript | |
template: | |
content: "<section class=\"xiaoice ms-font-m\">\n\t<h3>Xiaoice Workflow Api Tester</h3>\n\t<p><b>使用说明:</b></p>\n\t<p>\n\t\t1. 把需要跑的数据复制到第一列,点击PartnerId的下拉列表,选择一个Partner。<br/>\n 2. 然后Workflow和Character会自动更新,不需要手动修改<br/>\n\t\t3. 默认是单轮的,如果需要多轮对话,取消单轮的选项<br/>\n\t\t4. 默认是prod的环境,如果需要切换,选择环境下拉菜单选项\n\t</p>\n\t\t<p>PartnerName: <span id=\"PartnerName\">VankeIot</span> Workflow: <span id=\"Workflow\">CharacterXiaowanIot</span>\n\t\t\tCharacter: <span id=\"Character\">xiaowan-iot</span>\n\t\t\t<p> Partner:\n\t\t\t\t<select id=\"PartnerId\" Size=\"1\"></select> <br/><br/>\n\n单轮聊天: <input type=\"checkbox\" id=\"SingleTurn\" checked=\"checked\" title=\"单轮\"/> <br/><br/>API环境: <select id=\"Env\" Size=\"1\">\n<option value=\"int\">Int</option>\n<option value=\"ppe\">PPE</option>\n<option value=\"prod\" selected=\"true\">Prod</option>\n</select>\n\n<br/><br/>\n测试集:<select id=\"Table\" size=\"1\">\n\t<option>Single_Turn</option>\n\t<option>Skill</option>\n\t<option>Persona</option>\n\t<option>QueryBlock</option>\n\t\t<option>MultiTurn</option>\n </select>\n\t</p>\n\t<p><span id=\"Progress\">进度 0%</span></p>\n\t\t<!--\t\t<button id=\"setup\" class=\"ms-Button\">\n\t\t\t <span class=\"ms-Button-label\">初始化</span>\n\t\t\t </button>-->\n\t\t\t\t<button id=\"run\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">开始</span>\n </button>\n\t\t<button id=\"generateMT\" class=\"ms-Button\">\n\t\t\t\t\t <span class=\"ms-Button-label\">生成多轮</span>\n\t\t\t\t\t </button>\n\n\t\t\t\t<p>\n\t\t\t\t\t<p id=\"Error\"></p>\n</section>" | |
language: html | |
style: | |
content: | | |
section.xiaoice { | |
margin-top: 20px; | |
} | |
section.xiaoice .ms-Button, section.setup .ms-Button { | |
display: block; | |
margin-bottom: 5px; | |
margin-left: 20px; | |
min-width: 80px; | |
} | |
language: css | |
libraries: |- | |
https://appsforoffice.microsoft.com/lib/1/hosted/office.js | |
@types/office-js | |
office-ui-fabric-js@1.4.0/dist/css/fabric.min.css | |
office-ui-fabric-js@1.4.0/dist/css/fabric.components.min.css | |
core-js@2.4.1/client/core.min.js | |
@types/core-js | |
jquery@3.1.1 | |
@types/jquery@3.3.1 | |
moment@2.29.1 | |
@types/moment | |
lodash@4.17.21 | |
@types/lodash |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment