Skip to content

Commit ed34dc5

Browse files
committed
fix: Form submission cannot have a conversation
1 parent 86ecea8 commit ed34dc5

7 files changed

Lines changed: 162 additions & 160 deletions

File tree

โ€Žapps/chat/serializers/chat.pyโ€Ž

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
from models_provider.tools import get_model_instance_by_model_workspace_id
5959
from system_manage.models.chat_user_token_quota import ChatUserTokenQuota
6060

61-
# ใ€ŒChat ่กŒๅฐšๆœชๆŸฅ่ฏขใ€็š„ๅ“จๅ…ต๏ผŒๅŒบๅˆซไบŽใ€ŒๆŸฅ่ฏข่ฟ‡ไฝ†ไธๅญ˜ๅœจ(None)ใ€
6261
_CHAT_UNSET = object()
6362

6463

@@ -200,13 +199,10 @@ def ensure_chat_row(self, question, asker):
200199
self._chat_cache = chat
201200
return chat
202201

203-
def save_chat_record(self, chat_record_id, question, asker, new_record):
204-
"""ๆ’ๅ…ฅไธ€ๆกๅ ไฝ ChatRecord๏ผˆworkflow ๅฎŒๆˆๅŽ็”ฑ update_chat_record ๅ›žๅกซ๏ผ‰ใ€‚"""
205-
chat_id = self.data.get("chat_id")
206-
q_text = question.get("content", "") if isinstance(question, dict) else question
207-
self.ensure_chat_row(q_text, asker)
208-
defaults = {
209-
"chat_id": chat_id,
202+
def get_defaults_record(self, question):
203+
"""ๆž„้€ ไธ€ๆกๅ ไฝ ChatRecord ็š„ๅญ—ๆฎต๏ผˆworkflow ๅฎŒๆˆๅŽ็”ฑ update_chat_record ๅ›žๅกซ๏ผ‰ใ€‚"""
204+
return {
205+
"chat_id": self.data.get("chat_id"),
210206
"problem_text": "",
211207
"answer_text": "",
212208
"details": {},
@@ -222,12 +218,6 @@ def save_chat_record(self, chat_record_id, question, asker, new_record):
222218
"question": question,
223219
"messages": [],
224220
}
225-
if new_record:
226-
# ๅ…จๆ–ฐ่ฎฐๅฝ•๏ผš็›ดๆŽฅๆ’ๅ…ฅ๏ผŒ็œๆމ update_or_create ็š„ไธ€ๆฌก SELECT
227-
ChatRecord(id=chat_record_id, **defaults).save(force_insert=True)
228-
else:
229-
# Form ๆไบค / ้‡็ญ”๏ผšๅค็”จๅŒไธ€ chat_record_id
230-
QuerySet(ChatRecord).update_or_create(id=chat_record_id, defaults=defaults)
231221

232222
@staticmethod
233223
def _usage_from_context(workflow_context):
@@ -288,6 +278,9 @@ def chat_work_flow(self, application, instance: dict, base_to_response):
288278
workflow = new_instance(work_flow, WorkflowType.APPLICATION)
289279

290280
chat_record_id_str = str(uuid.uuid7()) if chat_record_id is None else str(chat_record_id)
281+
self.ensure_chat_row(message, chat_user)
282+
if chat_record_id is None:
283+
ChatRecord(id=chat_record_id_str, **self.get_defaults_record(message_dict)).save(force_insert=True)
291284

292285
parameters = {
293286
"history_chat_record": history_chat_record,
@@ -317,12 +310,10 @@ def chat_work_flow(self, application, instance: dict, base_to_response):
317310

318311
result_queue = queue.Queue()
319312
aggregation = AggregationManager()
320-
self.save_chat_record(chat_record_id_str, message_dict, chat_user, new_record=chat_record_id is None)
321313

322314
def on_next(wf_manage, content):
323315
aggregation.aggregate(content)
324316
block = content.to_dict()
325-
# ๆŒไน…ๅŒ–(resume)ไธŽ live ้˜Ÿๅˆ—้ƒฝๆ”พ่ฃธๅ†…ๅฎนๅ—๏ผŒๆ ผๅผๅŒ–็ปŸไธ€ไบค็ป™ๆถˆ่ดน็ซฏ็š„ base_to_response
326317
get_message_queue().produce(chat_record_id_str, block)
327318
result_queue.put(("chunk", block))
328319

@@ -337,9 +328,7 @@ def on_complete(wf_manage, error):
337328
)
338329
messages = aggregation.get_contents()
339330
self.update_chat_record(chat_user_id, chat_record_id_str, wf_manage.context, messages)
340-
# ่ฎกๆ•ฐ็ปŸ่ฎกๆ”พๅˆฐๅ†…ๅฎน่ฝๅบ“ไน‹ๅŽๅ†ๆ›ดๆ–ฐ๏ผˆๆŒชๅ‡บ่ฟ›ๅฏน่ฏๅ‰็š„ๅ…ณ้”ฎ่ทฏๅพ„๏ผ‰
341331
ChatCountSerializer(data={"chat_id": chat_id}).update_chat()
342-
# ๅฎš็จฟๅŽๆŠŠๆœฌ่ฝฎ่ฎฐๅฝ•่ฟฝๅŠ ่ฟ›ๅކๅฒ็ผ“ๅญ˜๏ผˆquestion ๅทฒๅœจๅปบๅ ไฝๆ—ถ็กฎๅฎš๏ผŒmessages ไธบ่šๅˆ็ป“ๆžœ๏ผ‰
343332
ChatHistory(chat_id).append(
344333
ChatRecord(
345334
id=chat_record_id_str,
@@ -403,7 +392,6 @@ def generate():
403392
yield "data: [DONE]\n\n"
404393
break
405394
if msg_type == "chunk":
406-
# data ๆ˜ฏ่ฃธๅ†…ๅฎนๅ—(content.to_dict())๏ผŒๆ ผๅผๅŒ–ไบค็ป™ base_to_response
407395
frame = base_to_response.to_stream(chat_id, chat_record_id_str, data)
408396
if frame is not None:
409397
yield "data: " + frame + "\n\n"

โ€Žapps/common/handle/impl/response/system_to_response.pyโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def to_stream(self, chat_id, chat_record_id, block: dict):
2323
{
2424
"chat_id": str(chat_id),
2525
"chat_record_id": str(chat_record_id),
26-
"content": [block],
26+
"content": [{**block, "chat_id": str(chat_id), "chat_record_id": str(chat_record_id)}],
2727
},
2828
ensure_ascii=False,
2929
)

โ€Žui/src/components/conversation/chat-panel/index.vueโ€Ž

Lines changed: 96 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@
236236
</template>
237237

238238
<script setup lang="ts">
239-
import { ref, computed, nextTick, watch, onMounted, reactive } from 'vue'
239+
import { ref, computed, nextTick, watch, onMounted, reactive, provide } from 'vue'
240240
import { CircleCloseFilled, Paperclip, Promotion, VideoPause } from '@element-plus/icons-vue'
241241
import ContentList from '../content-list/index.vue'
242242
import Loading from '../loading/index.vue'
@@ -364,10 +364,8 @@ const addFile = (file: File) => {
364364
365365
const uploadPromise = (async () => {
366366
try {
367-
let cid = currentChatId.value
368-
if (!cid) {
369-
cid = store.newChat()
370-
}
367+
// ๆƒฐๆ€งๅ–ๅฝ“ๅ‰ chat_id๏ผˆๅน‚็ญ‰๏ผ‰๏ผŒไฟ่ฏๆ–‡ไปถ source_id ไธŽๅŽ็ปญๅ‘้€็š„ chat_id ไธ€่‡ด
368+
const cid = store.getChatId()
371369
const result = await store.uploadFile(file, cid)
372370
item.url = result.url
373371
const parts = result.url.split('/')
@@ -446,19 +444,15 @@ const send = async () => {
446444
447445
const text = question.value.content.trim()
448446
449-
// ๆฒกๆœ‰ๅฝ“ๅ‰ๅฏน่ฏๆ—ถๆœฌๅœฐ็”Ÿๆˆ่‰็จฟ chat_id๏ผˆๅŽ็ซฏ้ฆ–ๅ‘ๆ—ถ open-if-missing๏ผ‰
450-
if (!currentChatId.value) {
451-
store.newChat()
452-
}
453-
454-
const cid = currentChatId.value
447+
// ๆƒฐๆ€งๅ– chat_id๏ผˆๆ— ๅˆ™ๅ‰็ซฏ็”Ÿๆˆ๏ผŒๅŽ็ซฏ้ฆ–ๅ‘ๆ—ถ open-if-missing๏ผ‰
448+
const cid = store.getChatId()
455449
456-
// ้ฆ–ๆกๆถˆๆฏ๏ผšไน่ง‚ๆ›ดๆ–ฐ่‰็จฟๆ ‡้ข˜๏ผ›่ฝๅบ“ไบค็ป™ๆต็ป“ๆŸๅŽ็š„ๅŽๅฐ renameChat
450+
// ้ฆ–ๆกๆถˆๆฏ๏ผšๆญคๅˆปๆ‰ๆŠŠไผš่ฏ push ่ฟ›ๅทฆไพงๅˆ—่กจ๏ผˆๆ–ฐๅปบๆ—ถไธ push๏ผ‰๏ผŒๆ ‡้ข˜็”จ question ๅ†…ๅฎนไน่ง‚ๆ›ดๆ–ฐ๏ผ›
451+
// ่ฝๅบ“ไบค็ป™ๆต็ป“ๆŸๅŽ็š„ๅŽๅฐ renameChatใ€‚
457452
const isFirstMessage = messages.value.length === 0
458453
const abstract = text.substring(0, 256)
459-
if (isFirstMessage && text) {
460-
const conv = store.conversations.value.find((c: any) => c.id === cid)
461-
if (conv) conv.abstract = abstract
454+
if (isFirstMessage && !store.conversations.value.some((c: any) => c.id === cid)) {
455+
store.conversations.value.unshift({ id: cid, abstract: text ? abstract : 'ๆ–ฐๅฏน่ฏ' })
462456
}
463457
464458
// ๅˆ†็ฑปๆ–‡ไปถ
@@ -478,54 +472,27 @@ const send = async () => {
478472
.filter((f) => !isImage(f.name) && !isDocument(f.name) && !isAudio(f.name) && !isVideo(f.name))
479473
.map((f) => ({ url: f.url, file_id: f.file_id, name: f.name }))
480474
481-
// ๆž„ๅปบ question content
475+
// ๆž„ๅปบ question content๏ผˆUSER ๆฐ”ๆณกๅฑ•็คบ็”จ๏ผ‰ไธŽ API message๏ผˆๅ‘ๅŽ็ซฏ็”จ๏ผ‰
482476
const questionContent: any = { type: 'QUESTION', content: text }
483-
if (images.length) questionContent.image_list = images
484-
if (documents.length) questionContent.document_list = documents
485-
if (audio.length) questionContent.audio_list = audio
486-
if (video.length) questionContent.video_list = video
487-
if (other.length) questionContent.other_list = other
488-
489-
store.pushMessage({
490-
role: 'USER',
491-
content: [questionContent],
492-
id: nanoid(),
493-
})
494-
495-
store.pushMessage(store.createAnswerMessage())
496-
const aiMsg = messages.value[messages.value.length - 1]
497-
if (!aiMsg) return
498-
499-
// ๆž„ๅปบ API payload
500477
const message: any = { content: text, type: 'QUESTION' }
501-
if (images.length) message.image_list = images
502-
if (documents.length) message.document_list = documents
503-
if (audio.length) message.audio_list = audio
504-
if (video.length) message.video_list = video
505-
if (other.length) message.other_list = other
506-
507-
const payload: any = { message, stream: true, re_chat: false }
508-
509-
loading.value = true
510-
store.startStream({
511-
cid,
512-
request: () => store.chat(cid, payload),
513-
onStream: (chunk) => {
514-
store.appendChunk(aiMsg, chunk)
515-
scrollToBottom()
516-
},
478+
if (images.length) questionContent.image_list = message.image_list = images
479+
if (documents.length) questionContent.document_list = message.document_list = documents
480+
if (audio.length) questionContent.audio_list = message.audio_list = audio
481+
if (video.length) questionContent.video_list = message.video_list = video
482+
if (other.length) questionContent.other_list = message.other_list = other
483+
484+
// ๅง”ๆ‰˜้€š็”จ sendMessage๏ผšๆ–ฐ้—ฎ็ญ”๏ผˆๆ–ฐๅขž USER ๆฐ”ๆณก + ๆ–ฐ answer ๆถˆๆฏ๏ผ‰๏ผŒ
485+
// ้ฆ–ๆกๆถˆๆฏ่ฝๅบ“ๅŽๆŠŠ็œŸๅฎžๆ ‡้ข˜ๅ†™ๅ›žๅŽ็ซฏไบค็ป™ onFinishใ€‚
486+
sendMessage({
487+
message,
488+
newQuestion: true,
489+
questionContent,
490+
reChat: false,
517491
onFinish: () => {
518-
scrollToBottom()
519-
loading.value = false
520-
// ้ฆ–ๆกๆถˆๆฏ่ฝๅบ“ๅŽ๏ผŒๆŠŠ็œŸๅฎžๆ ‡้ข˜ๅ†™ๅ›žๅŽ็ซฏ๏ผˆๆญคๆ—ถไผš่ฏๅทฒ่ขซ open-if-missing ๅปบๅฅฝ๏ผ‰
521492
if (isFirstMessage && text) {
522493
store.renameChat(cid, abstract).catch(() => {})
523494
}
524495
},
525-
onFailure: () => {
526-
scrollToBottom()
527-
loading.value = false
528-
},
529496
})
530497
question.value.content = ''
531498
clearFiles()
@@ -592,6 +559,79 @@ watch(
592559
},
593560
)
594561
562+
// ๆ–ฐๅปบ/ๅˆ‡ๆขไผš่ฏๆ—ถๆธ…็ฉบๆš‚ๅญ˜ๆ–‡ไปถไธŽ่พ“ๅ…ฅ๏ผŒ้ฟๅ…ๆ–‡ไปถ็š„ source_id ไธŽๆ–ฐ chat_id ๅฏนไธไธŠ
563+
watch(
564+
() => store.composerResetSignal.value,
565+
() => {
566+
clearFiles()
567+
question.value.content = ''
568+
},
569+
)
570+
571+
// โ”€โ”€ ้€š็”จๅ‘่ตทๅฏน่ฏ๏ผˆๆณจๅ…ฅ็ป™ๅ†…ๅฎน็ป„ไปถ๏ผ‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
572+
// ่กจๅ•ๆไบคใ€ไปฅๅŠๆœชๆฅไปปไฝ•โ€œ่ƒฝๅ‘่ตทๅฏน่ฏโ€็š„ๅ†…ๅฎน็ป„ไปถ้ƒฝ้€š่ฟ‡ๅฎƒๅ‘่ตท/็ปญ่ท‘ไธ€ๆฌกๅฏน่ฏใ€‚
573+
// ่ฐƒ็”จๆ–นๅช้œ€ๆ˜พๅผๅฃฐๆ˜Ž newQuestion๏ผšๆ˜ฏๅฆๆ–ฐๅขžไธ€ไธช question๏ผˆๆ–ฐ USER ๆฐ”ๆณก + ๆ–ฐ answer ๆถˆๆฏ๏ผ‰๏ผŒ
574+
// ๅฆๅˆ™็ปญ่ท‘่šๅˆๅ›žๅทฒๅญ˜ๅœจ็š„้‚ฃๆก assistant ๆถˆๆฏ๏ผˆๅŽ็ซฏๅค็”จๅŒไธ€ chat_record๏ผ‰ใ€‚
575+
interface SendMessageOptions {
576+
message: any // ๅŽ็ซฏ message dict {content,type,image_list?,...}
577+
newQuestion: boolean
578+
questionContent?: any // newQuestion=true ๆ—ถ USER ๆฐ”ๆณกๅฑ•็คบ็š„ content ้กน๏ผŒ็ผบ็œ็”จ message
579+
reChat?: boolean // ้ป˜่ฎค false๏ผ›ๆ–ฐๅผ•ๆ“Žไธ‹ไป…ๅฝฑๅ“็Ÿฅ่ฏ†่Š‚็‚นโ€œๆข็ญ”ๆกˆโ€ๅŽป้‡
580+
formData?: Record<string, any>
581+
position?: any
582+
chatRecordId?: string | null
583+
chunkId?: string | null
584+
onFinish?: () => void // ๆ”ถๅฐพ้’ฉๅญ๏ผˆๅฆ‚้ฆ–ๆกๆถˆๆฏ่ฝๅบ“ๆ”นๆ ‡้ข˜๏ผ‰๏ผŒๅœจๅ†…็ฝฎ็ป“ๆŸ้€ป่พ‘ๅŽ่ฐƒ็”จ
585+
onFailure?: () => void
586+
}
587+
588+
const sendMessage = (opts: SendMessageOptions) => {
589+
const cid = store.getChatId()
590+
591+
// ๅฎšไฝๆตๅผๅ†™ๅ…ฅ็›ฎๆ ‡ๆถˆๆฏ
592+
let target: any
593+
if (opts.newQuestion) {
594+
store.pushMessage({ role: 'USER', content: [opts.questionContent ?? opts.message], id: nanoid() })
595+
store.pushMessage(store.createAnswerMessage())
596+
target = messages.value[messages.value.length - 1]
597+
} else {
598+
// ็ปญ่ท‘๏ผšreload ๅŽๆŒ‰ `${chat_record_id}_ASSISTANT` ๅ‘ฝไธญ๏ผ›ๅฎžๆ—ถๆตไธญ answer ๆถˆๆฏ id ไธบ '' โ†’ ๅ›ž้€€ๆœ€ๅŽไธ€ๆก
599+
target =
600+
messages.value.find((m: any) => m.id === `${opts.chatRecordId}_ASSISTANT`) ||
601+
messages.value[messages.value.length - 1]
602+
}
603+
if (!target) return
604+
605+
const payload: any = { message: opts.message, stream: true, re_chat: opts.reChat ?? false }
606+
if (opts.formData) payload.form_data = opts.formData
607+
if (opts.position !== undefined) payload.position = opts.position
608+
if (opts.chatRecordId) payload.chat_record_id = opts.chatRecordId
609+
if (opts.chunkId) payload.chunk_id = opts.chunkId
610+
611+
loading.value = true
612+
store.startStream({
613+
cid,
614+
request: () => store.chat(cid, payload),
615+
onStream: (chunk: any) => {
616+
store.appendChunk(target, chunk)
617+
scrollToBottom()
618+
},
619+
onFinish: () => {
620+
target.write_ed = true
621+
loading.value = false
622+
scrollToBottom()
623+
opts.onFinish?.()
624+
},
625+
onFailure: () => {
626+
target.write_ed = true
627+
loading.value = false
628+
opts.onFailure?.()
629+
},
630+
})
631+
}
632+
633+
provide('sendMessage', sendMessage)
634+
595635
defineExpose({ scrollToBottom })
596636
</script>
597637

โ€Žui/src/components/conversation/common/use-chat-store/chat/index.tsโ€Ž

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import type { ChatMessage } from '../../types'
1010
// โ”€โ”€ ๅ…ฑไบซ็Šถๆ€๏ผˆๅ•ไพ‹๏ผ‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
1111
const appInfo = ref<{ name: string; icon: string } | null>(null)
1212
const currentChatId = ref('')
13+
// composer ้‡็ฝฎไฟกๅท๏ผšๆ–ฐๅปบ/ๅˆ‡ๆขไผš่ฏๆ—ถ่‡ชๅขž๏ผŒchat-panel ็›‘ๅฌๅŽๆธ…็ฉบๆš‚ๅญ˜ๆ–‡ไปถไธŽ่พ“ๅ…ฅ๏ผŒ
14+
// ้ฟๅ…ไธŠไผ ๆ–‡ไปถ๏ผˆsource_id ็ป‘ๆ—ง chat_id๏ผ‰ๅœจๅˆ‡ไธŠไธ‹ๆ–‡ๅŽไธŽๆ–ฐ chat_id ๅฏนไธไธŠใ€‚
15+
const composerResetSignal = ref(0)
1316

1417
// โ”€โ”€ ไผš่ฏ CRUD โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
1518
const { conversations, loadConversations, loadMore } = useConversationCrud({
@@ -78,16 +81,13 @@ export function useChatStore() {
7881
})
7982

8083
// โ”€โ”€ ไผš่ฏๆ“ไฝœ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
81-
// ๆœฌๅœฐๆ–ฐๅปบ๏ผšๅ‰็ซฏ็›ดๆŽฅ็”Ÿๆˆ chat_id๏ผˆ่‰็จฟ๏ผ‰๏ผŒไธ้ข„ๅ…ˆ่ฏทๆฑ‚ๅŽ็ซฏ open๏ผ›
82-
// ้ฆ–ๆฌกๅ‘ๆถˆๆฏ / ไธŠไผ ๆ—ถๅŽ็ซฏไผšๆŒ‰่ฏฅ id ็Žฐๅผ€ไผš่ฏ๏ผˆopen-if-missing๏ผ‰ใ€‚
83-
const newChat = (): string => {
84-
const id = crypto.randomUUID()
85-
currentChatId.value = id
86-
resetMsgState()
87-
if (!conversations.value.some((c) => c.id === id)) {
88-
conversations.value.unshift({ id, abstract: 'ๆ–ฐๅปบๅฏน่ฏ' })
89-
}
90-
return id
84+
// ๆƒฐๆ€ง่Žทๅ–ๅฝ“ๅ‰ chat_id๏ผšๅทฒๆœ‰ๅˆ™ๅŽŸๆ ท่ฟ”ๅ›ž๏ผ›ไธบ็ฉบๆ‰ๅ‰็ซฏ็”Ÿๆˆไธ€ไธชๅนถ่ต‹ๅ€ผใ€‚
85+
// ๅน‚็ญ‰โ€”โ€”ๅๅค่ฐƒ็”จ่ฟ”ๅ›žๅŒไธ€ไธช id๏ผŒไปŽ่€ŒไธŠไผ ๆ–‡ไปถ็š„ source_id ไธŽๅŽ็ปญๅ‘้€็š„ chat_id ๅง‹็ปˆไธ€่‡ดใ€‚
86+
// ไธ่ฏทๆฑ‚ๅŽ็ซฏ open๏ผŒไธๅพ€ๅทฆไพงๅˆ—่กจ push๏ผˆ็›ดๅˆฐ้ฆ–ๆฌกๅ‘ๆถˆๆฏๆ‰ๅ…ฅๅˆ—่กจ๏ผŒ่ง chat-panel send๏ผ‰ใ€‚
87+
const getChatId = (): string => {
88+
if (currentChatId.value) return currentChatId.value
89+
currentChatId.value = crypto.randomUUID()
90+
return currentChatId.value
9191
}
9292

9393
const openChat = async (appId?: string) => {
@@ -114,26 +114,6 @@ export function useChatStore() {
114114
return { url: res, name: file.name }
115115
}
116116

117-
// โ”€โ”€ ๅ‘้€ๆถˆๆฏ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
118-
const sendMessage = (cid: string, payload: any, aiMsg: ChatMessage) => {
119-
loading.value = true
120-
streamManager.startStream({
121-
cid,
122-
request: () => chat(cid, payload),
123-
onStream: (chunk) => {
124-
appendChunk(aiMsg, chunk)
125-
},
126-
onFinish: () => {
127-
aiMsg.write_ed = true
128-
loading.value = false
129-
},
130-
onFailure: () => {
131-
aiMsg.write_ed = true
132-
loading.value = false
133-
}
134-
})
135-
}
136-
137117
// โ”€โ”€ ๅˆ‡ๆขๅฏน่ฏ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
138118
const switchConversation = async (cid: string) => {
139119
await streamManager.switchConversation({
@@ -169,7 +149,7 @@ export function useChatStore() {
169149
// ไผš่ฏ
170150
loadConversations,
171151
loadMore,
172-
newChat,
152+
getChatId,
173153
openChat,
174154
deleteChat,
175155
renameChat,
@@ -183,13 +163,17 @@ export function useChatStore() {
183163
appendChunk,
184164
// ๆตๅผ
185165
chat,
186-
sendMessage,
187166
startStream: streamManager.startStream,
188167
switchConversation,
189168
closeStream: streamManager.closeStream,
190169
stopWorkflow: (cid: string) => streamManager.stopWorkflow(cid, 'chat'),
191170
cancelWorkflow: (cid: string) => streamManager.cancelWorkflow(cid, 'chat'),
192171
// ๆ–‡ไปถ
193172
uploadFile,
173+
// composer ้‡็ฝฎ
174+
composerResetSignal,
175+
resetComposer: () => {
176+
composerResetSignal.value++
177+
},
194178
}
195179
}

0 commit comments

Comments
ย (0)