Skip to content

Commit c46c46c

Browse files
committed
APIAuto: 完成 AI 问答信息流逐行显示
1 parent ac918e4 commit c46c46c

File tree

2 files changed

+106
-38
lines changed
  • APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/resources/static/api

2 files changed

+106
-38
lines changed

APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/resources/static/api/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,7 @@
10521052
var vMarkdown = document.getElementById('vMarkdown');
10531053
var vPage = document.getElementById('vPage');
10541054
var vCount = document.getElementById('vCount');
1055+
var vAskAI = document.getElementById('vAskAI');
10551056
var vSearch = document.getElementById('vSearch');
10561057
var vTestCasePage = document.getElementById('vTestCasePage');
10571058
var vTestCaseCount = document.getElementById('vTestCaseCount');

APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/resources/static/api/js/main.js

Lines changed: 105 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7508,7 +7508,101 @@ Content-Type: ` + contentType) + (StringUtil.isEmpty(headerStr, true) ? '' : hea
75087508
if (type == 'ask') {
75097509
if (isEnter) {
75107510
const user_query = StringUtil.trim(vAskAI.value);
7511-
const uuid = crypto.randomUUID();
7511+
function onMessage(item) {
7512+
var data2 = item == null ? null : item.data
7513+
if (data2 == null || item.type != 'chunk') {
7514+
return;
7515+
}
7516+
7517+
var answer = StringUtil.trim(typeof data2 == 'string' ? data2 : (data instanceof Array ? data2.join() : JSON.stringify(data2)));
7518+
App.view = 'markdown';
7519+
vOutput.value += answer;
7520+
markdownToHTML(vOutput.value)
7521+
}
7522+
7523+
function queryResult() {
7524+
App.request(true, REQUEST_TYPE_GET, REQUEST_TYPE_PARAM, 'https://api.devin.ai/ada/query/' + App.uuid, {}, {}, function (url, res, err) {
7525+
// App.onResponse(url, res, err)
7526+
var data = res.data || {}
7527+
// var isOk = JSONResponse.isSuccess(data)
7528+
7529+
var msg = ''; // isOk ? '' : ('\nmsg: ' + StringUtil.get(data.msg))
7530+
if (err != null) {
7531+
msg += '\nerr: ' + err.message
7532+
vOutput.value = err.message
7533+
App.view = 'error';
7534+
return
7535+
}
7536+
7537+
var queries = data.queries || []
7538+
var last = queries[queries.length - 1] || {}
7539+
var query = last.user_query || user_query
7540+
var response = last.response || []
7541+
var answer = '#### ' + query + '\n<br/>';
7542+
for (var i = 0; i < response.length; i ++) {
7543+
// onMessage(response[i])
7544+
var item = response[i];
7545+
var data2 = item == null ? null : item.data;
7546+
if (data2 == null || item.type != 'chunk') {
7547+
continue;
7548+
}
7549+
7550+
answer += '\n' + StringUtil.trim(typeof data2 == 'string' ? data2 : (data2 instanceof Array ? data2.join() : JSON.stringify(data2)));
7551+
}
7552+
7553+
App.view = 'markdown';
7554+
vOutput.value = answer;
7555+
markdownToHTML(answer); // vOutput.value)
7556+
})
7557+
}
7558+
7559+
function askAI() {
7560+
vOutput.value = '#### ' + user_query + '\n<br/>';
7561+
App.loadingCount ++;
7562+
const ws = new WebSocket('wss://api.devin.ai/ada/ws/query/' + App.uuid);
7563+
7564+
// 连接成功
7565+
ws.onopen = () => {
7566+
console.log('WebSocket connected');
7567+
// 这里通常不需要主动发送内容,除非协议需要
7568+
};
7569+
7570+
// 收到消息
7571+
ws.onmessage = (event) => {
7572+
try {
7573+
const data = JSON.parse(event.data);
7574+
console.log('Message:', data);
7575+
onMessage(data)
7576+
7577+
if (data.type === 'chunk') {
7578+
console.log('Chunk Data:', data.data);
7579+
}
7580+
} catch (err) {
7581+
console.error('Failed to parse message:', event.data);
7582+
}
7583+
};
7584+
7585+
// 连接关闭
7586+
ws.onclose = () => {
7587+
console.log('WebSocket closed');
7588+
App.loadingCount --;
7589+
queryResult();
7590+
};
7591+
7592+
// 错误处理
7593+
ws.onerror = (err) => {
7594+
console.error('WebSocket error:', err);
7595+
queryResult();
7596+
};
7597+
7598+
}
7599+
7600+
if (StringUtil.isNotEmpty(this.uuid, true)) {
7601+
askAI();
7602+
return;
7603+
}
7604+
7605+
this.uuid = crypto.randomUUID();
75127606
this.request(true, REQUEST_TYPE_POST, REQUEST_TYPE_JSON, 'https://api.devin.ai/ada/query', {
75137607
"engine_id": "multihop",
75147608
"user_query": "<relevant_context>This query was sent from the wiki page: Overview.</relevant_context>" + user_query,
@@ -7517,51 +7611,23 @@ Content-Type: ` + contentType) + (StringUtil.isEmpty(headerStr, true) ? '' : hea
75177611
"Tencent/APIJSON"
75187612
],
75197613
"additional_context": "",
7520-
"query_id": uuid,
7614+
"query_id": this.uuid,
75217615
"use_notes": false,
75227616
"generate_summary": false
75237617
}, {}, function (url, res, err) {
75247618
App.onResponse(url, res, err)
75257619
var data = res.data || {}
7526-
var isOk = JSONResponse.isSuccess(data)
7620+
// var isOk = JSONResponse.isSuccess(data)
75277621

7528-
var msg = isOk ? '' : ('\nmsg: ' + StringUtil.get(data.msg))
7622+
var msg = ''; // isOk ? '' : ('\nmsg: ' + StringUtil.get(data.msg))
75297623
if (err != null) {
7530-
msg += '\nerr: ' + err.msg
7531-
vOutput.value = err.msg
7532-
this.view = 'error';
7624+
msg += '\nerr: ' + err.message
7625+
vOutput.value = err.message
7626+
App.view = 'error';
75337627
return
75347628
}
75357629

7536-
App.request(true, REQUEST_TYPE_GET, REQUEST_TYPE_PARAM, 'https://api.devin.ai/ada/query/' + uuid, {}, {}, function (url, res, err) {
7537-
App.onResponse(url, res, err)
7538-
var data = res.data || {}
7539-
var isOk = JSONResponse.isSuccess(data)
7540-
7541-
var msg = isOk ? '' : ('\nmsg: ' + StringUtil.get(data.msg))
7542-
if (err != null) {
7543-
msg += '\nerr: ' + err.msg
7544-
vOutput.value = err.msg
7545-
this.view = 'error';
7546-
return
7547-
}
7548-
7549-
var queries = data.queries || []
7550-
var last = queries[queries.length - 1]
7551-
var query = last.user_query || user_query
7552-
var response = last.response || []
7553-
var answer = '### Ask\n' + query + '\n### Answer\n';
7554-
for (var i = 0; i < response.length; i ++) {
7555-
var item = response[i] || {};
7556-
if (item.type != 'file_contents') {
7557-
continue;
7558-
}
7559-
answer += '\n' + StringUtil.trim(typeof data == 'string' ? data : (data instanceof Array ? data.join() : JSON.stringify(data)));
7560-
}
7561-
7562-
vOutput.value += answer;
7563-
App.view = 'markdown';
7564-
})
7630+
askAI();
75657631
})
75667632
}
75677633
return
@@ -8005,7 +8071,7 @@ Content-Type: ` + contentType) + (StringUtil.isEmpty(headerStr, true) ? '' : hea
80058071
}
80068072
break;
80078073
case CodeUtil.LANGUAGE_C_SHARP:
8008-
s += '\n#### <= Unity3D-C\#: 键值对用 {"key", value}' +
8074+
s += '\n#### <= Unity3D-C\\#: 键值对用 {"key", value}' +
80098075
'\n ```csharp \n'
80108076
+ CodeUtil.parseCSharpRequest(null, parseJSON(rq), 0)
80118077
+ '\n ``` \n注:对象 {} 用 new JObject{{"key", value}},数组 [] 用 new JArray{value0, value1}\n';
@@ -13116,7 +13182,8 @@ Content-Type: ` + contentType) + (StringUtil.isEmpty(headerStr, true) ? '' : hea
1311613182
// alert(event.key) 小写字母 i 而不是 KeyI
1311713183

1311813184
var target = event.target;
13119-
if (target == vSearch || target == vTestCaseSearch || target == vCaseGroupSearch || target == vChainGroupSearch || target == vChainGroupAdd || target == vChainAdd) {
13185+
if (target == vAskAI || target == vSearch || target == vTestCaseSearch || target == vCaseGroupSearch
13186+
|| target == vChainGroupSearch || target == vChainGroupAdd || target == vChainAdd) {
1312013187
return
1312113188
}
1312213189

0 commit comments

Comments
 (0)