This commit is contained in:
2026-04-20 12:40:24 -04:00
parent 2e7789df63
commit fbd1728aee
4 changed files with 59 additions and 15 deletions

View File

@@ -20,6 +20,7 @@ import { useClipboard } from '../composables/useClipboard';
const settings = useSettingsStore();
const { activeCopyId, copyWithFeedback } = useClipboard();
interface TranslationChunkEvent { request_id: string; chunk: string; }
// UI States
const searchQuery = ref('');
@@ -101,6 +102,7 @@ const myInput = ref('');
const partnerInput = ref('');
const isTranslating = ref(false);
const currentStreamingMessageId = ref<string | null>(null);
const activeStreamRequestId = ref<string | null>(null);
// Dropdowns
const myToneDropdownOpen = ref(false);
@@ -115,10 +117,14 @@ const handleCreateSession = () => {
let unlisten: (() => void) | null = null;
onMounted(async () => {
unlisten = await listen<string>('translation-chunk', (event) => {
if (activeSession.value && currentStreamingMessageId.value) {
unlisten = await listen<TranslationChunkEvent>('translation-chunk', (event) => {
if (
activeSession.value &&
currentStreamingMessageId.value &&
event.payload.request_id === activeStreamRequestId.value
) {
settings.updateChatMessage(activeSession.value.id, currentStreamingMessageId.value, {
translated: (activeSession.value.messages.find(m => m.id === currentStreamingMessageId.value)?.translated || '') + event.payload
translated: (activeSession.value.messages.find(m => m.id === currentStreamingMessageId.value)?.translated || '') + event.payload.chunk
});
// 优化:只有当正在流式输出的消息是最后一条时,才自动滚动到底部
@@ -207,14 +213,17 @@ const translateMessage = async (sender: 'me' | 'partner', retranslateId?: string
],
stream: settings.enableStreaming
};
const requestId = crypto.randomUUID();
settings.addLog('request', { type: retranslateId ? 'conversation-retranslate' : 'conversation', ...requestBody }, generateCurl(settings.apiBaseUrl, settings.apiKey, requestBody));
try {
if (settings.enableStreaming) activeStreamRequestId.value = requestId;
const response = await invoke<string>('translate', {
apiAddress: settings.apiBaseUrl,
apiKey: settings.apiKey,
payload: requestBody
payload: requestBody,
requestId
});
if (!settings.enableStreaming) {
@@ -232,6 +241,7 @@ const translateMessage = async (sender: 'me' | 'partner', retranslateId?: string
} finally {
isTranslating.value = false;
currentStreamingMessageId.value = null;
activeStreamRequestId.value = null;
// 只有新消息才滚动到底部
if (!retranslateId) {
@@ -317,6 +327,7 @@ const evaluateMessage = async (messageId: string, force = false) => {
],
stream: false
};
const requestId = crypto.randomUUID();
settings.addLog('request', { type: 'conversation-eval', ...requestBody }, generateCurl(evalApiBaseUrl, evalApiKey, requestBody));
@@ -324,7 +335,8 @@ const evaluateMessage = async (messageId: string, force = false) => {
const response = await invoke<string>('translate', {
apiAddress: evalApiBaseUrl,
apiKey: evalApiKey,
payload: requestBody
payload: requestBody,
requestId
});
const fullResponseJson = JSON.parse(response);
settings.addLog('response', fullResponseJson);
@@ -358,6 +370,7 @@ const refineMessage = async (messageId: string) => {
if (selectedSuggestions.length === 0) return;
const suggestionsText = selectedSuggestions.map((s: any) => `- ${s.text}`).join('\n');
const currentTranslation = msg.translated;
isAuditModalOpen.value = false; // 关闭弹窗开始润色
settings.updateChatMessage(activeSession.value.id, messageId, { isRefining: true, translated: '' });
@@ -415,18 +428,21 @@ const refineMessage = async (messageId: string) => {
model: refineModelName,
messages: [
{ role: "system", content: systemPrompt },
{ role: "user", content: `[Source Text]\n${msg.original}\n\n[Current Translation]\n${msg.translated}\n\n[Suggestions]\n${suggestionsText}` }
{ role: "user", content: `[Source Text]\n${msg.original}\n\n[Current Translation]\n${currentTranslation}\n\n[Suggestions]\n${suggestionsText}` }
],
stream: settings.enableStreaming
};
const requestId = crypto.randomUUID();
settings.addLog('request', { type: 'conversation-refine', ...requestBody }, generateCurl(refineApiBaseUrl, refineApiKey, requestBody));
try {
if (settings.enableStreaming) activeStreamRequestId.value = requestId;
const response = await invoke<string>('translate', {
apiAddress: refineApiBaseUrl,
apiKey: refineApiKey,
payload: requestBody
payload: requestBody,
requestId
});
if (!settings.enableStreaming) {
@@ -442,6 +458,7 @@ const refineMessage = async (messageId: string) => {
} finally {
settings.updateChatMessage(activeSession.value.id, messageId, { isRefining: false, evaluation: undefined });
currentStreamingMessageId.value = null;
activeStreamRequestId.value = null;
// 只有当润色的是最后一条消息时才滚动到底部
const lastMsg = activeSession.value.messages[activeSession.value.messages.length - 1];