Skip to content

Commit 1550861

Browse files
committed
fix:兼容AI返回不同数据
1 parent aa2d54e commit 1550861

5 files changed

Lines changed: 80 additions & 496 deletions

File tree

mockServer/src/mock/get/app-center/v1/apps/schema/1.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1722,6 +1722,13 @@
17221722
}
17231723
],
17241724
"componentsMap": [
1725+
{
1726+
"componentName": "TinyNavMenu",
1727+
"package": "@opentiny/vue",
1728+
"exportName": "NavMenu",
1729+
"destructuring": true,
1730+
"version": "0.1.16"
1731+
},
17251732
{
17261733
"componentName": "TinyCarouselItem",
17271734
"package": "@opentiny/vue",

packages/canvas/render/src/data-function/parser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ export const generateFn = (innerFn, context?) => {
166166
}
167167

168168
// 这里注意如果innerFn返回的是一个promise则需要捕获异常,重新返回默认一条空数据
169-
if (result.then && typeof result.then === 'function') {
169+
if (result?.then && typeof result.then === 'function') {
170170
result = new Promise((resolve) => {
171171
result.then(resolve).catch((error) => {
172172
globalNotify({

packages/plugins/robot/src/Main.vue

Lines changed: 48 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
</template>
7474
</tr-container>
7575
<tiny-dialog-box v-model:visible="showPreview" title="当前AI渲染效果" width="80%">
76-
<schema-renderer :schema="currentSchema"></schema-renderer>
76+
<schema-renderer v-if="showPreview" :schema="currentSchema"></schema-renderer>
7777
</tiny-dialog-box>
7878
</div>
7979
</Teleport>
@@ -93,7 +93,6 @@ import {
9393
TrFeedback,
9494
TrAttachments
9595
} from '@opentiny/tiny-robot'
96-
import type { BubbleRoleConfig } from '@opentiny/tiny-robot'
9796
import { IconNewSession } from '@opentiny/tiny-robot-svgs'
9897
import SchemaRenderer from '@opentiny/tiny-schema-renderer'
9998
import RobotSettingPopover from './RobotSettingPopover.vue'
@@ -211,7 +210,6 @@ export default {
211210
...currentSchema.value,
212211
componentName: pageState.pageSchema.componentName
213212
}
214-
215213
importSchema(value)
216214
setSaved(false)
217215
showPreview.value = false
@@ -254,26 +252,18 @@ export default {
254252
const regex = /```json([\s\S]*?)```/
255253
const match = chatMessage?.content.match(regex)
256254
257-
if (match && match[1]) {
258-
// const jsonContent = match[1].trim().replace(
259-
// /(\s*)([a-zA-Z0-9_]+)(\s*):/g, // 匹配 key:
260-
// '$1"$2"$3:' // 替换成 "key":
261-
// )
262-
const jsonContent = chatMessage?.content.replace(/^```json|```$/g, '').trim()
263-
const newValue = JSON.parse(jsonContent).map((op) => fixedJson(op))
264-
265-
if (newValue && isValidFastJsonPatch(newValue)) {
266-
// 使用 applyPatch 修改 Schema
267-
const result = newValue.reduce(jsonpatch.applyReducer, pageState.pageSchema)
268-
269-
sessionProcess.messages.push(
270-
getAiRespMessage(JSON.stringify(pageState.pageSchema, null, 2), chatMessage.role)
271-
)
272-
sessionProcess.displayMessages.push(getAiDisplayMessage(MESSAGE_TIP, chatMessage.role, result, res.id))
273-
messages.value[messages.value.length - 1].content = MESSAGE_TIP
274-
messages.value[messages.value.length - 1].schema = result
275-
messages.value[messages.value.length - 1].id = res.id
276-
}
255+
if (match && match[1] && JSON.parse(match[1]) && isValidFastJsonPatch(JSON.parse(match[1]))) {
256+
const newValue = JSON.parse(match[1])
257+
// 使用 applyPatch 修改 Schema
258+
const result = newValue.reduce(jsonpatch.applyReducer, pageState.pageSchema)
259+
260+
sessionProcess.messages.push(
261+
getAiRespMessage(JSON.stringify(pageState.pageSchema, null, 2), chatMessage.role)
262+
)
263+
sessionProcess.displayMessages.push(getAiDisplayMessage(MESSAGE_TIP, chatMessage.role, result, res.id))
264+
messages.value[messages.value.length - 1].content = MESSAGE_TIP
265+
messages.value[messages.value.length - 1].schema = result
266+
messages.value[messages.value.length - 1].id = res.id
277267
} else {
278268
sessionProcess.messages.push(getAiRespMessage(chatMessage?.content))
279269
sessionProcess.displayMessages.push(getAiRespMessage(chatMessage?.content))
@@ -523,7 +513,7 @@ export default {
523513
},
524514
actions: [
525515
{ name: 'preview', label: '预览', icon: previewIcon },
526-
{ name: 'run', label: '运行', icon: saveIcon }
516+
{ name: 'run', label: '应用', icon: saveIcon }
527517
],
528518
onAction(name) {
529519
currentSchema.value = getItemSchema(bubbleProps)?.schema || {}
@@ -542,10 +532,10 @@ export default {
542532
})
543533
544534
// 处理文件选择事件
545-
const handleSingleFilesSelected = (files: FileList | null) => {
546-
if (!files.length) return
535+
const handleSingleFilesSelected = (files: FileList | null, retry = false) => {
536+
if (!files.length && !retry) return
547537
548-
if (files && files.length > 1) {
538+
if (files && files.length > 1 && !retry) {
549539
Notify({
550540
type: 'error',
551541
message: '当前仅支持上传一张图片',
@@ -555,7 +545,7 @@ export default {
555545
return
556546
}
557547
558-
if (files && files.length > 0) {
548+
if (files && files.length > 0 && !retry) {
559549
// 将选中的文件转换为 Attachment 格式并添加到附件列表
560550
const newAttachments = Array.from(files).map((file, index) => ({
561551
uid: `${Date.now()}-${index}`,
@@ -567,38 +557,38 @@ export default {
567557
messageType: 'uploading',
568558
file: file
569559
}))
570-
571560
singleAttachmentItems.value.push(...newAttachments)
561+
}
572562
573-
// 开始上传
574-
const formData = new FormData()
575-
formData.append('modelName', String(sessionProcess.foundationModel.model))
576-
formData.append('apiKey', String(sessionProcess.foundationModel.apiKey))
577-
formData.append('file', files[0])
563+
// 开始上传
564+
const formData = new FormData()
565+
const fileData = retry ? files : files[0]
566+
formData.append('modelName', String(sessionProcess.foundationModel.model))
567+
formData.append('apiKey', String(sessionProcess.foundationModel.apiKey))
568+
formData.append('file', fileData)
578569
579-
try {
580-
getMetaApi(META_SERVICE.Http)
581-
.post('/app-center/api/ai/uploadFile', formData, {
582-
headers: {
583-
'Content-Type': 'multipart/form-data'
584-
}
585-
})
586-
.then((res) => {
587-
if (res?.url) {
588-
imageUrl.value = res.url
589-
singleAttachmentItems.value[0].status = 'done'
590-
singleAttachmentItems.value[0].isUploading = false
591-
singleAttachmentItems.value[0].messageType = 'success'
592-
} else {
593-
imageUrl.value = ''
594-
singleAttachmentItems.value[0].status = 'error'
595-
singleAttachmentItems.value[0].isUploading = false
596-
singleAttachmentItems.value[0].messageType = 'error'
597-
}
598-
})
599-
} catch (error) {
600-
console.error('上传失败', error)
601-
}
570+
try {
571+
getMetaApi(META_SERVICE.Http)
572+
.post('/app-center/api/ai/uploadFile', formData, {
573+
headers: {
574+
'Content-Type': 'multipart/form-data'
575+
}
576+
})
577+
.then((res) => {
578+
if (res?.url) {
579+
imageUrl.value = res.url
580+
singleAttachmentItems.value[0].status = 'done'
581+
singleAttachmentItems.value[0].isUploading = false
582+
singleAttachmentItems.value[0].messageType = 'success'
583+
} else {
584+
imageUrl.value = ''
585+
singleAttachmentItems.value[0].status = 'error'
586+
singleAttachmentItems.value[0].isUploading = false
587+
singleAttachmentItems.value[0].messageType = 'error'
588+
}
589+
})
590+
} catch (error) {
591+
console.error('上传失败', error)
602592
}
603593
}
604594
@@ -607,7 +597,7 @@ export default {
607597
}
608598
609599
const handleSingleFileRetry = (file) => {
610-
handleSingleFilesSelected([file])
600+
handleSingleFilesSelected(file, true)
611601
}
612602
613603
return {

0 commit comments

Comments
 (0)