Compare commits

..

4 Commits

3 changed files with 80 additions and 39 deletions

View File

@@ -54,6 +54,6 @@ const localDevConfig = ({
uniacid: 115, uniacid: 115,
domain: 'https://5g.aigc-quickapp.com/', domain: 'https://5g.aigc-quickapp.com/',
}, },
})['115']; // 选择要使用的环境配置 })['1']; // 选择要使用的环境配置
export default localDevConfig; export default localDevConfig;

View File

@@ -5,6 +5,17 @@ import store from '@/store/index.js'
let currentConversationId = null; let currentConversationId = null;
const CONVERSATION_KEY = 'ai_conversation_id'; const CONVERSATION_KEY = 'ai_conversation_id';
/**
* 获取域名配置参数(避免重复代码)
*/
function getDomainParams() {
return {
imgDomain: Config.imgDomain,
h5Domain: Config.h5Domain,
baseUrl: Config.baseUrl
};
}
// 初始化时从本地读取会话ID // 初始化时从本地读取会话ID
try { try {
const saved = uni.getStorageSync(CONVERSATION_KEY); const saved = uni.getStorageSync(CONVERSATION_KEY);
@@ -16,12 +27,28 @@ try {
} }
export default { export default {
/**
* 获取uniacid
* @returns {number} uniacid
*/
getUniacid() {
return uni.getStorageSync('uniacid') || Config.uniacid; // 从缓存中获取uniacid,或使用默认uniacid
},
/** /**
* 发送普通消息(blocking 模式) * 发送普通消息(blocking 模式)
*/ */
async sendMessage(message, options = {}) { async sendMessage(message, options = {}) {
try { try {
// 调试:打印关键状态
console.log('[AI Service] sendMessage 开始执行');
console.log('[AI Service] store.state.memberInfo:', store.state.memberInfo);
console.log('[AI Service] uniacid:', this.getUniacid());
console.log('[AI Service] currentConversationId:', this.getConversationId());
const aiConfig = store.getters.globalAIKefuConfig; const aiConfig = store.getters.globalAIKefuConfig;
console.log('[AI Service] aiConfig:', aiConfig);
const params = { const params = {
url: '/api/kefu/chat', url: '/api/kefu/chat',
data: { data: {
@@ -31,28 +58,38 @@ export default {
query: message, query: message,
response_mode: 'blocking', // 强制 blocking response_mode: 'blocking', // 强制 blocking
user: store.state.memberInfo?.id || 'anonymous', user: store.state.memberInfo?.id || 'anonymous',
conversation_id: this.getConversationId() || '' conversation_id: this.getConversationId() || '',
...getDomainParams()
}, },
header: { header: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
} }
}; };
console.log('Sending blocking request to:', params.url); console.log('[AI Service] 发送请求到:', params.url);
console.log('Request data:', params.data); console.log('[AI Service] 请求参数:', JSON.stringify(params.data, null, 2));
const response = await http.sendRequest({ const response = await http.sendRequest({
...params, ...params,
async: false async: false
}); });
console.log('[AI Service] 收到响应:', response);
const result = this.handleResponse(response); const result = this.handleResponse(response);
if (result.conversationId) { if (result.conversationId) {
this.setConversationId(result.conversationId); this.setConversationId(result.conversationId);
} }
return result; return result;
} catch (error) { } catch (error) {
console.error('Dify API请求失败:', error); console.error('[AI Service] Dify API请求失败,详细错误:', error);
console.error('[AI Service] 错误堆栈:', error.stack);
// 打印更多信息帮助调试
console.error('[AI Service] store 状态:', {
memberInfo: store.state.memberInfo,
uniacid: this.getUniacid(),
token: store.state.token
});
throw new Error('AI服务暂时不可用,请稍后重试'); throw new Error('AI服务暂时不可用,请稍后重试');
} }
}, },
@@ -81,7 +118,7 @@ export default {
socketTask.send({ socketTask.send({
data: JSON.stringify({ data: JSON.stringify({
action: 'auth', action: 'auth',
uniacid: store.state.uniacid || '1', uniacid: this.getUniacid(),
token: store.state.token || 'test_token', token: store.state.token || 'test_token',
user_id: store.state.memberInfo?.id || 'anonymous' user_id: store.state.memberInfo?.id || 'anonymous'
}) })
@@ -99,10 +136,11 @@ export default {
socketTask.send({ socketTask.send({
data: JSON.stringify({ data: JSON.stringify({
action: 'chat', action: 'chat',
uniacid: store.state.uniacid || '1', uniacid: this.getUniacid(),
query: message, query: message,
user_id: store.state.memberInfo?.id || 'anonymous', user_id: store.state.memberInfo?.id || 'anonymous',
conversation_id: this.getConversationId() || '' conversation_id: this.getConversationId() || '',
...getDomainParams()
}) })
}); });
} else if (data.type === 'auth_failed') { } else if (data.type === 'auth_failed') {
@@ -179,12 +217,14 @@ export default {
'Accept': 'text/event-stream', 'Accept': 'text/event-stream',
}, },
body: JSON.stringify({ body: JSON.stringify({
uniacid: store.state.uniacid || '1', uniacid: this.getUniacid(),
token: store.state.token || 'test_token',
inputs: {}, inputs: {},
query: message, query: message,
response_mode: 'streaming', response_mode: 'streaming',
user_id: store.state.memberInfo?.id || 'anonymous', user_id: store.state.memberInfo?.id || 'anonymous',
conversation_id: this.getConversationId() || '' conversation_id: this.getConversationId() || '',
...getDomainParams()
}) })
}); });
@@ -318,17 +358,19 @@ export default {
* 生成新会话(如需) * 生成新会话(如需)
*/ */
async generateConversationId() { async generateConversationId() {
const params = { const params = {
url: '/api/kefu/createConversation', url: '/api/kefu/createConversation',
data: { data: {
uniacid: store.state.uniacid, uniacid: this.getUniacid(),
user_id: store.state.memberInfo?.id || 'anonymous', token: store.state.token || 'test_token',
member_id: store.state.memberInfo?.id || '', user_id: store.state.memberInfo?.id || 'anonymous',
}, member_id: store.state.memberInfo?.id || '',
header: { ...getDomainParams()
'Content-Type': 'application/json' },
} header: {
}; 'Content-Type': 'application/json'
}
};
const response = await http.sendRequest({ const response = await http.sendRequest({
...params, ...params,
async: false async: false
@@ -346,6 +388,7 @@ export default {
async: false, async: false,
data: {} data: {}
}); });
console.log('/api/kefu/health response', response);
const available = [response?.data?.status, response?.data?.components?.ai_service_config?.status] const available = [response?.data?.status, response?.data?.components?.ai_service_config?.status]
.filter(item => item === 'healthy').length > 0; .filter(item => item === 'healthy').length > 0;
return { return {
@@ -367,7 +410,10 @@ export default {
try { try {
const response = await http.sendRequest({ const response = await http.sendRequest({
url: '/api/kefu/clear-conversation', url: '/api/kefu/clear-conversation',
data: { conversation_id: conversationId }, data: {
conversation_id: conversationId,
...getDomainParams()
},
async: false async: false
}); });
return response.success; return response.success;
@@ -386,13 +432,14 @@ export default {
throw new Error('会话ID(conversation_id)是必填参数'); throw new Error('会话ID(conversation_id)是必填参数');
} }
const requestData = { const requestData = {
uniacid: params.uniacid || store.state.uniacid || '1', uniacid: params.uniacid || this.getUniacid(),
conversation_id: params.conversation_id, conversation_id: params.conversation_id,
user_id: params.user_id || store.state.memberInfo?.id || 'anonymous', user_id: params.user_id || store.state.memberInfo?.id || 'anonymous',
limit: params.limit || 20, limit: params.limit || 20,
offset: params.offset || 0, offset: params.offset || 0,
member_id: params.member_id || store.state.memberInfo?.id || '', member_id: params.member_id || store.state.memberInfo?.id || '',
token: params.token || '' token: params.token || '',
...getDomainParams()
}; };
const response = await http.sendRequest({ const response = await http.sendRequest({
url: '/api/kefu/getHistory', url: '/api/kefu/getHistory',
@@ -431,13 +478,15 @@ export default {
if (window.currentEventSource) { if (window.currentEventSource) {
window.currentEventSource.close(); window.currentEventSource.close();
} }
const params = new URLSearchParams({ const paramsObj = {
uniacid: store.state.uniacid || '1', uniacid: this.getUniacid(),
user_id: store.state.memberInfo?.id || '123456', user_id: store.state.memberInfo?.id,
query: message, query: message,
conversation_id: conversationId || '', conversation_id: conversationId || '',
stream: 'true' stream: 'true',
}); ...getDomainParams()
};
const params = new URLSearchParams(paramsObj);
const url = `${Config.baseUrl}/api/kefu/chat?${params.toString()}`; const url = `${Config.baseUrl}/api/kefu/chat?${params.toString()}`;
try { try {
const eventSource = new EventSource(url); const eventSource = new EventSource(url);

View File

@@ -214,7 +214,7 @@
<!-- 扩大按钮 --> <!-- 扩大按钮 -->
<button v-if="inputLineCount > 3" class="expand-btn" @click="openExpandEditor"> <button v-if="inputLineCount > 3" class="expand-btn" @click="openExpandEditor">
<text class="iconfont icon-expand">🔍</text> <text class="iconfont icon-expand">[ ]</text>
</button> </button>
<!-- Emoji按钮 --> <!-- Emoji按钮 -->
@@ -1146,11 +1146,8 @@ async loadChatHistoryIfExist() {
// 格式化时间 // 格式化时间
formatTime(timestamp) { formatTime(timestamp) {
console.log('【调试】formatTime 接收到的时间戳:', timestamp, typeof timestamp);
// 如果没有时间戳,就不显示时间 // 如果没有时间戳,就不显示时间
if (!timestamp) { if (!timestamp) {
console.warn('【调试】没有时间戳');
return ''; return '';
} }
@@ -1183,21 +1180,15 @@ async loadChatHistoryIfExist() {
date = new Date(timeValue); date = new Date(timeValue);
} }
console.log('【调试】最终 Date 对象:', date);
console.log('【调试】本地时间:', date.toLocaleString());
console.log('【调试】小时:', date.getHours());
console.log('【调试】分钟:', date.getMinutes());
// 如果时间无效,就不显示时间 // 如果时间无效,就不显示时间
if (isNaN(date.getTime())) { if (isNaN(date.getTime())) {
console.warn('【调试】时间无效:', timestamp);
return ''; return '';
} }
const hours = date.getHours().toString().padStart(2, '0'); const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0');
const result = hours + ':' + minutes; const result = hours + ':' + minutes;
console.log('【调试】最终显示时间:', result);
return result; return result;
}, },
@@ -3674,6 +3665,7 @@ $radius-lg: 36rpx;
border: none; border: none;
background-color: #f2f2f2; background-color: #f2f2f2;
padding: 0; padding: 0;
left:60rpx;
.iconfont { .iconfont {
font-size: 36rpx; font-size: 36rpx;