实时对话
<p>[TOC]</p>
<h5>简要描述</h5>
<ul>
<li>基于websocket实时返回对话内容,生产环境建议使用</li>
<li>接口自动支持内容过滤,后台开启后</li>
</ul>
<h5>请求URL</h5>
<ul>
<li><code>ws://api-openai.dtgarden.com/ws/question/1</code></li>
</ul>
<h5>请求方式</h5>
<ul>
<li>websocket协议</li>
</ul>
<h5>参数</h5>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">必选</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">roleCode</td>
<td style="text-align: left;">否</td>
<td>string</td>
<td>对应后台细分领域对话角色模型编码 默认gpt</td>
</tr>
<tr>
<td style="text-align: left;">continuousDialogue</td>
<td style="text-align: left;">否</td>
<td>int</td>
<td>开启连续对话 1开启 0不开启默认1开启 上下文限制由开发者后台账号接口配配置更改</td>
</tr>
<tr>
<td style="text-align: left;">model</td>
<td style="text-align: left;">否</td>
<td>string</td>
<td>对话模型 1gpt3.5 2gtp4 3gpt432k 4gpt-plus 默认gpt3.5 官方gpt4 请使用模型4 接口模型参数大于后台开发者后台模型配置未来支持更多其他模型 如百度,阿里等</td>
</tr>
<tr>
<td style="text-align: left;">replyId</td>
<td style="text-align: left;">是</td>
<td>string</td>
<td>url路径参数 聊天会话ID 不重复,每一个用户创建新的对话生成新的uuid 对应新的上下文 根据开发者账号回话ID加角色 保存回话上下文</td>
</tr>
<tr>
<td style="text-align: left;">identification</td>
<td style="text-align: left;">否</td>
<td>string</td>
<td>接口服务ID 不同模型对应后台不同接口服务ID。不填写会走账号下key</td>
</tr>
</tbody>
</table>
<p>websocket 与客户端保持长连接解决方案 使用心跳模式 固定消息格式<strong>ping</strong>视为心跳数据</p>
<p>示例代码</p>
<pre><code class="language-javascript">//接收到消息的回调方法
ws.onmessage = function (event) {
// 心跳机制保存连接
if (event.data === 'ping') {
ws.send('pong');
} else if (event.data === 'pong') {
clearTimeout(timerId);
timerId = setTimeout(function() {
ws.send('ping');
}, 5000);
}else{
analysisMsg(event)
}
};</code></pre>
<p>完整websocket代码示例</p>
<pre><code class="language-javascript">//授权
if(token==null){
getToken();
}
params = {
appId,
token,
model,
roloeCode,
continuousDialogue
};
let wsUrl=wsApi+'/ws/question/'+replyId+'?'+buildUrlParams(params)
console.log(wsUrl)
ws = new WebSocket(wsUrl);
let timerId;
//连接成功建立的回调方法
ws.onopen = function () {
console.log('WebSocket 连接已打开');
$(&quot;#chatStatus span&quot;).text(&quot;在线&quot;)
timerId = setTimeout(function() {
ws.send('ping');
}, 5000);
};
//接收到消息的回调方法
ws.onmessage = function (event) {
// 心跳机制保存连接
if (event.data === 'ping') {
ws.send('pong');
} else if (event.data === 'pong') {
console.log(&quot;💓&quot;)
clearTimeout(timerId);
timerId = setTimeout(function() {
ws.send('ping');
}, 5000);
}else{
analysisMsg(event)
}
};
//连接关闭的回调方法
ws.onclose = function () {
console.log('WebSocket 连接已关闭');
$(&quot;#chatStatus span&quot;).text(&quot;离线&quot;)
};
//连接发生错误的回调方法
ws.onerror = function () {
console.log(&quot;WebSocket连接发生错误&quot;)
$(&quot;#chatStatus span&quot;).text(&quot;离线&quot;)
alert(&quot;会话连接异常已断开,请刷新重新连接&quot;)
};
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,
//防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
closeWebSocket();
}</code></pre>
<h5>返回示例</h5>
<p><img src="https://images.soboys.cn/202305281055896.png" alt="" /></p>