@fv-ui/ai-chat 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -437,6 +437,8 @@ Markdown 渲染(Sanitized by DOMPurify),内置 Prism 代码高亮与 KaTeX。
437
437
  | title | string | '' | 顶栏标题(同时作空态欢迎页名称) |
438
438
  | showHeader | boolean | false | 显示顶栏(标题 + 模型选择器;models 多选选择器在顶栏内,需开启才可见) |
439
439
  | centerWelcome | boolean | true | 空态居中:未开始对话时欢迎内容与输入区整体垂直居中,首条消息后输入区恢复固定底部 |
440
+ | showUserAvatar | boolean | true | 显示用户头像(false 时用户消息不渲染头像;助手头像不受影响) |
441
+ | showUserName | boolean | true | 显示用户名称(false 时用户消息不渲染头部名称行;助手名称不受影响) |
440
442
  | placeholder | string | '' | 输入框占位 |
441
443
  | senderShadow | boolean | true | 输入区阴影效果(透传 Sender 的 shadow) |
442
444
  | suggestions | AiChatSuggestion[] | [] | 空态建议列表(Prompts 项,key 必填) |
@@ -489,6 +491,8 @@ Markdown 渲染(Sanitized by DOMPurify),内置 Prism 代码高亮与 KaTeX。
489
491
  | scrollThreshold | number | 40 | 吸底阈值(px):距底不超过该值才自动跟随 |
490
492
  | showActions | boolean | true | 显示消息操作按钮(复制/重生成) |
491
493
  | showBranchSwitch | boolean | true | 显示分支切换器 |
494
+ | showUserAvatar | boolean | true | 显示用户头像(助手头像不受影响) |
495
+ | showUserName | boolean | true | 显示用户名称(助手名称不受影响) |
492
496
 
493
497
  | Event | 说明 |
494
498
  | --- | --- |
@@ -499,6 +503,10 @@ Markdown 渲染(Sanitized by DOMPurify),内置 Prism 代码高亮与 KaTeX。
499
503
  | empty | 覆盖空态整区 |
500
504
  | message-avatar / message-actions | 透传给每条 AiMessage |
501
505
 
506
+ | CSS 变量 | 默认 | 说明 |
507
+ | --- | --- | --- |
508
+ | --fv-messages-max-width | none | 滚动内容最大宽度;超出部分左右居中(内层 `.fv-messages-inner`,配合 `margin: 0 auto`) |
509
+
502
510
  | Ref | 说明 |
503
511
  | --- | --- |
504
512
  | scrollToBottom(smooth?) / scrollToTop() | 滚动控制 |
@@ -513,6 +521,10 @@ Markdown 渲染(Sanitized by DOMPurify),内置 Prism 代码高亮与 KaTeX。
513
521
  | branch | AiMessageBranchInfo | undefined | 分支元数据 { count, index };缺省视为单分支 |
514
522
  | showActions | boolean | true | 显示复制/重生成(仅 assistant) |
515
523
  | showBranchSwitch | boolean | true | 显示分支切换器(branch.count > 1 时) |
524
+ | showUserAvatar | boolean | true | 显示用户头像(false 时用户消息不渲染头像块) |
525
+ | showUserName | boolean | true | 显示用户名称(false 时用户消息不渲染头部名称行) |
526
+
527
+ > 用户消息操作区:恒渲染复制按钮,默认透明,鼠标移上消息(或键盘聚焦)时浮现(open-webui 交互)。
516
528
  | autoCollapse | boolean | true | Thinking autoCollapse 透传 |
517
529
 
518
530
  | Event | 说明 |
package/dist/index.d.ts CHANGED
@@ -1474,6 +1474,10 @@ type __VLS_Props$3 = {
1474
1474
  showActions?: boolean;
1475
1475
  /** 显示分支切换器 */
1476
1476
  showBranchSwitch?: boolean;
1477
+ /** 显示用户头像(助手头像不受影响) */
1478
+ showUserAvatar?: boolean;
1479
+ /** 显示用户名称(助手名称不受影响) */
1480
+ showUserName?: boolean;
1477
1481
  };
1478
1482
  declare function scrollToBottom(smooth?: boolean): void;
1479
1483
  /** 回到顶部:与 scrollToBottom 同款 try/catch 回落(happy-dom 旧版 scrollTo(options) 可能缺实现) */
@@ -1512,6 +1516,8 @@ declare const __VLS_base$2: vue.DefineComponent<__VLS_Props$3, {
1512
1516
  description: string;
1513
1517
  showActions: boolean;
1514
1518
  showBranchSwitch: boolean;
1519
+ showUserAvatar: boolean;
1520
+ showUserName: boolean;
1515
1521
  suggestions: AiMessagesSuggestion[];
1516
1522
  suggestionsTitle: string;
1517
1523
  scrollThreshold: number;
@@ -1555,6 +1561,10 @@ type __VLS_Props$2 = {
1555
1561
  showHeader?: boolean;
1556
1562
  /** 空态居中:未开始对话时欢迎内容与输入区整体垂直居中,首条消息后恢复输入区固定底部 */
1557
1563
  centerWelcome?: boolean;
1564
+ /** 显示用户头像(false 时用户消息不渲染头像;助手头像不受影响) */
1565
+ showUserAvatar?: boolean;
1566
+ /** 显示用户名称(false 时用户消息不渲染头部名称行;助手名称不受影响) */
1567
+ showUserName?: boolean;
1558
1568
  /** 输入框占位 */
1559
1569
  placeholder?: string;
1560
1570
  /** 输入区阴影效果(透传 Sender;关闭传 false) */
@@ -1640,6 +1650,8 @@ declare const __VLS_base$1: vue.DefineComponent<__VLS_Props$2, {
1640
1650
  apiKey: string;
1641
1651
  model: string;
1642
1652
  messages: MessageNode[];
1653
+ showUserAvatar: boolean;
1654
+ showUserName: boolean;
1643
1655
  suggestions: AiChatSuggestion[];
1644
1656
  models: string[];
1645
1657
  adapter: ChatAdapter;
@@ -1676,6 +1688,10 @@ type __VLS_Props$1 = {
1676
1688
  showActions?: boolean;
1677
1689
  /** 显示分支切换器(branch.count > 1 时) */
1678
1690
  showBranchSwitch?: boolean;
1691
+ /** 显示用户头像(false 时用户消息不渲染头像块;助手侧不受影响) */
1692
+ showUserAvatar?: boolean;
1693
+ /** 显示用户名称(false 时用户消息不渲染头部名称行;助手侧不受影响) */
1694
+ showUserName?: boolean;
1679
1695
  /** Thinking autoCollapse 透传 */
1680
1696
  autoCollapse?: boolean;
1681
1697
  };
@@ -1711,6 +1727,8 @@ declare const __VLS_base: vue.DefineComponent<__VLS_Props$1, {
1711
1727
  branch: AiMessageBranchInfo;
1712
1728
  showActions: boolean;
1713
1729
  showBranchSwitch: boolean;
1730
+ showUserAvatar: boolean;
1731
+ showUserName: boolean;
1714
1732
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
1715
1733
  declare const __VLS_export$1: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
1716
1734
  declare const _default$1: typeof __VLS_export$1;
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .fv-xmarkdown{color:var(--el-text-color-primary,#303133);line-height:1.7;word-break:break-word}.fv-xmarkdown h1,.fv-xmarkdown h2,.fv-xmarkdown h3,.fv-xmarkdown h4,.fv-xmarkdown h5,.fv-xmarkdown h6{color:var(--el-text-color-primary,#303133);font-weight:600;margin:1em 0 .5em}.fv-xmarkdown h1{font-size:1.5em}.fv-xmarkdown h2{font-size:1.3em}.fv-xmarkdown h3{font-size:1.15em}.fv-xmarkdown p{margin:.5em 0}.fv-xmarkdown a{color:var(--el-color-primary,#409eff);text-decoration:none}.fv-xmarkdown a:hover{text-decoration:underline}.fv-xmarkdown blockquote{border-left:4px solid var(--el-border-color,#dcdfe6);color:var(--el-text-color-regular,#606266);margin:.5em 0;padding:.4em 1em}.fv-xmarkdown blockquote,.fv-xmarkdown code{background:var(--el-fill-color-light,#f5f7fa)}.fv-xmarkdown code{border-radius:3px;color:var(--el-color-danger,#f56c6c);font-family:JetBrains Mono,Consolas,Courier New,monospace;font-size:.9em;padding:.15em .4em}.fv-xmarkdown pre{background:#282c34;border-radius:6px;margin:.5em 0;overflow-x:auto;padding:1em}.fv-xmarkdown pre code{background:transparent;color:#dcdfe6;font-size:.9em;line-height:1.6;padding:0}.fv-xmarkdown table{border-collapse:collapse;margin:.5em 0;width:100%}.fv-xmarkdown table td,.fv-xmarkdown table th{border:1px solid var(--el-border-color-lighter,#ebeef5);padding:.5em .8em;text-align:left}.fv-xmarkdown table th{background:var(--el-fill-color-light,#f5f7fa);font-weight:600}.fv-xmarkdown table tr:nth-child(2n) td{background:var(--el-fill-color-blank,#fafcff)}.fv-xmarkdown .katex-display{margin:.5em 0;overflow-x:auto}.fv-typewriter{display:inline-block;max-width:100%;position:relative}.fv-typewriter .fv-typewriter-text{white-space:pre-wrap;word-break:break-word}.fv-typewriter .fv-typewriter-suffix{animation:fv-typewriter-blink 1s step-start infinite;display:inline-block}.fv-typewriter .fv-typewriter-fog{animation:fv-typewriter-fog-in .3s ease-out both;background:linear-gradient(90deg,transparent,var(--fv-typewriter-fog-color,var(--el-bg-color,#fff)));bottom:0;pointer-events:none;position:absolute;right:0;top:0}@keyframes fv-typewriter-blink{0%,to{opacity:1}50%{opacity:0}}@keyframes fv-typewriter-fog-in{0%{opacity:0}to{opacity:1}}.fv-bubble{align-items:flex-start;display:flex;gap:var(--fv-bubble-avatar-gap,12px)}.fv-bubble.is-end{flex-direction:row-reverse;justify-content:flex-end}.fv-bubble.is-end .fv-bubble-main{align-items:flex-end}.fv-bubble .fv-bubble-avatar{display:flex;flex-shrink:0}.fv-bubble .fv-bubble-avatar .el-avatar{height:var(--fv-bubble-avatar-size,36px);width:var(--fv-bubble-avatar-size,36px)}.fv-bubble .fv-bubble-main{align-items:flex-start;display:flex;flex:1;flex-direction:column;max-width:100%;min-width:0}.fv-bubble .fv-bubble-main .fv-bubble-footer,.fv-bubble .fv-bubble-main .fv-bubble-header{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-base,14px);line-height:var(--el-font-line-height-primary,24px)}.fv-bubble .fv-bubble-main .fv-bubble-footer{margin-top:4px}.fv-bubble .fv-bubble-content{border-radius:calc(var(--el-border-radius-base, 4px) + 4px);box-sizing:border-box;color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-base,14px);line-height:var(--el-font-line-height-primary,24px);max-width:100%;min-width:0;padding:var(--el-main-padding,12px) calc(var(--el-main-padding, 12px) + 4px);position:relative;word-break:break-word}.fv-bubble .fv-bubble-content.no-padding{padding:0}.fv-bubble .fv-bubble-content .fv-bubble-text{white-space:pre-wrap}.fv-bubble.shape-round .fv-bubble-content{border-radius:var(--el-border-radius-round,20px)}.fv-bubble.shape-corner .fv-bubble-content{border-start-start-radius:calc(var(--el-border-radius-base, 4px) - 2px)}.fv-bubble.is-end.shape-corner .fv-bubble-content{border-start-end-radius:calc(var(--el-border-radius-base, 4px) - 2px);border-start-start-radius:calc(var(--el-border-radius-base, 4px) + 4px)}.fv-bubble.variant-borderless .fv-bubble-content,.fv-bubble.variant-filled .fv-bubble-content{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-bubble.variant-borderless .fv-bubble-content,.fv-bubble.variant-outlined .fv-bubble-content{border:var(--el-border-width,1px) solid var(--el-border-color,#dcdfe6)}.fv-bubble.variant-outlined .fv-bubble-content{background:none}.fv-bubble.variant-shadow .fv-bubble-content{background:none;box-shadow:var(--el-box-shadow-light,0 0 12px rgba(0,0,0,.12))}.fv-bubble .fv-bubble-content.no-style{background:transparent;border:none;box-shadow:none;padding:0}.fv-bubble .fv-bubble-loading{align-items:center;display:flex;gap:5px;min-height:1em;width:fit-content}.fv-bubble .fv-bubble-loading .fv-bubble-loading-dot{animation:fv-bubble-wave 1s ease-in-out infinite;background-color:var(--el-color-primary,#409eff);border-radius:50%;height:5px;width:5px}@keyframes fv-bubble-wave{0%,to{transform:translateY(-2px)}50%{transform:translateY(2px)}}.fv-bubble-list{display:flex;flex-direction:column;min-height:0;position:relative}.fv-bubble-list .fv-bubble-list-scroll{display:flex;flex-direction:column;gap:16px;min-height:0;overflow-y:auto}.fv-bubble-list .fv-bubble-list-scroll>.fv-bubble{flex-shrink:0}.fv-bubble-list .fv-bubble-list-scroll.always-scrollbar{overflow-y:scroll;scrollbar-width:auto}.fv-bubble-list .fv-bubble-list-scroll.always-scrollbar::-webkit-scrollbar{-webkit-appearance:none;width:6px}.fv-bubble-list .fv-bubble-list-scroll.always-scrollbar::-webkit-scrollbar-thumb{background-color:var(--el-border-color,#dcdfe6);border-radius:3px}.fv-bubble-list .fv-bubble-list-back{align-items:center;bottom:16px;box-shadow:var(--el-box-shadow-light,0 0 12px rgba(0,0,0,.12));display:inline-flex;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);z-index:1}.fv-bubble-list .fv-bubble-list-back .fv-bubble-list-back-icon{align-items:center;display:inline-flex;justify-content:center;line-height:1}.fv-bubble-list-fade-enter-active,.fv-bubble-list-fade-leave-active{transition:opacity .2s ease,transform .2s ease}.fv-bubble-list-fade-enter-from,.fv-bubble-list-fade-leave-to{opacity:0;transform:translate(-50%,4px)}.fv-sender{box-sizing:border-box;display:flex;flex-direction:column;width:100%}.fv-sender .fv-sender-header{animation:fv-sender-slide-down .3s ease;border-bottom:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);max-height:300px;overflow:hidden;padding:8px 12px}.fv-sender .fv-sender-body{background-color:var(--el-fill-color-blank,#fff);border:var(--el-border-width,1px) solid var(--el-border-color,#dcdfe6);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);display:flex;flex-direction:column;gap:6px;padding:8px 12px;transition:border-color .2s}.fv-sender .fv-sender-body .fv-sender-body-top:empty{display:none}.fv-sender .fv-sender-body .fv-sender-row{align-items:flex-end;display:flex;gap:8px}.fv-sender .fv-sender-body .fv-sender-prefix{align-items:center;align-self:center;display:flex;flex-shrink:0}.fv-sender .fv-sender-body .fv-sender-recording{align-items:center;background-color:var(--el-color-primary-light-9,#ecf5ff);border-radius:calc(var(--el-border-radius-base, 4px) + 2px);display:flex;flex:1;gap:8px;min-width:0;outline:none;padding:4px 8px}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-cancel{flex-shrink:0}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-cancel:hover{color:var(--el-color-danger,#f56c6c)}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-wave{align-items:center;direction:rtl;display:flex;flex:1;gap:2px;height:22px;justify-content:flex-end;min-width:0;overflow:hidden}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-wave .fv-sender-recording-bar{background-color:var(--el-color-primary,#409eff);border-radius:1px;flex-shrink:0;min-height:2px;opacity:.75;width:2px}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-duration{color:var(--el-color-primary,#409eff);flex-shrink:0;font-size:var(--el-font-size-small,12px);font-variant-numeric:tabular-nums;min-width:3em;text-align:center}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-confirm{flex-shrink:0}.fv-sender .fv-sender-body .fv-sender-input{display:flex;flex:1;min-width:0;position:relative}.fv-sender .fv-sender-body .fv-sender-input .fv-sender-textarea{background:transparent;border:none;box-sizing:border-box;color:var(--el-text-color-primary,#303133);flex:1;font:inherit;font-family:inherit;font-size:var(--el-font-size-base,14px);line-height:22px;min-width:0;outline:none;padding:4px 0;resize:none}.fv-sender .fv-sender-body .fv-sender-input .fv-sender-textarea::placeholder{color:var(--el-text-color-placeholder,#a8abb2)}.fv-sender .fv-sender-body .fv-sender-input .fv-sender-textarea:disabled{color:var(--el-text-color-disabled,#a8abb2);cursor:not-allowed}.fv-sender .fv-sender-body .fv-sender-input .fv-sender-textarea[readonly]{cursor:default}.fv-sender .fv-sender-body .fv-sender-input .fv-sender-trigger-anchor{bottom:0;height:0;pointer-events:none;position:absolute;width:0}.fv-sender .fv-sender-body .fv-sender-actions{align-items:center;align-self:flex-end;display:flex;flex-shrink:0;gap:4px}.fv-sender .fv-sender-body .fv-sender-actions .fv-sender-action-left{align-items:center;display:flex;gap:4px}.fv-sender .fv-sender-body .fv-sender-actions .fv-sender-speech{color:var(--el-text-color-regular,#606266);padding:6px}.fv-sender .fv-sender-body .fv-sender-actions .fv-sender-speech .el-icon{font-size:18px}.fv-sender .fv-sender-body .fv-sender-actions .fv-sender-speech:not(.is-disabled):active,.fv-sender .fv-sender-body .fv-sender-actions .fv-sender-speech:not(.is-disabled):hover{background-color:transparent;color:var(--el-text-color-primary,#303133)}.fv-sender.variant-updown .fv-sender-row{align-items:stretch;flex-direction:column;gap:6px}.fv-sender.variant-updown .fv-sender-row .fv-sender-input{width:100%}.fv-sender.variant-updown .fv-sender-row .fv-sender-actions{align-self:flex-end;justify-content:flex-end}.fv-sender.variant-updown .fv-sender-row .fv-sender-actions:has(.fv-sender-action-left){align-self:stretch}.fv-sender.variant-updown .fv-sender-row .fv-sender-actions:has(.fv-sender-action-left) .fv-sender-action-left{margin-right:auto}.fv-sender.is-focused .fv-sender-body{border-color:var(--el-color-primary,#409eff)}.fv-sender.is-disabled .fv-sender-body{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-sender.has-shadow .fv-sender-body{box-shadow:0 8px 20px 0 var(--el-box-shadow-color,rgba(0,0,0,.08));transition:border-color .2s,box-shadow .2s}.fv-sender.has-shadow.is-focused .fv-sender-body{box-shadow:0 8px 24px 0 var(--el-box-shadow-color,rgba(0,0,0,.12))}.fv-sender .fv-sender-stop{--fv-sender-stop-icon-size:16px;--fv-sender-stop-ring-width:2px;--fv-sender-stop-ring-duration:1.1s;position:relative}.fv-sender .fv-sender-stop .el-icon{align-items:center;display:inline-flex;font-size:var(--fv-sender-stop-icon-size);justify-content:center}.fv-sender .fv-sender-stop .fv-stop-icon{display:block}.fv-sender .fv-sender-stop .fv-sender-stop-ring{height:100%;inset:0;overflow:visible;pointer-events:none;position:absolute;width:100%}.fv-sender .fv-sender-stop .fv-sender-stop-ring .fv-sender-stop-ring-rect{x:calc(var(--fv-sender-stop-ring-width)/2);y:calc(var(--fv-sender-stop-ring-width)/2);fill:none;stroke:rgb(255,255,255,var(--ring-alpha,.9));stroke-width:var(--fv-sender-stop-ring-width);stroke-dasharray:0 calc(100 - var(--ring-len, 10)) var(--ring-len,10) 0;animation:fv-sender-stop-spin var(--fv-sender-stop-ring-duration) linear infinite;height:calc(100% - var(--fv-sender-stop-ring-width));width:calc(100% - var(--fv-sender-stop-ring-width))}@media (prefers-reduced-motion:reduce){.fv-sender .fv-sender-stop .fv-sender-stop-ring-rect{animation:none}}.fv-sender .fv-sender-footer{color:var(--el-text-color-regular,#606266);font-size:var(--el-font-size-base,14px);padding:6px 12px}@keyframes fv-sender-slide-down{0%{max-height:0;opacity:0}to{max-height:300px;opacity:1}}@keyframes fv-sender-stop-spin{to{stroke-dashoffset:-100}}.fv-mention-sender{position:relative}.fv-mention-sender .fv-mention-anchor{bottom:0;height:0;pointer-events:none;position:absolute;width:0}.fv-mention-popover .fv-mention-panel{max-height:260px;overflow-y:auto;padding:4px}.fv-mention-popover .fv-mention-title{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-small,12px);padding:4px 8px}.fv-mention-popover .fv-mention-loading{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-base,14px);padding:8px;text-align:center}.fv-mention-popover .fv-mention-item{align-items:center;border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-primary,#303133);cursor:pointer;display:flex;font-size:var(--el-font-size-base,14px);gap:8px;padding:6px 8px}.fv-mention-popover .fv-mention-item.is-active,.fv-mention-popover .fv-mention-item:hover{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-mention-popover .fv-mention-item .fv-mention-avatar{align-items:center;background-color:var(--el-fill-color,#e9e9eb);border-radius:50%;color:var(--el-text-color-regular,#606266);display:inline-flex;flex-shrink:0;font-size:var(--el-font-size-small,12px);height:24px;justify-content:center;overflow:hidden;width:24px}.fv-mention-popover .fv-mention-item .fv-mention-avatar img{height:100%;object-fit:cover;width:100%}.fv-mention-popover .fv-mention-item .fv-mention-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-editor-sender{box-sizing:border-box;display:flex;flex-direction:column;width:100%}.fv-editor-sender .fv-editor-header{animation:fv-editor-slide-down .3s ease;border-bottom:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);max-height:300px;overflow:hidden;padding:8px 12px}.fv-editor-sender .fv-editor-body{align-items:flex-end;background-color:var(--el-fill-color-blank,#fff);border:var(--el-border-width,1px) solid var(--el-border-color,#dcdfe6);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);display:flex;gap:8px;padding:8px 12px;transition:border-color .2s}.fv-editor-sender .fv-editor-body .fv-editor-prefix{align-items:center;align-self:center;display:flex;flex-shrink:0}.fv-editor-sender .fv-editor-body .fv-editor-input{display:flex;flex:1;min-width:0;position:relative}.fv-editor-sender .fv-editor-body .fv-editor-input .fv-editor-content{background:transparent;box-sizing:border-box;color:var(--el-text-color-primary,#303133);flex:1;font:inherit;font-family:inherit;font-size:var(--el-font-size-base,14px);line-height:22px;max-height:220px;min-width:0;outline:none;overflow-y:auto;padding:4px 0;white-space:pre-wrap;word-break:break-word}.fv-editor-sender .fv-editor-body .fv-editor-input .fv-editor-content:empty:before{color:var(--el-text-color-placeholder,#a8abb2);content:attr(data-placeholder);pointer-events:none}.fv-editor-sender .fv-editor-body .fv-editor-input .fv-editor-anchor{bottom:0;height:0;pointer-events:none;position:absolute;width:0}.fv-editor-sender .fv-editor-body .fv-editor-actions{align-items:center;align-self:flex-end;display:flex;flex-shrink:0;gap:4px}.fv-editor-sender .fv-editor-tag{align-items:center;background-color:var(--el-color-primary-light-9,#ecf5ff);border-radius:var(--el-border-radius-base,4px);box-sizing:border-box;color:var(--el-color-primary,#409eff);display:inline-flex;font-size:var(--el-font-size-base,14px);line-height:20px;margin:0 1px;max-width:100%;padding:0 6px;user-select:all;white-space:nowrap}.fv-editor-sender .fv-editor-tag.fv-editor-tag-inputTag{padding:0 2px}.fv-editor-sender .fv-editor-tag.fv-editor-tag-inputTag .fv-editor-tag-input{background:transparent;border:none;box-sizing:border-box;color:inherit;font:inherit;line-height:20px;outline:none;padding:0 4px;width:120px}.fv-editor-sender .fv-editor-tag.fv-editor-tag-inputTag .fv-editor-tag-input::placeholder{color:var(--el-text-color-placeholder,#a8abb2)}.fv-editor-sender .fv-editor-tag.fv-editor-tag-htmlTag{display:inline;user-select:text;white-space:normal}.fv-editor-sender.variant-updown .fv-editor-body{align-items:stretch;flex-direction:column;gap:6px}.fv-editor-sender.variant-updown .fv-editor-body .fv-editor-input{width:100%}.fv-editor-sender.variant-updown .fv-editor-body .fv-editor-actions{align-self:flex-end;justify-content:flex-end}.fv-editor-sender.device-h5 .fv-editor-body{padding:6px 10px}.fv-editor-sender.is-focused .fv-editor-body{border-color:var(--el-color-primary,#409eff)}.fv-editor-sender.is-disabled .fv-editor-body{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-editor-sender .fv-editor-footer{color:var(--el-text-color-regular,#606266);font-size:var(--el-font-size-base,14px);padding:6px 12px}.fv-editor-mention-popover .fv-editor-mention-panel{max-height:260px;overflow-y:auto;padding:4px}.fv-editor-mention-popover .fv-editor-mention-title{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-small,12px);padding:4px 8px}.fv-editor-mention-popover .fv-editor-mention-loading{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-base,14px);padding:8px;text-align:center}.fv-editor-mention-popover .fv-editor-mention-item{align-items:center;border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-primary,#303133);cursor:pointer;display:flex;font-size:var(--el-font-size-base,14px);gap:8px;padding:6px 8px}.fv-editor-mention-popover .fv-editor-mention-item.is-active,.fv-editor-mention-popover .fv-editor-mention-item:hover{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-editor-mention-popover .fv-editor-mention-item .fv-editor-mention-avatar{align-items:center;background-color:var(--el-fill-color,#e9e9eb);border-radius:50%;color:var(--el-text-color-regular,#606266);display:inline-flex;flex-shrink:0;font-size:var(--el-font-size-small,12px);height:24px;justify-content:center;overflow:hidden;width:24px}.fv-editor-mention-popover .fv-editor-mention-item .fv-editor-mention-avatar img{height:100%;object-fit:cover;width:100%}.fv-editor-mention-popover .fv-editor-mention-item .fv-editor-mention-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-editor-tip-popover .fv-editor-tip-panel{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-small,12px);padding:6px 8px}.fv-editor-select-dialog .fv-editor-select-group+.fv-editor-select-group{margin-top:12px}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-title{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-base,14px);font-weight:600;margin-bottom:8px}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-grid{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(96px,1fr))}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-item{align-items:center;border:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);border-radius:var(--el-border-radius-base,4px);cursor:pointer;display:flex;flex-direction:column;gap:4px;padding:8px;transition:border-color .2s}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-item:hover{border-color:var(--el-color-primary,#409eff)}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-item .fv-editor-select-preview{border-radius:var(--el-border-radius-base,4px);height:56px;object-fit:cover;width:100%}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-item .fv-editor-select-name{color:var(--el-text-color-regular,#606266);font-size:var(--el-font-size-small,12px);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes fv-editor-slide-down{0%{max-height:0;opacity:0}to{max-height:300px;opacity:1}}.fv-thinking{background-color:var(--fv-thinking-bg,transparent);border-radius:var(--el-border-radius-base,4px);box-sizing:border-box;color:var(--fv-thinking-color,var(--el-text-color-regular,#606266));display:flex;flex-direction:column;width:100%}.fv-thinking .fv-thinking-toggle{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:inline-flex;font:inherit;font-size:var(--el-font-size-base,14px);gap:6px;line-height:22px;padding:4px 0;text-align:left;transition:color .2s;user-select:none}.fv-thinking .fv-thinking-toggle:hover{color:var(--fv-thinking-color,var(--el-color-primary,#409eff))}.fv-thinking .fv-thinking-toggle:focus{outline:none}.fv-thinking.is-disabled .fv-thinking-toggle{cursor:not-allowed;opacity:.6}.fv-thinking .fv-thinking-status-icon{align-items:center;display:inline-flex;height:16px;justify-content:center;width:16px}.fv-thinking .fv-thinking-status-icon .fv-thinking-dot{background-color:var(--el-color-primary,#409eff);border-radius:50%;height:8px;width:8px}.fv-thinking .fv-thinking-status-icon .is-loading{animation:fv-thinking-rotate 1s linear infinite;color:var(--el-color-primary,#409eff)}.fv-thinking .fv-thinking-status-icon .is-success{color:var(--el-color-success,#67c23a)}.fv-thinking .fv-thinking-status-icon .is-error{color:var(--el-color-danger,#f56c6c)}.fv-thinking .fv-thinking-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-thinking .fv-thinking-arrow{align-items:center;display:inline-flex;transition:transform .3s ease}.fv-thinking .fv-thinking-arrow.is-open{transform:rotate(180deg)}.fv-thinking .fv-thinking-content{box-sizing:border-box;color:var(--el-text-color-regular,#606266);font-size:var(--el-font-size-base,14px);line-height:22px;padding:8px 0 8px 22px;white-space:pre-wrap;word-break:break-word}@keyframes fv-thinking-rotate{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fv-chain{box-sizing:border-box;display:flex;font-size:var(--el-font-size-base,14px)}.fv-chain.is-vertical{flex-direction:column}.fv-chain.is-vertical .fv-chain-item{display:flex;gap:10px}.fv-chain.is-vertical .fv-chain-item:not(:last-child) .fv-chain-node:before{background-color:var(--el-border-color-lighter,#ebeef5);bottom:-4px;content:"";left:50%;margin-left:-1px;position:absolute;top:18px;width:2px}.fv-chain.is-horizontal{flex-direction:row;gap:24px}.fv-chain.is-horizontal .fv-chain-item{align-items:flex-start;display:flex;gap:6px}.fv-chain .fv-chain-node{align-items:center;display:inline-flex;flex-shrink:0;font-size:16px;height:18px;justify-content:center;position:relative;width:18px}.fv-chain .fv-chain-node .fv-chain-dot{background-color:var(--el-fill-color-blank,#fff);border:2px solid var(--el-border-color,#dcdfe6);border-radius:50%;box-sizing:border-box;height:8px;width:8px}.fv-chain .fv-chain-item.status-success .fv-chain-node{color:var(--el-color-success,#67c23a)}.fv-chain .fv-chain-item.status-success .fv-chain-node .fv-chain-dot{background-color:var(--el-color-success,#67c23a);border-color:var(--el-color-success,#67c23a)}.fv-chain .fv-chain-item.status-error .fv-chain-node{color:var(--el-color-danger,#f56c6c)}.fv-chain .fv-chain-item.status-error .fv-chain-node .fv-chain-dot{background-color:var(--el-color-danger,#f56c6c);border-color:var(--el-color-danger,#f56c6c)}.fv-chain .fv-chain-item.status-loading .fv-chain-node{color:var(--el-color-primary,#409eff)}.fv-chain .fv-chain-item.status-loading .fv-chain-node .is-loading{animation:fv-chain-rotate 1s linear infinite}.fv-chain .fv-chain-item.status-loading .fv-chain-node .fv-chain-dot{border-color:var(--el-color-primary,#409eff)}.fv-chain .fv-chain-item.status-pending .fv-chain-title{color:var(--el-text-color-placeholder,#a8abb2)}.fv-chain .fv-chain-main{flex:1;min-width:0;padding-bottom:4px}.fv-chain .fv-chain-main .fv-chain-title{color:var(--el-text-color-primary,#303133);line-height:22px}.fv-chain .fv-chain-main .fv-chain-description{color:var(--el-text-color-regular,#606266);font-size:var(--el-font-size-small,12px);line-height:20px;word-break:break-word}@keyframes fv-chain-rotate{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fv-welcome{box-sizing:border-box;flex-direction:column;padding:var(--el-main-padding,20px);text-align:center;width:100%}.fv-welcome,.fv-welcome-icon{align-items:center;display:flex;justify-content:center}.fv-welcome-icon{margin-bottom:16px}.fv-welcome-icon .fv-welcome-avatar{background-color:var(--el-fill-color-light,#f5f7fa);border-radius:calc(var(--el-border-radius-base, 4px) + 8px);color:var(--el-color-primary,#409eff);font-size:36px;height:72px;width:72px}.fv-welcome-name{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-extra-large,20px);font-weight:600;line-height:1.4;margin:0}.fv-welcome-description{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-base,14px);line-height:var(--el-font-line-height-primary,24px);margin:8px 0 0;max-width:480px;white-space:pre-wrap;word-break:break-word}.fv-prompts{box-sizing:border-box;width:100%}.fv-prompts .fv-prompts-title{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-base,14px);line-height:var(--el-font-line-height-primary,24px);margin-bottom:12px}.fv-prompts .fv-prompts-list{display:flex;flex-wrap:wrap;gap:12px}.fv-prompts .fv-prompt-item{background-color:var(--el-bg-color,#fff);border:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);box-sizing:border-box;cursor:pointer;flex:1 1 200px;max-width:100%;padding:12px 14px;transition:background-color var(--el-transition-duration,.3s),border-color var(--el-transition-duration,.3s)}.fv-prompts .fv-prompt-item:hover:not(.is-disabled){background-color:var(--el-fill-color-light,#f5f7fa);border-color:var(--el-border-color,#dcdfe6)}.fv-prompts .fv-prompt-item:focus-visible:not(.is-disabled){border-color:var(--el-color-primary,#409eff);outline:none}.fv-prompts .fv-prompt-item.is-disabled{background-color:var(--el-fill-color-lighter,#fafafa);cursor:not-allowed;opacity:.6}.fv-prompts .fv-prompt-item.is-disabled,.fv-prompts .fv-prompt-item.is-disabled .fv-prompt-item-description,.fv-prompts .fv-prompt-item.is-disabled .fv-prompt-item-icon,.fv-prompts .fv-prompt-item.is-disabled .fv-prompt-item-label{color:var(--el-text-color-placeholder,#a8abb2)}.fv-prompts .fv-prompt-item .fv-prompt-item-main{align-items:flex-start;display:flex;gap:10px}.fv-prompts .fv-prompt-item .fv-prompt-item-icon{color:var(--el-color-primary,#409eff);flex-shrink:0;font-size:18px;margin-top:2px}.fv-prompts .fv-prompt-item .fv-prompt-item-text{flex:1;min-width:0}.fv-prompts .fv-prompt-item .fv-prompt-item-label{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-base,14px);font-weight:500;line-height:var(--el-font-line-height-primary,24px);word-break:break-word}.fv-prompts .fv-prompt-item .fv-prompt-item-description{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-small,12px);line-height:var(--el-font-line-height-primary,24px);margin-top:2px;word-break:break-word}.fv-files-card{align-items:center;background-color:var(--el-bg-color,#fff);border:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);box-sizing:border-box;display:flex;gap:8px;max-width:100%;min-width:0;padding:8px 24px 8px 10px;position:relative;transition:border-color var(--el-transition-duration,.3s)}.fv-files-card .fv-files-card-icon{color:var(--el-color-primary,#409eff);flex-shrink:0;font-size:20px}.fv-files-card .fv-files-card-info{flex:1;min-width:0}.fv-files-card .fv-files-card-name{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-small,12px);line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-files-card .fv-files-card-size{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-extra-small,12px);line-height:16px;white-space:nowrap}.fv-files-card .fv-files-card-thumb{align-items:center;background-color:var(--el-fill-color-light,#f5f7fa);border-radius:var(--el-border-radius-base,4px);display:flex;flex-shrink:0;height:48px;justify-content:center;overflow:hidden;width:48px}.fv-files-card .fv-files-card-thumb .fv-files-card-img{display:block;height:100%;object-fit:cover;width:100%}.fv-files-card .fv-files-card-thumb .fv-files-card-thumb-placeholder{color:var(--el-text-color-placeholder,#a8abb2);font-size:20px}.fv-files-card .fv-files-card-status{align-items:center;background-color:var(--el-bg-color,#fff);border-radius:50%;bottom:-8px;display:flex;height:16px;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:16px}.fv-files-card .fv-files-card-status .fv-files-card-loading{animation:fv-files-card-rotating 1.5s linear infinite;color:var(--el-color-primary,#409eff);font-size:14px}.fv-files-card .fv-files-card-remove{align-items:center;background-color:transparent;border:none;border-radius:50%;color:var(--el-text-color-secondary,#909399);cursor:pointer;display:flex;font-size:12px;height:18px;justify-content:center;opacity:0;padding:0;position:absolute;right:2px;top:2px;transition:opacity var(--el-transition-duration,.3s),color var(--el-transition-duration,.3s),background-color var(--el-transition-duration,.3s);width:18px}.fv-files-card .fv-files-card-remove:hover{background-color:var(--el-fill-color-light,#f5f7fa);color:var(--el-color-danger,#f56c6c)}.fv-files-card:hover .fv-files-card-remove{opacity:1}.fv-files-card.is-error{border-color:var(--el-color-danger,#f56c6c)}.fv-files-card.is-error .fv-files-card-name{color:var(--el-color-danger,#f56c6c)}@keyframes fv-files-card-rotating{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fv-attachments{align-items:flex-start;box-sizing:border-box;display:flex;gap:8px;width:100%}.fv-attachments .fv-attachments-input{display:none}.fv-attachments .fv-attachments-trigger{align-items:center;background-color:transparent;border:none;border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-secondary,#909399);cursor:pointer;display:flex;flex-shrink:0;font-size:16px;height:32px;justify-content:center;padding:0;transition:color var(--el-transition-duration,.3s),background-color var(--el-transition-duration,.3s);width:32px}.fv-attachments .fv-attachments-trigger:hover:not(:disabled){background-color:var(--el-fill-color-light,#f5f7fa);color:var(--el-color-primary,#409eff)}.fv-attachments .fv-attachments-trigger.is-full,.fv-attachments .fv-attachments-trigger:disabled{color:var(--el-text-color-placeholder,#a8abb2);cursor:not-allowed}.fv-attachments .fv-attachments-list{display:flex;flex-wrap:wrap;gap:8px;min-width:0}.fv-attachments .fv-attachments-item{align-items:center;display:flex;min-width:0;position:relative}.fv-attachments .fv-attachments-item .fv-files-card{max-width:240px}.fv-attachments .fv-attachments-item .fv-attachments-retry{align-items:center;background-color:transparent;border:none;border-radius:50%;color:var(--el-text-color-secondary,#909399);cursor:pointer;display:flex;font-size:14px;height:20px;justify-content:center;margin-left:4px;padding:0;transition:color var(--el-transition-duration,.3s),background-color var(--el-transition-duration,.3s);width:20px}.fv-attachments .fv-attachments-item .fv-attachments-retry:hover{background-color:var(--el-fill-color-light,#f5f7fa);color:var(--el-color-primary,#409eff)}.fv-attachments .fv-attachments-tip{color:var(--el-text-color-placeholder,#a8abb2);flex:1;font-size:var(--el-font-size-extra-small,12px);line-height:32px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-conversations{box-sizing:border-box;overflow-y:auto;width:100%}.fv-conversations .fv-conversations-group .fv-conversations-group-title{background-color:var(--el-bg-color,#fff);color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-extra-small,12px);line-height:20px;padding:8px 12px 4px;position:sticky;top:0;z-index:1}.fv-conversations .fv-conversations-item{align-items:center;border-radius:var(--el-border-radius-base,4px);cursor:pointer;display:flex;gap:4px;padding:0 8px 0 12px;transition:background-color .2s;user-select:none}.fv-conversations .fv-conversations-item:hover{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-conversations .fv-conversations-item:hover .fv-conversations-menu-btn{opacity:1;pointer-events:auto}.fv-conversations .fv-conversations-item.is-active{background-color:var(--el-color-primary-light-9,#ecf5ff);color:var(--el-color-primary,#409eff)}.fv-conversations .fv-conversations-item.is-active .fv-conversations-item-label{color:var(--el-color-primary,#409eff);font-weight:600}.fv-conversations .fv-conversations-item.is-disabled{color:var(--el-text-color-disabled,#a8abb2);cursor:not-allowed}.fv-conversations .fv-conversations-item.is-disabled .fv-conversations-item-label{color:var(--el-text-color-disabled,#a8abb2)}.fv-conversations .fv-conversations-item.is-disabled:hover{background-color:transparent}.fv-conversations .fv-conversations-item .fv-conversations-item-content{flex:1;min-width:0;padding:9px 0}.fv-conversations .fv-conversations-item .fv-conversations-item-content .fv-conversations-item-label{color:var(--el-text-color-regular,#606266);display:block;font-size:var(--el-font-size-base,14px);line-height:22px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-conversations .fv-conversations-item .fv-conversations-menu-btn{align-items:center;background:transparent;border:none;border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-secondary,#909399);cursor:pointer;display:inline-flex;flex-shrink:0;height:24px;justify-content:center;opacity:0;padding:0;pointer-events:none;transition:opacity .2s;width:24px}.fv-conversations .fv-conversations-item .fv-conversations-menu-btn:hover{background-color:var(--el-fill-color,#f0f2f5);color:var(--el-text-color-primary,#303133)}.fv-conversations.show-menu-always .fv-conversations-item .fv-conversations-menu-btn{opacity:1;pointer-events:auto}.fv-msg{align-items:flex-start;box-sizing:border-box;display:flex;gap:12px;padding:8px 0;width:100%}.fv-msg .fv-msg-avatar{align-items:center;background-color:var(--el-fill-color-light,#f5f7fa);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);color:var(--el-text-color-secondary,#909399);display:flex;flex-shrink:0;font-size:18px;height:32px;justify-content:center;width:32px}.fv-msg.is-user .fv-msg-avatar{background-color:var(--el-color-primary-light-8,#d9ecff);color:var(--el-color-primary,#409eff);order:2}.fv-msg .fv-msg-main{align-items:flex-start;display:flex;flex:1;flex-direction:column;min-width:0}.fv-msg .fv-msg-main .fv-msg-header{align-items:center;color:var(--el-text-color-secondary,#909399);display:flex;font-size:var(--el-font-size-small,12px);gap:8px;margin-bottom:2px}.fv-msg .fv-msg-main .fv-msg-header .fv-msg-model{background-color:var(--el-fill-color,#f0f2f5);border-radius:var(--el-border-radius-base,4px);line-height:18px;padding:0 6px}.fv-msg .fv-msg-main .fv-msg-files{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:4px}.fv-msg .fv-msg-main .fv-msg-files .fv-msg-file{align-items:center;border:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-regular,#606266);display:inline-flex;font-size:var(--el-font-size-small,12px);padding:4px 8px}.fv-msg .fv-msg-main .fv-msg-files .fv-msg-file .fv-msg-file-img{border-radius:var(--el-border-radius-base,4px);max-height:64px;max-width:64px;object-fit:cover}.fv-msg .fv-msg-main .fv-msg-content{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-base,14px);line-height:var(--el-font-line-height-primary,24px);max-width:100%;min-width:0;word-break:break-word}.fv-msg .fv-msg-main .fv-msg-content .fv-msg-error{color:var(--el-color-danger,#f56c6c)}.fv-msg .fv-msg-main .fv-msg-content .fv-msg-pending{align-items:center;display:inline-flex;gap:4px;padding:4px 0}.fv-msg .fv-msg-main .fv-msg-content .fv-msg-pending .fv-msg-dot{animation:fv-msg-blink 1s infinite;background-color:var(--el-text-color-secondary,#909399);border-radius:50%;height:6px;width:6px}.fv-msg .fv-msg-main .fv-msg-content-user{background-color:var(--el-fill-color-light,#f5f7fa);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);padding:8px 12px;white-space:pre-wrap}.fv-msg.is-user{flex-direction:row;justify-content:flex-end}.fv-msg.is-user .fv-msg-main{align-items:flex-end}.fv-msg .fv-msg-actions{align-items:center;display:flex;gap:2px;margin-top:2px}.fv-msg .fv-msg-actions .fv-msg-branch{align-items:center;display:inline-flex;gap:2px;margin-left:6px}.fv-msg .fv-msg-actions .fv-msg-branch .fv-msg-branch-label{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-small,12px);padding:0 2px}@keyframes fv-msg-blink{0%,to{opacity:.3}50%{opacity:1}}.fv-messages{box-sizing:border-box;display:flex;flex:1;flex-direction:column;min-height:0;width:100%}.fv-messages .fv-messages-scroll{box-sizing:border-box;flex:1;min-height:0;overflow-y:auto;padding:0 16px}.fv-messages .fv-messages-empty{align-items:center;box-sizing:border-box;display:flex;flex:1;flex-direction:column;justify-content:center;padding:32px 16px}.fv-messages .fv-messages-empty .fv-messages-prompts{margin-top:8px;max-width:640px;width:100%}.fv-ai-chat{background-color:var(--el-bg-color,#fff);box-sizing:border-box;color:var(--el-text-color-primary,#303133);display:flex;flex-direction:column;height:100%;min-height:0;width:100%}.fv-ai-chat .fv-ai-chat-header{align-items:center;border-bottom:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);display:flex;flex-shrink:0;gap:12px;justify-content:space-between;padding:8px 16px}.fv-ai-chat .fv-ai-chat-header .fv-ai-chat-title{font-size:var(--el-font-size-base,14px);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-ai-chat .fv-ai-chat-header .fv-ai-chat-models{flex-shrink:0;width:220px}.fv-ai-chat .fv-ai-chat-body{display:flex;flex:1;min-height:0;overflow:hidden}.fv-ai-chat .fv-ai-chat-footer{flex-shrink:0;padding:8px 16px 12px}.fv-ai-chat.is-center-welcome .fv-ai-chat-body{flex:0 1 auto;margin-top:auto;min-height:0}.fv-ai-chat.is-center-welcome .fv-ai-chat-footer{margin-bottom:auto}html.dark .fv-ai-chat{background-color:var(--el-bg-color,#141414)}.fv-artifacts{background-color:var(--el-bg-color,#fff);border-left:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);box-sizing:border-box;display:flex;flex-direction:column;flex-shrink:0;max-width:60%;overflow:hidden;width:420px}.fv-artifacts .fv-artifacts-tabs{align-items:center;border-bottom:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);display:flex;flex-shrink:0;gap:4px;overflow-x:auto;padding:6px 8px}.fv-artifacts .fv-artifacts-tabs .fv-artifact-tab{background:transparent;border:none;border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-regular,#606266);cursor:pointer;flex-shrink:0;font-size:var(--el-font-size-small,12px);line-height:1.4;padding:4px 10px;white-space:nowrap}.fv-artifacts .fv-artifacts-tabs .fv-artifact-tab:hover{background-color:var(--el-fill-color-light,#f5f7fa);color:var(--el-text-color-primary,#303133)}.fv-artifacts .fv-artifacts-tabs .fv-artifact-tab.is-active{background-color:var(--el-color-primary-light-9,#ecf5ff);color:var(--el-color-primary,#409eff)}.fv-artifacts .fv-artifacts-tabs .fv-artifacts-spacer{flex:1}.fv-artifacts .fv-artifacts-frame{background-color:var(--el-bg-color-page,#f2f3f5);border:none;flex:1;min-height:0;width:100%}html.dark .fv-artifacts{background-color:var(--el-bg-color,#141414)}
1
+ .fv-xmarkdown{color:var(--el-text-color-primary,#303133);line-height:1.7;word-break:break-word}.fv-xmarkdown h1,.fv-xmarkdown h2,.fv-xmarkdown h3,.fv-xmarkdown h4,.fv-xmarkdown h5,.fv-xmarkdown h6{color:var(--el-text-color-primary,#303133);font-weight:600;margin:1em 0 .5em}.fv-xmarkdown h1{font-size:1.5em}.fv-xmarkdown h2{font-size:1.3em}.fv-xmarkdown h3{font-size:1.15em}.fv-xmarkdown p{margin:.5em 0}.fv-xmarkdown a{color:var(--el-color-primary,#409eff);text-decoration:none}.fv-xmarkdown a:hover{text-decoration:underline}.fv-xmarkdown blockquote{border-left:4px solid var(--el-border-color,#dcdfe6);color:var(--el-text-color-regular,#606266);margin:.5em 0;padding:.4em 1em}.fv-xmarkdown blockquote,.fv-xmarkdown code{background:var(--el-fill-color-light,#f5f7fa)}.fv-xmarkdown code{border-radius:3px;color:var(--el-color-danger,#f56c6c);font-family:JetBrains Mono,Consolas,Courier New,monospace;font-size:.9em;padding:.15em .4em}.fv-xmarkdown pre{background:#282c34;border-radius:6px;margin:.5em 0;overflow-x:auto;padding:1em}.fv-xmarkdown pre code{background:transparent;color:#dcdfe6;font-size:.9em;line-height:1.6;padding:0}.fv-xmarkdown table{border-collapse:collapse;margin:.5em 0;width:100%}.fv-xmarkdown table td,.fv-xmarkdown table th{border:1px solid var(--el-border-color-lighter,#ebeef5);padding:.5em .8em;text-align:left}.fv-xmarkdown table th{background:var(--el-fill-color-light,#f5f7fa);font-weight:600}.fv-xmarkdown table tr:nth-child(2n) td{background:var(--el-fill-color-blank,#fafcff)}.fv-xmarkdown .katex-display{margin:.5em 0;overflow-x:auto}.fv-typewriter{display:inline-block;max-width:100%;position:relative}.fv-typewriter .fv-typewriter-text{white-space:pre-wrap;word-break:break-word}.fv-typewriter .fv-typewriter-suffix{animation:fv-typewriter-blink 1s step-start infinite;display:inline-block}.fv-typewriter .fv-typewriter-fog{animation:fv-typewriter-fog-in .3s ease-out both;background:linear-gradient(90deg,transparent,var(--fv-typewriter-fog-color,var(--el-bg-color,#fff)));bottom:0;pointer-events:none;position:absolute;right:0;top:0}@keyframes fv-typewriter-blink{0%,to{opacity:1}50%{opacity:0}}@keyframes fv-typewriter-fog-in{0%{opacity:0}to{opacity:1}}.fv-bubble{align-items:flex-start;display:flex;gap:var(--fv-bubble-avatar-gap,12px)}.fv-bubble.is-end{flex-direction:row-reverse;justify-content:flex-end}.fv-bubble.is-end .fv-bubble-main{align-items:flex-end}.fv-bubble .fv-bubble-avatar{display:flex;flex-shrink:0}.fv-bubble .fv-bubble-avatar .el-avatar{height:var(--fv-bubble-avatar-size,36px);width:var(--fv-bubble-avatar-size,36px)}.fv-bubble .fv-bubble-main{align-items:flex-start;display:flex;flex:1;flex-direction:column;max-width:100%;min-width:0}.fv-bubble .fv-bubble-main .fv-bubble-footer,.fv-bubble .fv-bubble-main .fv-bubble-header{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-base,14px);line-height:var(--el-font-line-height-primary,24px)}.fv-bubble .fv-bubble-main .fv-bubble-footer{margin-top:4px}.fv-bubble .fv-bubble-content{border-radius:calc(var(--el-border-radius-base, 4px) + 4px);box-sizing:border-box;color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-base,14px);line-height:var(--el-font-line-height-primary,24px);max-width:100%;min-width:0;padding:var(--el-main-padding,12px) calc(var(--el-main-padding, 12px) + 4px);position:relative;word-break:break-word}.fv-bubble .fv-bubble-content.no-padding{padding:0}.fv-bubble .fv-bubble-content .fv-bubble-text{white-space:pre-wrap}.fv-bubble.shape-round .fv-bubble-content{border-radius:var(--el-border-radius-round,20px)}.fv-bubble.shape-corner .fv-bubble-content{border-start-start-radius:calc(var(--el-border-radius-base, 4px) - 2px)}.fv-bubble.is-end.shape-corner .fv-bubble-content{border-start-end-radius:calc(var(--el-border-radius-base, 4px) - 2px);border-start-start-radius:calc(var(--el-border-radius-base, 4px) + 4px)}.fv-bubble.variant-borderless .fv-bubble-content,.fv-bubble.variant-filled .fv-bubble-content{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-bubble.variant-borderless .fv-bubble-content,.fv-bubble.variant-outlined .fv-bubble-content{border:var(--el-border-width,1px) solid var(--el-border-color,#dcdfe6)}.fv-bubble.variant-outlined .fv-bubble-content{background:none}.fv-bubble.variant-shadow .fv-bubble-content{background:none;box-shadow:var(--el-box-shadow-light,0 0 12px rgba(0,0,0,.12))}.fv-bubble .fv-bubble-content.no-style{background:transparent;border:none;box-shadow:none;padding:0}.fv-bubble .fv-bubble-loading{align-items:center;display:flex;gap:5px;min-height:1em;width:fit-content}.fv-bubble .fv-bubble-loading .fv-bubble-loading-dot{animation:fv-bubble-wave 1s ease-in-out infinite;background-color:var(--el-color-primary,#409eff);border-radius:50%;height:5px;width:5px}@keyframes fv-bubble-wave{0%,to{transform:translateY(-2px)}50%{transform:translateY(2px)}}.fv-bubble-list{display:flex;flex-direction:column;min-height:0;position:relative}.fv-bubble-list .fv-bubble-list-scroll{display:flex;flex-direction:column;gap:16px;min-height:0;overflow-y:auto}.fv-bubble-list .fv-bubble-list-scroll>.fv-bubble{flex-shrink:0}.fv-bubble-list .fv-bubble-list-scroll.always-scrollbar{overflow-y:scroll;scrollbar-width:auto}.fv-bubble-list .fv-bubble-list-scroll.always-scrollbar::-webkit-scrollbar{-webkit-appearance:none;width:6px}.fv-bubble-list .fv-bubble-list-scroll.always-scrollbar::-webkit-scrollbar-thumb{background-color:var(--el-border-color,#dcdfe6);border-radius:3px}.fv-bubble-list .fv-bubble-list-back{align-items:center;bottom:16px;box-shadow:var(--el-box-shadow-light,0 0 12px rgba(0,0,0,.12));display:inline-flex;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);z-index:1}.fv-bubble-list .fv-bubble-list-back .fv-bubble-list-back-icon{align-items:center;display:inline-flex;justify-content:center;line-height:1}.fv-bubble-list-fade-enter-active,.fv-bubble-list-fade-leave-active{transition:opacity .2s ease,transform .2s ease}.fv-bubble-list-fade-enter-from,.fv-bubble-list-fade-leave-to{opacity:0;transform:translate(-50%,4px)}.fv-sender{box-sizing:border-box;display:flex;flex-direction:column;width:100%}.fv-sender .fv-sender-header{animation:fv-sender-slide-down .3s ease;border-bottom:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);max-height:300px;overflow:hidden;padding:8px 12px}.fv-sender .fv-sender-body{background-color:var(--el-fill-color-blank,#fff);border:var(--el-border-width,1px) solid var(--el-border-color,#dcdfe6);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);display:flex;flex-direction:column;gap:6px;padding:8px 12px;transition:border-color .2s}.fv-sender .fv-sender-body .fv-sender-body-top:empty{display:none}.fv-sender .fv-sender-body .fv-sender-row{align-items:flex-end;display:flex;gap:8px}.fv-sender .fv-sender-body .fv-sender-prefix{align-items:center;align-self:center;display:flex;flex-shrink:0}.fv-sender .fv-sender-body .fv-sender-recording{align-items:center;background-color:var(--el-color-primary-light-9,#ecf5ff);border-radius:calc(var(--el-border-radius-base, 4px) + 2px);display:flex;flex:1;gap:8px;min-width:0;outline:none;padding:4px 8px}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-cancel{flex-shrink:0}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-cancel:hover{color:var(--el-color-danger,#f56c6c)}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-wave{align-items:center;direction:rtl;display:flex;flex:1;gap:2px;height:22px;justify-content:flex-end;min-width:0;overflow:hidden}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-wave .fv-sender-recording-bar{background-color:var(--el-color-primary,#409eff);border-radius:1px;flex-shrink:0;min-height:2px;opacity:.75;width:2px}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-duration{color:var(--el-color-primary,#409eff);flex-shrink:0;font-size:var(--el-font-size-small,12px);font-variant-numeric:tabular-nums;min-width:3em;text-align:center}.fv-sender .fv-sender-body .fv-sender-recording .fv-sender-recording-confirm{flex-shrink:0}.fv-sender .fv-sender-body .fv-sender-input{display:flex;flex:1;min-width:0;position:relative}.fv-sender .fv-sender-body .fv-sender-input .fv-sender-textarea{background:transparent;border:none;box-sizing:border-box;color:var(--el-text-color-primary,#303133);flex:1;font:inherit;font-family:inherit;font-size:var(--el-font-size-base,14px);line-height:22px;min-width:0;outline:none;padding:4px 0;resize:none}.fv-sender .fv-sender-body .fv-sender-input .fv-sender-textarea::placeholder{color:var(--el-text-color-placeholder,#a8abb2)}.fv-sender .fv-sender-body .fv-sender-input .fv-sender-textarea:disabled{color:var(--el-text-color-disabled,#a8abb2);cursor:not-allowed}.fv-sender .fv-sender-body .fv-sender-input .fv-sender-textarea[readonly]{cursor:default}.fv-sender .fv-sender-body .fv-sender-input .fv-sender-trigger-anchor{bottom:0;height:0;pointer-events:none;position:absolute;width:0}.fv-sender .fv-sender-body .fv-sender-actions{align-items:center;align-self:flex-end;display:flex;flex-shrink:0;gap:4px}.fv-sender .fv-sender-body .fv-sender-actions .fv-sender-action-left{align-items:center;display:flex;gap:4px}.fv-sender .fv-sender-body .fv-sender-actions .fv-sender-speech{color:var(--el-text-color-regular,#606266);padding:6px}.fv-sender .fv-sender-body .fv-sender-actions .fv-sender-speech .el-icon{font-size:18px}.fv-sender .fv-sender-body .fv-sender-actions .fv-sender-speech:not(.is-disabled):active,.fv-sender .fv-sender-body .fv-sender-actions .fv-sender-speech:not(.is-disabled):hover{background-color:transparent;color:var(--el-text-color-primary,#303133)}.fv-sender.variant-updown .fv-sender-row{align-items:stretch;flex-direction:column;gap:6px}.fv-sender.variant-updown .fv-sender-row .fv-sender-input{width:100%}.fv-sender.variant-updown .fv-sender-row .fv-sender-actions{align-self:flex-end;justify-content:flex-end}.fv-sender.variant-updown .fv-sender-row .fv-sender-actions:has(.fv-sender-action-left){align-self:stretch}.fv-sender.variant-updown .fv-sender-row .fv-sender-actions:has(.fv-sender-action-left) .fv-sender-action-left{margin-right:auto}.fv-sender.is-focused .fv-sender-body{border-color:var(--el-color-primary,#409eff)}.fv-sender.is-disabled .fv-sender-body{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-sender.has-shadow .fv-sender-body{box-shadow:0 8px 20px 0 var(--el-box-shadow-color,rgba(0,0,0,.08));transition:border-color .2s,box-shadow .2s}.fv-sender.has-shadow.is-focused .fv-sender-body{box-shadow:0 8px 24px 0 var(--el-box-shadow-color,rgba(0,0,0,.12))}.fv-sender .fv-sender-stop{--fv-sender-stop-icon-size:16px;--fv-sender-stop-ring-width:2px;--fv-sender-stop-ring-duration:1.1s;position:relative}.fv-sender .fv-sender-stop .el-icon{align-items:center;display:inline-flex;font-size:var(--fv-sender-stop-icon-size);justify-content:center}.fv-sender .fv-sender-stop .fv-stop-icon{display:block}.fv-sender .fv-sender-stop .fv-sender-stop-ring{height:100%;inset:0;overflow:visible;pointer-events:none;position:absolute;width:100%}.fv-sender .fv-sender-stop .fv-sender-stop-ring .fv-sender-stop-ring-rect{x:calc(var(--fv-sender-stop-ring-width)/2);y:calc(var(--fv-sender-stop-ring-width)/2);fill:none;stroke:rgb(255,255,255,var(--ring-alpha,.9));stroke-width:var(--fv-sender-stop-ring-width);stroke-dasharray:0 calc(100 - var(--ring-len, 10)) var(--ring-len,10) 0;animation:fv-sender-stop-spin var(--fv-sender-stop-ring-duration) linear infinite;height:calc(100% - var(--fv-sender-stop-ring-width));width:calc(100% - var(--fv-sender-stop-ring-width))}@media (prefers-reduced-motion:reduce){.fv-sender .fv-sender-stop .fv-sender-stop-ring-rect{animation:none}}.fv-sender .fv-sender-footer{color:var(--el-text-color-regular,#606266);font-size:var(--el-font-size-base,14px);padding:6px 12px}@keyframes fv-sender-slide-down{0%{max-height:0;opacity:0}to{max-height:300px;opacity:1}}@keyframes fv-sender-stop-spin{to{stroke-dashoffset:-100}}.fv-mention-sender{position:relative}.fv-mention-sender .fv-mention-anchor{bottom:0;height:0;pointer-events:none;position:absolute;width:0}.fv-mention-popover .fv-mention-panel{max-height:260px;overflow-y:auto;padding:4px}.fv-mention-popover .fv-mention-title{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-small,12px);padding:4px 8px}.fv-mention-popover .fv-mention-loading{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-base,14px);padding:8px;text-align:center}.fv-mention-popover .fv-mention-item{align-items:center;border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-primary,#303133);cursor:pointer;display:flex;font-size:var(--el-font-size-base,14px);gap:8px;padding:6px 8px}.fv-mention-popover .fv-mention-item.is-active,.fv-mention-popover .fv-mention-item:hover{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-mention-popover .fv-mention-item .fv-mention-avatar{align-items:center;background-color:var(--el-fill-color,#e9e9eb);border-radius:50%;color:var(--el-text-color-regular,#606266);display:inline-flex;flex-shrink:0;font-size:var(--el-font-size-small,12px);height:24px;justify-content:center;overflow:hidden;width:24px}.fv-mention-popover .fv-mention-item .fv-mention-avatar img{height:100%;object-fit:cover;width:100%}.fv-mention-popover .fv-mention-item .fv-mention-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-editor-sender{box-sizing:border-box;display:flex;flex-direction:column;width:100%}.fv-editor-sender .fv-editor-header{animation:fv-editor-slide-down .3s ease;border-bottom:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);max-height:300px;overflow:hidden;padding:8px 12px}.fv-editor-sender .fv-editor-body{align-items:flex-end;background-color:var(--el-fill-color-blank,#fff);border:var(--el-border-width,1px) solid var(--el-border-color,#dcdfe6);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);display:flex;gap:8px;padding:8px 12px;transition:border-color .2s}.fv-editor-sender .fv-editor-body .fv-editor-prefix{align-items:center;align-self:center;display:flex;flex-shrink:0}.fv-editor-sender .fv-editor-body .fv-editor-input{display:flex;flex:1;min-width:0;position:relative}.fv-editor-sender .fv-editor-body .fv-editor-input .fv-editor-content{background:transparent;box-sizing:border-box;color:var(--el-text-color-primary,#303133);flex:1;font:inherit;font-family:inherit;font-size:var(--el-font-size-base,14px);line-height:22px;max-height:220px;min-width:0;outline:none;overflow-y:auto;padding:4px 0;white-space:pre-wrap;word-break:break-word}.fv-editor-sender .fv-editor-body .fv-editor-input .fv-editor-content:empty:before{color:var(--el-text-color-placeholder,#a8abb2);content:attr(data-placeholder);pointer-events:none}.fv-editor-sender .fv-editor-body .fv-editor-input .fv-editor-anchor{bottom:0;height:0;pointer-events:none;position:absolute;width:0}.fv-editor-sender .fv-editor-body .fv-editor-actions{align-items:center;align-self:flex-end;display:flex;flex-shrink:0;gap:4px}.fv-editor-sender .fv-editor-tag{align-items:center;background-color:var(--el-color-primary-light-9,#ecf5ff);border-radius:var(--el-border-radius-base,4px);box-sizing:border-box;color:var(--el-color-primary,#409eff);display:inline-flex;font-size:var(--el-font-size-base,14px);line-height:20px;margin:0 1px;max-width:100%;padding:0 6px;user-select:all;white-space:nowrap}.fv-editor-sender .fv-editor-tag.fv-editor-tag-inputTag{padding:0 2px}.fv-editor-sender .fv-editor-tag.fv-editor-tag-inputTag .fv-editor-tag-input{background:transparent;border:none;box-sizing:border-box;color:inherit;font:inherit;line-height:20px;outline:none;padding:0 4px;width:120px}.fv-editor-sender .fv-editor-tag.fv-editor-tag-inputTag .fv-editor-tag-input::placeholder{color:var(--el-text-color-placeholder,#a8abb2)}.fv-editor-sender .fv-editor-tag.fv-editor-tag-htmlTag{display:inline;user-select:text;white-space:normal}.fv-editor-sender.variant-updown .fv-editor-body{align-items:stretch;flex-direction:column;gap:6px}.fv-editor-sender.variant-updown .fv-editor-body .fv-editor-input{width:100%}.fv-editor-sender.variant-updown .fv-editor-body .fv-editor-actions{align-self:flex-end;justify-content:flex-end}.fv-editor-sender.device-h5 .fv-editor-body{padding:6px 10px}.fv-editor-sender.is-focused .fv-editor-body{border-color:var(--el-color-primary,#409eff)}.fv-editor-sender.is-disabled .fv-editor-body{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-editor-sender .fv-editor-footer{color:var(--el-text-color-regular,#606266);font-size:var(--el-font-size-base,14px);padding:6px 12px}.fv-editor-mention-popover .fv-editor-mention-panel{max-height:260px;overflow-y:auto;padding:4px}.fv-editor-mention-popover .fv-editor-mention-title{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-small,12px);padding:4px 8px}.fv-editor-mention-popover .fv-editor-mention-loading{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-base,14px);padding:8px;text-align:center}.fv-editor-mention-popover .fv-editor-mention-item{align-items:center;border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-primary,#303133);cursor:pointer;display:flex;font-size:var(--el-font-size-base,14px);gap:8px;padding:6px 8px}.fv-editor-mention-popover .fv-editor-mention-item.is-active,.fv-editor-mention-popover .fv-editor-mention-item:hover{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-editor-mention-popover .fv-editor-mention-item .fv-editor-mention-avatar{align-items:center;background-color:var(--el-fill-color,#e9e9eb);border-radius:50%;color:var(--el-text-color-regular,#606266);display:inline-flex;flex-shrink:0;font-size:var(--el-font-size-small,12px);height:24px;justify-content:center;overflow:hidden;width:24px}.fv-editor-mention-popover .fv-editor-mention-item .fv-editor-mention-avatar img{height:100%;object-fit:cover;width:100%}.fv-editor-mention-popover .fv-editor-mention-item .fv-editor-mention-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-editor-tip-popover .fv-editor-tip-panel{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-small,12px);padding:6px 8px}.fv-editor-select-dialog .fv-editor-select-group+.fv-editor-select-group{margin-top:12px}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-title{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-base,14px);font-weight:600;margin-bottom:8px}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-grid{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(96px,1fr))}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-item{align-items:center;border:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);border-radius:var(--el-border-radius-base,4px);cursor:pointer;display:flex;flex-direction:column;gap:4px;padding:8px;transition:border-color .2s}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-item:hover{border-color:var(--el-color-primary,#409eff)}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-item .fv-editor-select-preview{border-radius:var(--el-border-radius-base,4px);height:56px;object-fit:cover;width:100%}.fv-editor-select-dialog .fv-editor-select-group .fv-editor-select-item .fv-editor-select-name{color:var(--el-text-color-regular,#606266);font-size:var(--el-font-size-small,12px);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes fv-editor-slide-down{0%{max-height:0;opacity:0}to{max-height:300px;opacity:1}}.fv-thinking{background-color:var(--fv-thinking-bg,transparent);border-radius:var(--el-border-radius-base,4px);box-sizing:border-box;color:var(--fv-thinking-color,var(--el-text-color-regular,#606266));display:flex;flex-direction:column;width:100%}.fv-thinking .fv-thinking-toggle{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:inline-flex;font:inherit;font-size:var(--el-font-size-base,14px);gap:6px;line-height:22px;padding:4px 0;text-align:left;transition:color .2s;user-select:none}.fv-thinking .fv-thinking-toggle:hover{color:var(--fv-thinking-color,var(--el-color-primary,#409eff))}.fv-thinking .fv-thinking-toggle:focus{outline:none}.fv-thinking.is-disabled .fv-thinking-toggle{cursor:not-allowed;opacity:.6}.fv-thinking .fv-thinking-status-icon{align-items:center;display:inline-flex;height:16px;justify-content:center;width:16px}.fv-thinking .fv-thinking-status-icon .fv-thinking-dot{background-color:var(--el-color-primary,#409eff);border-radius:50%;height:8px;width:8px}.fv-thinking .fv-thinking-status-icon .is-loading{animation:fv-thinking-rotate 1s linear infinite;color:var(--el-color-primary,#409eff)}.fv-thinking .fv-thinking-status-icon .is-success{color:var(--el-color-success,#67c23a)}.fv-thinking .fv-thinking-status-icon .is-error{color:var(--el-color-danger,#f56c6c)}.fv-thinking .fv-thinking-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-thinking .fv-thinking-arrow{align-items:center;display:inline-flex;transition:transform .3s ease}.fv-thinking .fv-thinking-arrow.is-open{transform:rotate(180deg)}.fv-thinking .fv-thinking-content{box-sizing:border-box;color:var(--el-text-color-regular,#606266);font-size:var(--el-font-size-base,14px);line-height:22px;padding:8px 0 8px 22px;white-space:pre-wrap;word-break:break-word}@keyframes fv-thinking-rotate{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fv-chain{box-sizing:border-box;display:flex;font-size:var(--el-font-size-base,14px)}.fv-chain.is-vertical{flex-direction:column}.fv-chain.is-vertical .fv-chain-item{display:flex;gap:10px}.fv-chain.is-vertical .fv-chain-item:not(:last-child) .fv-chain-node:before{background-color:var(--el-border-color-lighter,#ebeef5);bottom:-4px;content:"";left:50%;margin-left:-1px;position:absolute;top:18px;width:2px}.fv-chain.is-horizontal{flex-direction:row;gap:24px}.fv-chain.is-horizontal .fv-chain-item{align-items:flex-start;display:flex;gap:6px}.fv-chain .fv-chain-node{align-items:center;display:inline-flex;flex-shrink:0;font-size:16px;height:18px;justify-content:center;position:relative;width:18px}.fv-chain .fv-chain-node .fv-chain-dot{background-color:var(--el-fill-color-blank,#fff);border:2px solid var(--el-border-color,#dcdfe6);border-radius:50%;box-sizing:border-box;height:8px;width:8px}.fv-chain .fv-chain-item.status-success .fv-chain-node{color:var(--el-color-success,#67c23a)}.fv-chain .fv-chain-item.status-success .fv-chain-node .fv-chain-dot{background-color:var(--el-color-success,#67c23a);border-color:var(--el-color-success,#67c23a)}.fv-chain .fv-chain-item.status-error .fv-chain-node{color:var(--el-color-danger,#f56c6c)}.fv-chain .fv-chain-item.status-error .fv-chain-node .fv-chain-dot{background-color:var(--el-color-danger,#f56c6c);border-color:var(--el-color-danger,#f56c6c)}.fv-chain .fv-chain-item.status-loading .fv-chain-node{color:var(--el-color-primary,#409eff)}.fv-chain .fv-chain-item.status-loading .fv-chain-node .is-loading{animation:fv-chain-rotate 1s linear infinite}.fv-chain .fv-chain-item.status-loading .fv-chain-node .fv-chain-dot{border-color:var(--el-color-primary,#409eff)}.fv-chain .fv-chain-item.status-pending .fv-chain-title{color:var(--el-text-color-placeholder,#a8abb2)}.fv-chain .fv-chain-main{flex:1;min-width:0;padding-bottom:4px}.fv-chain .fv-chain-main .fv-chain-title{color:var(--el-text-color-primary,#303133);line-height:22px}.fv-chain .fv-chain-main .fv-chain-description{color:var(--el-text-color-regular,#606266);font-size:var(--el-font-size-small,12px);line-height:20px;word-break:break-word}@keyframes fv-chain-rotate{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fv-welcome{box-sizing:border-box;flex-direction:column;padding:var(--el-main-padding,20px);text-align:center;width:100%}.fv-welcome,.fv-welcome-icon{align-items:center;display:flex;justify-content:center}.fv-welcome-icon{margin-bottom:16px}.fv-welcome-icon .fv-welcome-avatar{background-color:var(--el-fill-color-light,#f5f7fa);border-radius:calc(var(--el-border-radius-base, 4px) + 8px);color:var(--el-color-primary,#409eff);font-size:36px;height:72px;width:72px}.fv-welcome-name{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-extra-large,20px);font-weight:600;line-height:1.4;margin:0}.fv-welcome-description{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-base,14px);line-height:var(--el-font-line-height-primary,24px);margin:8px 0 0;max-width:480px;white-space:pre-wrap;word-break:break-word}.fv-prompts{box-sizing:border-box;width:100%}.fv-prompts .fv-prompts-title{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-base,14px);line-height:var(--el-font-line-height-primary,24px);margin-bottom:12px}.fv-prompts .fv-prompts-list{display:flex;flex-wrap:wrap;gap:12px}.fv-prompts .fv-prompt-item{background-color:var(--el-bg-color,#fff);border:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);box-sizing:border-box;cursor:pointer;flex:1 1 200px;max-width:100%;padding:12px 14px;transition:background-color var(--el-transition-duration,.3s),border-color var(--el-transition-duration,.3s)}.fv-prompts .fv-prompt-item:hover:not(.is-disabled){background-color:var(--el-fill-color-light,#f5f7fa);border-color:var(--el-border-color,#dcdfe6)}.fv-prompts .fv-prompt-item:focus-visible:not(.is-disabled){border-color:var(--el-color-primary,#409eff);outline:none}.fv-prompts .fv-prompt-item.is-disabled{background-color:var(--el-fill-color-lighter,#fafafa);cursor:not-allowed;opacity:.6}.fv-prompts .fv-prompt-item.is-disabled,.fv-prompts .fv-prompt-item.is-disabled .fv-prompt-item-description,.fv-prompts .fv-prompt-item.is-disabled .fv-prompt-item-icon,.fv-prompts .fv-prompt-item.is-disabled .fv-prompt-item-label{color:var(--el-text-color-placeholder,#a8abb2)}.fv-prompts .fv-prompt-item .fv-prompt-item-main{align-items:flex-start;display:flex;gap:10px}.fv-prompts .fv-prompt-item .fv-prompt-item-icon{color:var(--el-color-primary,#409eff);flex-shrink:0;font-size:18px;margin-top:2px}.fv-prompts .fv-prompt-item .fv-prompt-item-text{flex:1;min-width:0}.fv-prompts .fv-prompt-item .fv-prompt-item-label{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-base,14px);font-weight:500;line-height:var(--el-font-line-height-primary,24px);word-break:break-word}.fv-prompts .fv-prompt-item .fv-prompt-item-description{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-small,12px);line-height:var(--el-font-line-height-primary,24px);margin-top:2px;word-break:break-word}.fv-files-card{align-items:center;background-color:var(--el-bg-color,#fff);border:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);box-sizing:border-box;display:flex;gap:8px;max-width:100%;min-width:0;padding:8px 24px 8px 10px;position:relative;transition:border-color var(--el-transition-duration,.3s)}.fv-files-card .fv-files-card-icon{color:var(--el-color-primary,#409eff);flex-shrink:0;font-size:20px}.fv-files-card .fv-files-card-info{flex:1;min-width:0}.fv-files-card .fv-files-card-name{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-small,12px);line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-files-card .fv-files-card-size{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-extra-small,12px);line-height:16px;white-space:nowrap}.fv-files-card .fv-files-card-thumb{align-items:center;background-color:var(--el-fill-color-light,#f5f7fa);border-radius:var(--el-border-radius-base,4px);display:flex;flex-shrink:0;height:48px;justify-content:center;overflow:hidden;width:48px}.fv-files-card .fv-files-card-thumb .fv-files-card-img{display:block;height:100%;object-fit:cover;width:100%}.fv-files-card .fv-files-card-thumb .fv-files-card-thumb-placeholder{color:var(--el-text-color-placeholder,#a8abb2);font-size:20px}.fv-files-card .fv-files-card-status{align-items:center;background-color:var(--el-bg-color,#fff);border-radius:50%;bottom:-8px;display:flex;height:16px;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:16px}.fv-files-card .fv-files-card-status .fv-files-card-loading{animation:fv-files-card-rotating 1.5s linear infinite;color:var(--el-color-primary,#409eff);font-size:14px}.fv-files-card .fv-files-card-remove{align-items:center;background-color:transparent;border:none;border-radius:50%;color:var(--el-text-color-secondary,#909399);cursor:pointer;display:flex;font-size:12px;height:18px;justify-content:center;opacity:0;padding:0;position:absolute;right:2px;top:2px;transition:opacity var(--el-transition-duration,.3s),color var(--el-transition-duration,.3s),background-color var(--el-transition-duration,.3s);width:18px}.fv-files-card .fv-files-card-remove:hover{background-color:var(--el-fill-color-light,#f5f7fa);color:var(--el-color-danger,#f56c6c)}.fv-files-card:hover .fv-files-card-remove{opacity:1}.fv-files-card.is-error{border-color:var(--el-color-danger,#f56c6c)}.fv-files-card.is-error .fv-files-card-name{color:var(--el-color-danger,#f56c6c)}@keyframes fv-files-card-rotating{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fv-attachments{align-items:flex-start;box-sizing:border-box;display:flex;gap:8px;width:100%}.fv-attachments .fv-attachments-input{display:none}.fv-attachments .fv-attachments-trigger{align-items:center;background-color:transparent;border:none;border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-secondary,#909399);cursor:pointer;display:flex;flex-shrink:0;font-size:16px;height:32px;justify-content:center;padding:0;transition:color var(--el-transition-duration,.3s),background-color var(--el-transition-duration,.3s);width:32px}.fv-attachments .fv-attachments-trigger:hover:not(:disabled){background-color:var(--el-fill-color-light,#f5f7fa);color:var(--el-color-primary,#409eff)}.fv-attachments .fv-attachments-trigger.is-full,.fv-attachments .fv-attachments-trigger:disabled{color:var(--el-text-color-placeholder,#a8abb2);cursor:not-allowed}.fv-attachments .fv-attachments-list{display:flex;flex-wrap:wrap;gap:8px;min-width:0}.fv-attachments .fv-attachments-item{align-items:center;display:flex;min-width:0;position:relative}.fv-attachments .fv-attachments-item .fv-files-card{max-width:240px}.fv-attachments .fv-attachments-item .fv-attachments-retry{align-items:center;background-color:transparent;border:none;border-radius:50%;color:var(--el-text-color-secondary,#909399);cursor:pointer;display:flex;font-size:14px;height:20px;justify-content:center;margin-left:4px;padding:0;transition:color var(--el-transition-duration,.3s),background-color var(--el-transition-duration,.3s);width:20px}.fv-attachments .fv-attachments-item .fv-attachments-retry:hover{background-color:var(--el-fill-color-light,#f5f7fa);color:var(--el-color-primary,#409eff)}.fv-attachments .fv-attachments-tip{color:var(--el-text-color-placeholder,#a8abb2);flex:1;font-size:var(--el-font-size-extra-small,12px);line-height:32px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-conversations{box-sizing:border-box;overflow-y:auto;width:100%}.fv-conversations .fv-conversations-group .fv-conversations-group-title{background-color:var(--el-bg-color,#fff);color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-extra-small,12px);line-height:20px;padding:8px 12px 4px;position:sticky;top:0;z-index:1}.fv-conversations .fv-conversations-item{align-items:center;border-radius:var(--el-border-radius-base,4px);cursor:pointer;display:flex;gap:4px;padding:0 8px 0 12px;transition:background-color .2s;user-select:none}.fv-conversations .fv-conversations-item:hover{background-color:var(--el-fill-color-light,#f5f7fa)}.fv-conversations .fv-conversations-item:hover .fv-conversations-menu-btn{opacity:1;pointer-events:auto}.fv-conversations .fv-conversations-item.is-active{background-color:var(--el-color-primary-light-9,#ecf5ff);color:var(--el-color-primary,#409eff)}.fv-conversations .fv-conversations-item.is-active .fv-conversations-item-label{color:var(--el-color-primary,#409eff);font-weight:600}.fv-conversations .fv-conversations-item.is-disabled{color:var(--el-text-color-disabled,#a8abb2);cursor:not-allowed}.fv-conversations .fv-conversations-item.is-disabled .fv-conversations-item-label{color:var(--el-text-color-disabled,#a8abb2)}.fv-conversations .fv-conversations-item.is-disabled:hover{background-color:transparent}.fv-conversations .fv-conversations-item .fv-conversations-item-content{flex:1;min-width:0;padding:9px 0}.fv-conversations .fv-conversations-item .fv-conversations-item-content .fv-conversations-item-label{color:var(--el-text-color-regular,#606266);display:block;font-size:var(--el-font-size-base,14px);line-height:22px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-conversations .fv-conversations-item .fv-conversations-menu-btn{align-items:center;background:transparent;border:none;border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-secondary,#909399);cursor:pointer;display:inline-flex;flex-shrink:0;height:24px;justify-content:center;opacity:0;padding:0;pointer-events:none;transition:opacity .2s;width:24px}.fv-conversations .fv-conversations-item .fv-conversations-menu-btn:hover{background-color:var(--el-fill-color,#f0f2f5);color:var(--el-text-color-primary,#303133)}.fv-conversations.show-menu-always .fv-conversations-item .fv-conversations-menu-btn{opacity:1;pointer-events:auto}.fv-msg{align-items:flex-start;box-sizing:border-box;display:flex;gap:12px;padding:8px 0;width:100%}.fv-msg .fv-msg-avatar{background-color:var(--el-fill-color-light,#f5f7fa);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);color:var(--el-text-color-secondary,#909399);flex-shrink:0;font-size:18px;height:32px;width:32px}.fv-msg .fv-msg-avatar,.fv-msg .fv-msg-avatar-bot{align-items:center;display:flex;justify-content:center}.fv-msg .fv-msg-avatar-bot{background-color:var(--el-color-primary,#409eff);border-radius:inherit;color:#fff;height:100%;width:100%}.fv-msg.is-user .fv-msg-avatar{background-color:var(--el-color-primary-light-8,#d9ecff);color:var(--el-color-primary,#409eff);order:2}.fv-msg .fv-msg-main{align-items:flex-start;display:flex;flex:1;flex-direction:column;min-width:0}.fv-msg .fv-msg-main .fv-msg-header{align-items:center;color:var(--el-text-color-secondary,#909399);display:flex;font-size:var(--el-font-size-small,12px);gap:8px;margin-bottom:2px}.fv-msg .fv-msg-main .fv-msg-header .fv-msg-model{background-color:var(--el-fill-color,#f0f2f5);border-radius:var(--el-border-radius-base,4px);line-height:18px;padding:0 6px}.fv-msg .fv-msg-main .fv-msg-files{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:4px}.fv-msg .fv-msg-main .fv-msg-files .fv-msg-file{align-items:center;border:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-regular,#606266);display:inline-flex;font-size:var(--el-font-size-small,12px);padding:4px 8px}.fv-msg .fv-msg-main .fv-msg-files .fv-msg-file .fv-msg-file-img{border-radius:var(--el-border-radius-base,4px);max-height:64px;max-width:64px;object-fit:cover}.fv-msg .fv-msg-main .fv-msg-content{color:var(--el-text-color-primary,#303133);font-size:var(--el-font-size-base,14px);line-height:var(--el-font-line-height-primary,24px);max-width:100%;min-width:0;word-break:break-word}.fv-msg .fv-msg-main .fv-msg-content .fv-msg-error{color:var(--el-color-danger,#f56c6c)}.fv-msg .fv-msg-main .fv-msg-content .fv-msg-pending{align-items:center;display:inline-flex;gap:4px;padding:4px 0}.fv-msg .fv-msg-main .fv-msg-content .fv-msg-pending .fv-msg-dot{animation:fv-msg-blink 1s infinite;background-color:var(--el-text-color-secondary,#909399);border-radius:50%;height:6px;width:6px}.fv-msg .fv-msg-main .fv-msg-content-user{background-color:var(--el-fill-color-light,#f5f7fa);border-radius:calc(var(--el-border-radius-base, 4px) + 4px);padding:8px 12px;white-space:pre-wrap}.fv-msg.is-user{flex-direction:row;justify-content:flex-end}.fv-msg.is-user .fv-msg-main{align-items:flex-end}.fv-msg .fv-msg-actions{align-items:center;display:flex;gap:2px;margin-top:2px}.fv-msg .fv-msg-actions .el-button+.el-button{margin-left:0}.fv-msg .fv-msg-actions .fv-msg-branch{align-items:center;display:inline-flex;gap:2px;margin-left:6px}.fv-msg .fv-msg-actions .fv-msg-branch .fv-msg-branch-label{color:var(--el-text-color-secondary,#909399);font-size:var(--el-font-size-small,12px);padding:0 2px}.fv-msg.is-user .fv-msg-actions{opacity:0;pointer-events:none;transition:opacity .15s}.fv-msg.is-user .fv-msg-actions .fv-msg-branch{margin-left:0}.fv-msg.is-user:focus-within .fv-msg-actions,.fv-msg.is-user:hover .fv-msg-actions{opacity:1;pointer-events:auto}@keyframes fv-msg-blink{0%,to{opacity:.3}50%{opacity:1}}.fv-messages{box-sizing:border-box;display:flex;flex:1;flex-direction:column;min-height:0;width:100%}.fv-messages .fv-messages-scroll{box-sizing:border-box;flex:1;min-height:0;overflow-y:auto;padding:0 16px}.fv-messages .fv-messages-inner{margin:0 auto;max-width:var(--fv-messages-max-width,none)}.fv-messages .fv-messages-empty{align-items:center;box-sizing:border-box;display:flex;flex:1;flex-direction:column;justify-content:center;padding:32px 16px}.fv-messages .fv-messages-empty .fv-messages-prompts{margin-top:8px;max-width:640px;width:100%}.fv-ai-chat{background-color:var(--el-bg-color,#fff);box-sizing:border-box;color:var(--el-text-color-primary,#303133);display:flex;flex-direction:column;height:100%;min-height:0;width:100%}.fv-ai-chat .fv-ai-chat-header{align-items:center;border-bottom:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);display:flex;flex-shrink:0;gap:12px;justify-content:space-between;padding:8px 16px}.fv-ai-chat .fv-ai-chat-header .fv-ai-chat-title{font-size:var(--el-font-size-base,14px);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fv-ai-chat .fv-ai-chat-header .fv-ai-chat-models{flex-shrink:0;width:220px}.fv-ai-chat .fv-ai-chat-body{display:flex;flex:1;min-height:0;overflow:hidden}.fv-ai-chat .fv-ai-chat-footer{flex-shrink:0;padding:8px 16px 12px}.fv-ai-chat.is-center-welcome .fv-ai-chat-body{flex:0 1 auto;margin-top:auto;min-height:0}.fv-ai-chat.is-center-welcome .fv-ai-chat-footer{margin-bottom:auto}html.dark .fv-ai-chat{background-color:var(--el-bg-color,#141414)}.fv-artifacts{background-color:var(--el-bg-color,#fff);border-left:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);box-sizing:border-box;display:flex;flex-direction:column;flex-shrink:0;max-width:60%;overflow:hidden;width:420px}.fv-artifacts .fv-artifacts-tabs{align-items:center;border-bottom:var(--el-border-width,1px) solid var(--el-border-color-lighter,#ebeef5);display:flex;flex-shrink:0;gap:4px;overflow-x:auto;padding:6px 8px}.fv-artifacts .fv-artifacts-tabs .fv-artifact-tab{background:transparent;border:none;border-radius:var(--el-border-radius-base,4px);color:var(--el-text-color-regular,#606266);cursor:pointer;flex-shrink:0;font-size:var(--el-font-size-small,12px);line-height:1.4;padding:4px 10px;white-space:nowrap}.fv-artifacts .fv-artifacts-tabs .fv-artifact-tab:hover{background-color:var(--el-fill-color-light,#f5f7fa);color:var(--el-text-color-primary,#303133)}.fv-artifacts .fv-artifacts-tabs .fv-artifact-tab.is-active{background-color:var(--el-color-primary-light-9,#ecf5ff);color:var(--el-color-primary,#409eff)}.fv-artifacts .fv-artifacts-tabs .fv-artifacts-spacer{flex:1}.fv-artifacts .fv-artifacts-frame{background-color:var(--el-bg-color-page,#f2f3f5);border:none;flex:1;min-height:0;width:100%}html.dark .fv-artifacts{background-color:var(--el-bg-color,#141414)}
package/es/index.mjs CHANGED
@@ -1697,7 +1697,7 @@ const _hoisted_1$g = {
1697
1697
  class: "fv-bubble-avatar"
1698
1698
  };
1699
1699
  const _hoisted_2$e = { class: "fv-bubble-main" };
1700
- const _hoisted_3$d = {
1700
+ const _hoisted_3$e = {
1701
1701
  key: 0,
1702
1702
  class: "fv-bubble-header"
1703
1703
  };
@@ -1794,7 +1794,7 @@ var _sfc_main$g = /* @__PURE__ */ defineComponent({
1794
1794
  }, null, 8, ["size", "shape", "icon", "src", "src-set", "alt", "fit"]))
1795
1795
  ])) : createCommentVNode("v-if", true),
1796
1796
  createElementVNode("div", _hoisted_2$e, [
1797
- _ctx.$slots.header ? (openBlock(), createElementBlock("div", _hoisted_3$d, [
1797
+ _ctx.$slots.header ? (openBlock(), createElementBlock("div", _hoisted_3$e, [
1798
1798
  renderSlot(_ctx.$slots, "header")
1799
1799
  ])) : createCommentVNode("v-if", true),
1800
1800
  createElementVNode(
@@ -2240,7 +2240,7 @@ const _hoisted_1$d = {
2240
2240
  class: "fv-sender-header"
2241
2241
  };
2242
2242
  const _hoisted_2$d = { class: "fv-sender-body" };
2243
- const _hoisted_3$c = {
2243
+ const _hoisted_3$d = {
2244
2244
  key: 0,
2245
2245
  class: "fv-sender-body-top"
2246
2246
  };
@@ -2614,7 +2614,7 @@ var _sfc_main$d = /* @__PURE__ */ defineComponent({
2614
2614
  ])) : createCommentVNode("v-if", true),
2615
2615
  createElementVNode("div", _hoisted_2$d, [
2616
2616
  createCommentVNode(" body \u9876\u90E8\u533A:\u5728\u8F93\u5165\u6846\u4E0A\u65B9\u3001body \u8FB9\u6846\u5185(\u5982\u9644\u4EF6\u5217\u8868) "),
2617
- _ctx.$slots["body-top"] ? (openBlock(), createElementBlock("div", _hoisted_3$c, [
2617
+ _ctx.$slots["body-top"] ? (openBlock(), createElementBlock("div", _hoisted_3$d, [
2618
2618
  renderSlot(_ctx.$slots, "body-top")
2619
2619
  ])) : createCommentVNode("v-if", true),
2620
2620
  createCommentVNode(" \u4E3B\u4F53\u884C:\u524D\u7F00 + \u8F93\u5165 + \u64CD\u4F5C "),
@@ -2884,7 +2884,7 @@ const _hoisted_2$c = {
2884
2884
  key: 0,
2885
2885
  class: "fv-mention-title"
2886
2886
  };
2887
- const _hoisted_3$b = {
2887
+ const _hoisted_3$c = {
2888
2888
  key: 1,
2889
2889
  class: "fv-mention-loading"
2890
2890
  };
@@ -3252,7 +3252,7 @@ var _sfc_main$c = /* @__PURE__ */ defineComponent({
3252
3252
  1
3253
3253
  /* TEXT */
3254
3254
  )) : createCommentVNode("v-if", true),
3255
- asyncLoading.value ? (openBlock(), createElementBlock("div", _hoisted_3$b, "\u52A0\u8F7D\u4E2D\u2026")) : (openBlock(true), createElementBlock(
3255
+ asyncLoading.value ? (openBlock(), createElementBlock("div", _hoisted_3$c, "\u52A0\u8F7D\u4E2D\u2026")) : (openBlock(true), createElementBlock(
3256
3256
  Fragment,
3257
3257
  { key: 2 },
3258
3258
  renderList(candidates.value, (item, index) => {
@@ -3311,7 +3311,7 @@ const _hoisted_1$b = {
3311
3311
  class: "fv-editor-header"
3312
3312
  };
3313
3313
  const _hoisted_2$b = { class: "fv-editor-body" };
3314
- const _hoisted_3$a = {
3314
+ const _hoisted_3$b = {
3315
3315
  key: 0,
3316
3316
  class: "fv-editor-prefix"
3317
3317
  };
@@ -4089,7 +4089,7 @@ var _sfc_main$b = /* @__PURE__ */ defineComponent({
4089
4089
  ])) : createCommentVNode("v-if", true),
4090
4090
  createElementVNode("div", _hoisted_2$b, [
4091
4091
  createCommentVNode(" \u524D\u7F00\u533A "),
4092
- _ctx.$slots.prefix ? (openBlock(), createElementBlock("div", _hoisted_3$a, [
4092
+ _ctx.$slots.prefix ? (openBlock(), createElementBlock("div", _hoisted_3$b, [
4093
4093
  renderSlot(_ctx.$slots, "prefix")
4094
4094
  ])) : createCommentVNode("v-if", true),
4095
4095
  createElementVNode("div", _hoisted_4$a, [
@@ -4374,7 +4374,7 @@ const _hoisted_2$a = {
4374
4374
  key: 0,
4375
4375
  class: "fv-thinking-dot"
4376
4376
  };
4377
- const _hoisted_3$9 = { class: "fv-thinking-label" };
4377
+ const _hoisted_3$a = { class: "fv-thinking-label" };
4378
4378
  const _hoisted_4$9 = ["hidden"];
4379
4379
  var _sfc_main$a = /* @__PURE__ */ defineComponent({
4380
4380
  ...{ name: "FvThinking" },
@@ -4470,7 +4470,7 @@ var _sfc_main$a = /* @__PURE__ */ defineComponent({
4470
4470
  }))
4471
4471
  ])
4472
4472
  ]),
4473
- createElementVNode("span", _hoisted_3$9, [
4473
+ createElementVNode("span", _hoisted_3$a, [
4474
4474
  renderSlot(_ctx.$slots, "label", {}, () => [
4475
4475
  createTextVNode(
4476
4476
  toDisplayString(statusText.value),
@@ -4530,7 +4530,7 @@ const _hoisted_2$9 = {
4530
4530
  key: 4,
4531
4531
  class: "fv-chain-dot"
4532
4532
  };
4533
- const _hoisted_3$8 = { class: "fv-chain-main" };
4533
+ const _hoisted_3$9 = { class: "fv-chain-main" };
4534
4534
  const _hoisted_4$8 = { class: "fv-chain-title" };
4535
4535
  const _hoisted_5$4 = {
4536
4536
  key: 0,
@@ -4605,7 +4605,7 @@ var _sfc_main$9 = /* @__PURE__ */ defineComponent({
4605
4605
  })) : (openBlock(), createElementBlock("span", _hoisted_2$9))
4606
4606
  ]),
4607
4607
  createCommentVNode(" \u5185\u5BB9:#content \u4F5C\u7528\u57DF\u63D2\u69FD\u8986\u76D6\u9ED8\u8BA4 title/description "),
4608
- createElementVNode("div", _hoisted_3$8, [
4608
+ createElementVNode("div", _hoisted_3$9, [
4609
4609
  renderSlot(_ctx.$slots, "content", {
4610
4610
  item,
4611
4611
  index
@@ -4644,7 +4644,7 @@ var _sfc_main$9 = /* @__PURE__ */ defineComponent({
4644
4644
 
4645
4645
  const _hoisted_1$8 = { class: "fv-welcome" };
4646
4646
  const _hoisted_2$8 = { class: "fv-welcome-icon" };
4647
- const _hoisted_3$7 = {
4647
+ const _hoisted_3$8 = {
4648
4648
  key: 0,
4649
4649
  class: "fv-welcome-name"
4650
4650
  };
@@ -4691,7 +4691,7 @@ var _sfc_main$8 = /* @__PURE__ */ defineComponent({
4691
4691
  ])
4692
4692
  ]),
4693
4693
  createCommentVNode(" #name \u63D2\u69FD\u8986\u76D6\u540D\u79F0 "),
4694
- _ctx.$slots.name || __props.name ? (openBlock(), createElementBlock("h2", _hoisted_3$7, [
4694
+ _ctx.$slots.name || __props.name ? (openBlock(), createElementBlock("h2", _hoisted_3$8, [
4695
4695
  renderSlot(_ctx.$slots, "name", {}, () => [
4696
4696
  createTextVNode(
4697
4697
  toDisplayString(__props.name),
@@ -4720,7 +4720,7 @@ const _hoisted_2$7 = {
4720
4720
  key: 0,
4721
4721
  class: "fv-prompts-title"
4722
4722
  };
4723
- const _hoisted_3$6 = { class: "fv-prompts-list" };
4723
+ const _hoisted_3$7 = { class: "fv-prompts-list" };
4724
4724
  const _hoisted_4$6 = ["role", "tabindex", "onClick"];
4725
4725
  const _hoisted_5$3 = { class: "fv-prompt-item-main" };
4726
4726
  const _hoisted_6$2 = { class: "fv-prompt-item-text" };
@@ -4763,7 +4763,7 @@ var _sfc_main$7 = /* @__PURE__ */ defineComponent({
4763
4763
  1
4764
4764
  /* TEXT */
4765
4765
  )) : createCommentVNode("v-if", true),
4766
- createElementVNode("div", _hoisted_3$6, [
4766
+ createElementVNode("div", _hoisted_3$7, [
4767
4767
  (openBlock(true), createElementBlock(
4768
4768
  Fragment,
4769
4769
  null,
@@ -4828,7 +4828,7 @@ var _sfc_main$7 = /* @__PURE__ */ defineComponent({
4828
4828
 
4829
4829
  const _hoisted_1$6 = ["src", "alt"];
4830
4830
  const _hoisted_2$6 = { class: "fv-files-card-info" };
4831
- const _hoisted_3$5 = ["title"];
4831
+ const _hoisted_3$6 = ["title"];
4832
4832
  const _hoisted_4$5 = {
4833
4833
  key: 0,
4834
4834
  class: "fv-files-card-size"
@@ -4970,7 +4970,7 @@ var _sfc_main$6 = /* @__PURE__ */ defineComponent({
4970
4970
  createElementVNode("div", {
4971
4971
  class: "fv-files-card-name",
4972
4972
  title: __props.name
4973
- }, toDisplayString(__props.name), 9, _hoisted_3$5),
4973
+ }, toDisplayString(__props.name), 9, _hoisted_3$6),
4974
4974
  sizeText.value ? (openBlock(), createElementBlock(
4975
4975
  "div",
4976
4976
  _hoisted_4$5,
@@ -5014,7 +5014,7 @@ var _sfc_main$6 = /* @__PURE__ */ defineComponent({
5014
5014
 
5015
5015
  const _hoisted_1$5 = { class: "fv-attachments" };
5016
5016
  const _hoisted_2$5 = ["accept"];
5017
- const _hoisted_3$4 = ["disabled"];
5017
+ const _hoisted_3$5 = ["disabled"];
5018
5018
  const _hoisted_4$4 = {
5019
5019
  key: 1,
5020
5020
  class: "fv-attachments-list"
@@ -5156,7 +5156,7 @@ var _sfc_main$5 = /* @__PURE__ */ defineComponent({
5156
5156
  _: 1
5157
5157
  /* STABLE */
5158
5158
  })
5159
- ], 10, _hoisted_3$4)) : createCommentVNode("v-if", true),
5159
+ ], 10, _hoisted_3$5)) : createCommentVNode("v-if", true),
5160
5160
  createCommentVNode(" \u6587\u4EF6\u5217\u8868:FilesCard;#list-thumb/#list-item \u8986\u76D6\u9879\u6E32\u67D3(triggerOnly \u5E03\u5C40\u4E0D\u6E32\u67D3) "),
5161
5161
  list.value.length && __props.layout !== "triggerOnly" ? (openBlock(), createElementBlock("div", _hoisted_4$4, [
5162
5162
  (openBlock(true), createElementBlock(
@@ -5234,7 +5234,7 @@ const _hoisted_1$4 = {
5234
5234
  class: "fv-conversations-group-title"
5235
5235
  };
5236
5236
  const _hoisted_2$4 = ["onClick"];
5237
- const _hoisted_3$3 = { class: "fv-conversations-item-content" };
5237
+ const _hoisted_3$4 = { class: "fv-conversations-item-content" };
5238
5238
  const _hoisted_4$3 = ["title"];
5239
5239
  var _sfc_main$4 = /* @__PURE__ */ defineComponent({
5240
5240
  ...{ name: "FvConversations" },
@@ -5366,7 +5366,7 @@ var _sfc_main$4 = /* @__PURE__ */ defineComponent({
5366
5366
  onClick: ($event) => onItemClick(item)
5367
5367
  }, [
5368
5368
  createCommentVNode(" \u884C\u5185\u5BB9:#item \u8986\u76D6\u6574\u884C(\u9ED8\u8BA4\u6E32\u67D3 label) "),
5369
- createElementVNode("div", _hoisted_3$3, [
5369
+ createElementVNode("div", _hoisted_3$4, [
5370
5370
  renderSlot(_ctx.$slots, "item", {
5371
5371
  item,
5372
5372
  active: isActive(item)
@@ -6004,16 +6004,22 @@ ${fileParts.join("\n")}` });
6004
6004
  }
6005
6005
 
6006
6006
  const _hoisted_1$3 = ["data-message-id"];
6007
- const _hoisted_2$3 = { class: "fv-msg-avatar" };
6008
- const _hoisted_3$2 = { class: "fv-msg-main" };
6009
- const _hoisted_4$2 = { class: "fv-msg-header" };
6007
+ const _hoisted_2$3 = {
6008
+ key: 0,
6009
+ class: "fv-msg-avatar"
6010
+ };
6011
+ const _hoisted_3$3 = { class: "fv-msg-main" };
6012
+ const _hoisted_4$2 = {
6013
+ key: 0,
6014
+ class: "fv-msg-header"
6015
+ };
6010
6016
  const _hoisted_5 = { class: "fv-msg-role" };
6011
6017
  const _hoisted_6 = {
6012
6018
  key: 0,
6013
6019
  class: "fv-msg-model"
6014
6020
  };
6015
6021
  const _hoisted_7 = {
6016
- key: 0,
6022
+ key: 1,
6017
6023
  class: "fv-msg-files"
6018
6024
  };
6019
6025
  const _hoisted_8 = ["src", "alt"];
@@ -6022,7 +6028,7 @@ const _hoisted_9 = {
6022
6028
  class: "fv-msg-file-name"
6023
6029
  };
6024
6030
  const _hoisted_10 = {
6025
- key: 2,
6031
+ key: 3,
6026
6032
  class: "fv-msg-content"
6027
6033
  };
6028
6034
  const _hoisted_11 = {
@@ -6034,11 +6040,11 @@ const _hoisted_12 = {
6034
6040
  class: "fv-msg-pending"
6035
6041
  };
6036
6042
  const _hoisted_13 = {
6037
- key: 3,
6043
+ key: 4,
6038
6044
  class: "fv-msg-content fv-msg-content-user"
6039
6045
  };
6040
6046
  const _hoisted_14 = {
6041
- key: 4,
6047
+ key: 5,
6042
6048
  class: "fv-msg-actions"
6043
6049
  };
6044
6050
  const _hoisted_15 = {
@@ -6054,6 +6060,8 @@ var _sfc_main$3 = /* @__PURE__ */ defineComponent({
6054
6060
  branch: { type: Object, required: false, default: void 0 },
6055
6061
  showActions: { type: Boolean, required: false, default: true },
6056
6062
  showBranchSwitch: { type: Boolean, required: false, default: true },
6063
+ showUserAvatar: { type: Boolean, required: false, default: true },
6064
+ showUserName: { type: Boolean, required: false, default: true },
6057
6065
  autoCollapse: { type: Boolean, required: false, default: true }
6058
6066
  },
6059
6067
  emits: ["copy", "regenerate", "branch-change"],
@@ -6084,8 +6092,8 @@ var _sfc_main$3 = /* @__PURE__ */ defineComponent({
6084
6092
  class: normalizeClass(["fv-msg", [`is-${__props.message.role}`, { "is-error": __props.message.status === "error", "is-user": isUser.value }]]),
6085
6093
  "data-message-id": __props.message.id
6086
6094
  }, [
6087
- createCommentVNode(" \u5934\u50CF:user \u53F3\u4FA7(\u81EA\u8EAB);assistant \u5DE6\u4FA7 "),
6088
- createElementVNode("div", _hoisted_2$3, [
6095
+ createCommentVNode(" \u5934\u50CF:user \u53F3\u4FA7(\u81EA\u8EAB),assistant \u5DE6\u4FA7;showUserAvatar=false \u65F6\u7528\u6237\u6D88\u606F\u4E0D\u6E32\u67D3 "),
6096
+ !isUser.value || __props.showUserAvatar ? (openBlock(), createElementBlock("div", _hoisted_2$3, [
6089
6097
  renderSlot(_ctx.$slots, "message-avatar", { message: __props.message }, () => [
6090
6098
  isUser.value ? (openBlock(), createBlock(unref(ElIcon), {
6091
6099
  key: 0,
@@ -6107,10 +6115,10 @@ var _sfc_main$3 = /* @__PURE__ */ defineComponent({
6107
6115
  /* STABLE */
6108
6116
  }))
6109
6117
  ])
6110
- ]),
6111
- createElementVNode("div", _hoisted_3$2, [
6112
- createCommentVNode(" \u5934\u90E8:\u89D2\u8272\u540D + \u6A21\u578B\u6807\u8BB0 "),
6113
- createElementVNode("div", _hoisted_4$2, [
6118
+ ])) : createCommentVNode("v-if", true),
6119
+ createElementVNode("div", _hoisted_3$3, [
6120
+ createCommentVNode(" \u5934\u90E8:\u89D2\u8272\u540D + \u6A21\u578B\u6807\u8BB0;showUserName=false \u65F6\u7528\u6237\u6D88\u606F\u4E0D\u6E32\u67D3 "),
6121
+ !isUser.value || __props.showUserName ? (openBlock(), createElementBlock("div", _hoisted_4$2, [
6114
6122
  createElementVNode(
6115
6123
  "span",
6116
6124
  _hoisted_5,
@@ -6125,7 +6133,7 @@ var _sfc_main$3 = /* @__PURE__ */ defineComponent({
6125
6133
  1
6126
6134
  /* TEXT */
6127
6135
  )) : createCommentVNode("v-if", true)
6128
- ]),
6136
+ ])) : createCommentVNode("v-if", true),
6129
6137
  createCommentVNode(" \u9644\u4EF6:user \u6D88\u606F files \u4EE5 FilesCard \u5E73\u94FA "),
6130
6138
  __props.message.files?.length ? (openBlock(), createElementBlock("div", _hoisted_7, [
6131
6139
  renderSlot(_ctx.$slots, "message-files", {
@@ -6167,7 +6175,7 @@ var _sfc_main$3 = /* @__PURE__ */ defineComponent({
6167
6175
  ])) : createCommentVNode("v-if", true),
6168
6176
  createCommentVNode(" \u601D\u8003\u94FE\u6298\u53E0(assistant \u542B reasoning \u65F6) "),
6169
6177
  !isUser.value && hasReasoning.value ? (openBlock(), createBlock(_sfc_main$a, {
6170
- key: 1,
6178
+ key: 2,
6171
6179
  content: __props.message.reasoning,
6172
6180
  status: thinkingStatus.value,
6173
6181
  "auto-collapse": __props.autoCollapse
@@ -6219,10 +6227,10 @@ var _sfc_main$3 = /* @__PURE__ */ defineComponent({
6219
6227
  1
6220
6228
  /* TEXT */
6221
6229
  )),
6222
- createCommentVNode(" \u64CD\u4F5C\u533A:\u590D\u5236/\u91CD\u751F\u6210 + \u5206\u652F\u5207\u6362 "),
6223
- __props.showActions && !isUser.value || __props.showBranchSwitch && __props.branch && __props.branch.count > 1 ? (openBlock(), createElementBlock("div", _hoisted_14, [
6230
+ createCommentVNode(" \u64CD\u4F5C\u533A:assistant \u590D\u5236/\u91CD\u751F\u6210 + \u5206\u652F\u5207\u6362;user \u4EC5\u590D\u5236(hover \u6D88\u606F\u65F6\u6D6E\u73B0,\u89C1 scss) "),
6231
+ __props.showActions || __props.showBranchSwitch && __props.branch && __props.branch.count > 1 ? (openBlock(), createElementBlock("div", _hoisted_14, [
6224
6232
  renderSlot(_ctx.$slots, "message-actions", { message: __props.message }, () => [
6225
- __props.showActions && !isUser.value ? (openBlock(), createBlock(unref(ElTooltip), {
6233
+ __props.showActions && isUser.value ? (openBlock(), createBlock(unref(ElTooltip), {
6226
6234
  key: 0,
6227
6235
  content: "\u590D\u5236",
6228
6236
  placement: "top"
@@ -6253,6 +6261,35 @@ var _sfc_main$3 = /* @__PURE__ */ defineComponent({
6253
6261
  })) : createCommentVNode("v-if", true),
6254
6262
  __props.showActions && !isUser.value ? (openBlock(), createBlock(unref(ElTooltip), {
6255
6263
  key: 1,
6264
+ content: "\u590D\u5236",
6265
+ placement: "top"
6266
+ }, {
6267
+ default: withCtx(() => [
6268
+ createVNode(unref(ElButton), {
6269
+ text: "",
6270
+ size: "small",
6271
+ class: "fv-msg-action",
6272
+ "aria-label": "\u590D\u5236",
6273
+ onClick: onCopy
6274
+ }, {
6275
+ default: withCtx(() => [
6276
+ createVNode(unref(ElIcon), null, {
6277
+ default: withCtx(() => [
6278
+ createVNode(unref(DocumentCopy))
6279
+ ]),
6280
+ _: 1
6281
+ /* STABLE */
6282
+ })
6283
+ ]),
6284
+ _: 1
6285
+ /* STABLE */
6286
+ })
6287
+ ]),
6288
+ _: 1
6289
+ /* STABLE */
6290
+ })) : createCommentVNode("v-if", true),
6291
+ __props.showActions && !isUser.value ? (openBlock(), createBlock(unref(ElTooltip), {
6292
+ key: 2,
6256
6293
  content: "\u91CD\u65B0\u751F\u6210",
6257
6294
  placement: "top"
6258
6295
  }, {
@@ -6343,6 +6380,7 @@ const _hoisted_2$2 = {
6343
6380
  key: 0,
6344
6381
  class: "fv-messages-empty"
6345
6382
  };
6383
+ const _hoisted_3$2 = { class: "fv-messages-inner" };
6346
6384
  var _sfc_main$2 = /* @__PURE__ */ defineComponent({
6347
6385
  ...{ name: "FvAiMessages" },
6348
6386
  __name: "index",
@@ -6356,7 +6394,9 @@ var _sfc_main$2 = /* @__PURE__ */ defineComponent({
6356
6394
  suggestionsTitle: { type: String, required: false, default: "" },
6357
6395
  scrollThreshold: { type: Number, required: false, default: 40 },
6358
6396
  showActions: { type: Boolean, required: false, default: true },
6359
- showBranchSwitch: { type: Boolean, required: false, default: true }
6397
+ showBranchSwitch: { type: Boolean, required: false, default: true },
6398
+ showUserAvatar: { type: Boolean, required: false, default: true },
6399
+ showUserName: { type: Boolean, required: false, default: true }
6360
6400
  },
6361
6401
  emits: ["select", "copy", "regenerate", "branch-change"],
6362
6402
  setup(__props, { expose: __expose, emit: __emit }) {
@@ -6387,6 +6427,12 @@ var _sfc_main$2 = /* @__PURE__ */ defineComponent({
6387
6427
  watch(() => props.messages.length, (nv, ov) => {
6388
6428
  if (nv > (ov ?? 0)) scrollToBottomIfNear();
6389
6429
  });
6430
+ watch(
6431
+ () => props.messages.filter((m) => m.role === "user").length,
6432
+ (nv, ov) => {
6433
+ if (nv > (ov ?? 0)) nextTick(() => scrollToBottom());
6434
+ }
6435
+ );
6390
6436
  watch(
6391
6437
  () => props.messages.reduce((sum, m) => sum + m.content.length + (m.reasoning?.length ?? 0), 0),
6392
6438
  () => scrollToBottomIfNear()
@@ -6447,7 +6493,7 @@ var _sfc_main$2 = /* @__PURE__ */ defineComponent({
6447
6493
  Fragment,
6448
6494
  { key: 1 },
6449
6495
  [
6450
- createCommentVNode(" \u6D88\u606F\u5217\u8868 "),
6496
+ createCommentVNode(" \u6D88\u606F\u5217\u8868:\u5185\u5C42 fv-messages-inner \u63A7\u5236\u6EDA\u52A8\u5185\u5BB9\u6700\u5927\u5BBD\u5EA6\u5E76\u5DE6\u53F3\u5C45\u4E2D(--fv-messages-max-width \u53EF\u8986\u76D6) "),
6451
6497
  createElementVNode(
6452
6498
  "div",
6453
6499
  {
@@ -6456,42 +6502,46 @@ var _sfc_main$2 = /* @__PURE__ */ defineComponent({
6456
6502
  class: "fv-messages-scroll"
6457
6503
  },
6458
6504
  [
6459
- (openBlock(true), createElementBlock(
6460
- Fragment,
6461
- null,
6462
- renderList(__props.messages, (m) => {
6463
- return openBlock(), createBlock(_sfc_main$3, {
6464
- key: m.id,
6465
- message: m,
6466
- branch: branchInfo(m),
6467
- "show-actions": __props.showActions,
6468
- "show-branch-switch": __props.showBranchSwitch,
6469
- onCopy,
6470
- onRegenerate,
6471
- onBranchChange: onBranch
6472
- }, createSlots({
6473
- _: 2
6474
- /* DYNAMIC */
6475
- }, [
6476
- _ctx.$slots["message-avatar"] ? {
6477
- name: "message-avatar",
6478
- fn: withCtx((scope) => [
6479
- renderSlot(_ctx.$slots, "message-avatar", mergeProps({ ref_for: true }, scope))
6480
- ]),
6481
- key: "0"
6482
- } : void 0,
6483
- _ctx.$slots["message-actions"] ? {
6484
- name: "message-actions",
6485
- fn: withCtx((scope) => [
6486
- renderSlot(_ctx.$slots, "message-actions", mergeProps({ ref_for: true }, scope))
6487
- ]),
6488
- key: "1"
6489
- } : void 0
6490
- ]), 1032, ["message", "branch", "show-actions", "show-branch-switch"]);
6491
- }),
6492
- 128
6493
- /* KEYED_FRAGMENT */
6494
- ))
6505
+ createElementVNode("div", _hoisted_3$2, [
6506
+ (openBlock(true), createElementBlock(
6507
+ Fragment,
6508
+ null,
6509
+ renderList(__props.messages, (m) => {
6510
+ return openBlock(), createBlock(_sfc_main$3, {
6511
+ key: m.id,
6512
+ message: m,
6513
+ branch: branchInfo(m),
6514
+ "show-actions": __props.showActions,
6515
+ "show-branch-switch": __props.showBranchSwitch,
6516
+ "show-user-avatar": __props.showUserAvatar,
6517
+ "show-user-name": __props.showUserName,
6518
+ onCopy,
6519
+ onRegenerate,
6520
+ onBranchChange: onBranch
6521
+ }, createSlots({
6522
+ _: 2
6523
+ /* DYNAMIC */
6524
+ }, [
6525
+ _ctx.$slots["message-avatar"] ? {
6526
+ name: "message-avatar",
6527
+ fn: withCtx((scope) => [
6528
+ renderSlot(_ctx.$slots, "message-avatar", mergeProps({ ref_for: true }, scope))
6529
+ ]),
6530
+ key: "0"
6531
+ } : void 0,
6532
+ _ctx.$slots["message-actions"] ? {
6533
+ name: "message-actions",
6534
+ fn: withCtx((scope) => [
6535
+ renderSlot(_ctx.$slots, "message-actions", mergeProps({ ref_for: true }, scope))
6536
+ ]),
6537
+ key: "1"
6538
+ } : void 0
6539
+ ]), 1032, ["message", "branch", "show-actions", "show-branch-switch", "show-user-avatar", "show-user-name"]);
6540
+ }),
6541
+ 128
6542
+ /* KEYED_FRAGMENT */
6543
+ ))
6544
+ ])
6495
6545
  ],
6496
6546
  512
6497
6547
  /* NEED_PATCH */
@@ -6779,6 +6829,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
6779
6829
  title: { type: String, required: false, default: "" },
6780
6830
  showHeader: { type: Boolean, required: false, default: false },
6781
6831
  centerWelcome: { type: Boolean, required: false, default: true },
6832
+ showUserAvatar: { type: Boolean, required: false, default: true },
6833
+ showUserName: { type: Boolean, required: false, default: true },
6782
6834
  placeholder: { type: String, required: false, default: "" },
6783
6835
  senderShadow: { type: Boolean, required: false, default: true },
6784
6836
  suggestions: { type: Array, required: false, default: () => [] },
@@ -7042,6 +7094,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
7042
7094
  nodes: unref(nodeTable),
7043
7095
  name: __props.title,
7044
7096
  suggestions: __props.suggestions,
7097
+ "show-user-avatar": __props.showUserAvatar,
7098
+ "show-user-name": __props.showUserName,
7045
7099
  onSelect: onSelectSuggestion,
7046
7100
  onCopy,
7047
7101
  onRegenerate,
@@ -7071,7 +7125,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
7071
7125
  ]),
7072
7126
  key: "2"
7073
7127
  } : void 0
7074
- ]), 1032, ["messages", "nodes", "name", "suggestions"]),
7128
+ ]), 1032, ["messages", "nodes", "name", "suggestions", "show-user-avatar", "show-user-name"]),
7075
7129
  __props.features?.artifacts && artifacts.value.length ? (openBlock(), createBlock(_sfc_main$1, {
7076
7130
  key: 0,
7077
7131
  artifacts: artifacts.value,
package/lib/index.js CHANGED
@@ -1713,7 +1713,7 @@
1713
1713
  class: "fv-bubble-avatar"
1714
1714
  };
1715
1715
  const _hoisted_2$e = { class: "fv-bubble-main" };
1716
- const _hoisted_3$d = {
1716
+ const _hoisted_3$e = {
1717
1717
  key: 0,
1718
1718
  class: "fv-bubble-header"
1719
1719
  };
@@ -1810,7 +1810,7 @@
1810
1810
  }, null, 8, ["size", "shape", "icon", "src", "src-set", "alt", "fit"]))
1811
1811
  ])) : vue.createCommentVNode("v-if", true),
1812
1812
  vue.createElementVNode("div", _hoisted_2$e, [
1813
- _ctx.$slots.header ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$d, [
1813
+ _ctx.$slots.header ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$e, [
1814
1814
  vue.renderSlot(_ctx.$slots, "header")
1815
1815
  ])) : vue.createCommentVNode("v-if", true),
1816
1816
  vue.createElementVNode(
@@ -2256,7 +2256,7 @@
2256
2256
  class: "fv-sender-header"
2257
2257
  };
2258
2258
  const _hoisted_2$d = { class: "fv-sender-body" };
2259
- const _hoisted_3$c = {
2259
+ const _hoisted_3$d = {
2260
2260
  key: 0,
2261
2261
  class: "fv-sender-body-top"
2262
2262
  };
@@ -2630,7 +2630,7 @@
2630
2630
  ])) : vue.createCommentVNode("v-if", true),
2631
2631
  vue.createElementVNode("div", _hoisted_2$d, [
2632
2632
  vue.createCommentVNode(" body \u9876\u90E8\u533A:\u5728\u8F93\u5165\u6846\u4E0A\u65B9\u3001body \u8FB9\u6846\u5185(\u5982\u9644\u4EF6\u5217\u8868) "),
2633
- _ctx.$slots["body-top"] ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$c, [
2633
+ _ctx.$slots["body-top"] ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$d, [
2634
2634
  vue.renderSlot(_ctx.$slots, "body-top")
2635
2635
  ])) : vue.createCommentVNode("v-if", true),
2636
2636
  vue.createCommentVNode(" \u4E3B\u4F53\u884C:\u524D\u7F00 + \u8F93\u5165 + \u64CD\u4F5C "),
@@ -2900,7 +2900,7 @@
2900
2900
  key: 0,
2901
2901
  class: "fv-mention-title"
2902
2902
  };
2903
- const _hoisted_3$b = {
2903
+ const _hoisted_3$c = {
2904
2904
  key: 1,
2905
2905
  class: "fv-mention-loading"
2906
2906
  };
@@ -3268,7 +3268,7 @@
3268
3268
  1
3269
3269
  /* TEXT */
3270
3270
  )) : vue.createCommentVNode("v-if", true),
3271
- asyncLoading.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$b, "\u52A0\u8F7D\u4E2D\u2026")) : (vue.openBlock(true), vue.createElementBlock(
3271
+ asyncLoading.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$c, "\u52A0\u8F7D\u4E2D\u2026")) : (vue.openBlock(true), vue.createElementBlock(
3272
3272
  vue.Fragment,
3273
3273
  { key: 2 },
3274
3274
  vue.renderList(candidates.value, (item, index) => {
@@ -3327,7 +3327,7 @@
3327
3327
  class: "fv-editor-header"
3328
3328
  };
3329
3329
  const _hoisted_2$b = { class: "fv-editor-body" };
3330
- const _hoisted_3$a = {
3330
+ const _hoisted_3$b = {
3331
3331
  key: 0,
3332
3332
  class: "fv-editor-prefix"
3333
3333
  };
@@ -4105,7 +4105,7 @@
4105
4105
  ])) : vue.createCommentVNode("v-if", true),
4106
4106
  vue.createElementVNode("div", _hoisted_2$b, [
4107
4107
  vue.createCommentVNode(" \u524D\u7F00\u533A "),
4108
- _ctx.$slots.prefix ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$a, [
4108
+ _ctx.$slots.prefix ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$b, [
4109
4109
  vue.renderSlot(_ctx.$slots, "prefix")
4110
4110
  ])) : vue.createCommentVNode("v-if", true),
4111
4111
  vue.createElementVNode("div", _hoisted_4$a, [
@@ -4390,7 +4390,7 @@
4390
4390
  key: 0,
4391
4391
  class: "fv-thinking-dot"
4392
4392
  };
4393
- const _hoisted_3$9 = { class: "fv-thinking-label" };
4393
+ const _hoisted_3$a = { class: "fv-thinking-label" };
4394
4394
  const _hoisted_4$9 = ["hidden"];
4395
4395
  var _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
4396
4396
  ...{ name: "FvThinking" },
@@ -4486,7 +4486,7 @@
4486
4486
  }))
4487
4487
  ])
4488
4488
  ]),
4489
- vue.createElementVNode("span", _hoisted_3$9, [
4489
+ vue.createElementVNode("span", _hoisted_3$a, [
4490
4490
  vue.renderSlot(_ctx.$slots, "label", {}, () => [
4491
4491
  vue.createTextVNode(
4492
4492
  vue.toDisplayString(statusText.value),
@@ -4546,7 +4546,7 @@
4546
4546
  key: 4,
4547
4547
  class: "fv-chain-dot"
4548
4548
  };
4549
- const _hoisted_3$8 = { class: "fv-chain-main" };
4549
+ const _hoisted_3$9 = { class: "fv-chain-main" };
4550
4550
  const _hoisted_4$8 = { class: "fv-chain-title" };
4551
4551
  const _hoisted_5$4 = {
4552
4552
  key: 0,
@@ -4621,7 +4621,7 @@
4621
4621
  })) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_2$9))
4622
4622
  ]),
4623
4623
  vue.createCommentVNode(" \u5185\u5BB9:#content \u4F5C\u7528\u57DF\u63D2\u69FD\u8986\u76D6\u9ED8\u8BA4 title/description "),
4624
- vue.createElementVNode("div", _hoisted_3$8, [
4624
+ vue.createElementVNode("div", _hoisted_3$9, [
4625
4625
  vue.renderSlot(_ctx.$slots, "content", {
4626
4626
  item,
4627
4627
  index
@@ -4660,7 +4660,7 @@
4660
4660
 
4661
4661
  const _hoisted_1$8 = { class: "fv-welcome" };
4662
4662
  const _hoisted_2$8 = { class: "fv-welcome-icon" };
4663
- const _hoisted_3$7 = {
4663
+ const _hoisted_3$8 = {
4664
4664
  key: 0,
4665
4665
  class: "fv-welcome-name"
4666
4666
  };
@@ -4707,7 +4707,7 @@
4707
4707
  ])
4708
4708
  ]),
4709
4709
  vue.createCommentVNode(" #name \u63D2\u69FD\u8986\u76D6\u540D\u79F0 "),
4710
- _ctx.$slots.name || __props.name ? (vue.openBlock(), vue.createElementBlock("h2", _hoisted_3$7, [
4710
+ _ctx.$slots.name || __props.name ? (vue.openBlock(), vue.createElementBlock("h2", _hoisted_3$8, [
4711
4711
  vue.renderSlot(_ctx.$slots, "name", {}, () => [
4712
4712
  vue.createTextVNode(
4713
4713
  vue.toDisplayString(__props.name),
@@ -4736,7 +4736,7 @@
4736
4736
  key: 0,
4737
4737
  class: "fv-prompts-title"
4738
4738
  };
4739
- const _hoisted_3$6 = { class: "fv-prompts-list" };
4739
+ const _hoisted_3$7 = { class: "fv-prompts-list" };
4740
4740
  const _hoisted_4$6 = ["role", "tabindex", "onClick"];
4741
4741
  const _hoisted_5$3 = { class: "fv-prompt-item-main" };
4742
4742
  const _hoisted_6$2 = { class: "fv-prompt-item-text" };
@@ -4779,7 +4779,7 @@
4779
4779
  1
4780
4780
  /* TEXT */
4781
4781
  )) : vue.createCommentVNode("v-if", true),
4782
- vue.createElementVNode("div", _hoisted_3$6, [
4782
+ vue.createElementVNode("div", _hoisted_3$7, [
4783
4783
  (vue.openBlock(true), vue.createElementBlock(
4784
4784
  vue.Fragment,
4785
4785
  null,
@@ -4844,7 +4844,7 @@
4844
4844
 
4845
4845
  const _hoisted_1$6 = ["src", "alt"];
4846
4846
  const _hoisted_2$6 = { class: "fv-files-card-info" };
4847
- const _hoisted_3$5 = ["title"];
4847
+ const _hoisted_3$6 = ["title"];
4848
4848
  const _hoisted_4$5 = {
4849
4849
  key: 0,
4850
4850
  class: "fv-files-card-size"
@@ -4986,7 +4986,7 @@
4986
4986
  vue.createElementVNode("div", {
4987
4987
  class: "fv-files-card-name",
4988
4988
  title: __props.name
4989
- }, vue.toDisplayString(__props.name), 9, _hoisted_3$5),
4989
+ }, vue.toDisplayString(__props.name), 9, _hoisted_3$6),
4990
4990
  sizeText.value ? (vue.openBlock(), vue.createElementBlock(
4991
4991
  "div",
4992
4992
  _hoisted_4$5,
@@ -5030,7 +5030,7 @@
5030
5030
 
5031
5031
  const _hoisted_1$5 = { class: "fv-attachments" };
5032
5032
  const _hoisted_2$5 = ["accept"];
5033
- const _hoisted_3$4 = ["disabled"];
5033
+ const _hoisted_3$5 = ["disabled"];
5034
5034
  const _hoisted_4$4 = {
5035
5035
  key: 1,
5036
5036
  class: "fv-attachments-list"
@@ -5172,7 +5172,7 @@
5172
5172
  _: 1
5173
5173
  /* STABLE */
5174
5174
  })
5175
- ], 10, _hoisted_3$4)) : vue.createCommentVNode("v-if", true),
5175
+ ], 10, _hoisted_3$5)) : vue.createCommentVNode("v-if", true),
5176
5176
  vue.createCommentVNode(" \u6587\u4EF6\u5217\u8868:FilesCard;#list-thumb/#list-item \u8986\u76D6\u9879\u6E32\u67D3(triggerOnly \u5E03\u5C40\u4E0D\u6E32\u67D3) "),
5177
5177
  list.value.length && __props.layout !== "triggerOnly" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$4, [
5178
5178
  (vue.openBlock(true), vue.createElementBlock(
@@ -5250,7 +5250,7 @@
5250
5250
  class: "fv-conversations-group-title"
5251
5251
  };
5252
5252
  const _hoisted_2$4 = ["onClick"];
5253
- const _hoisted_3$3 = { class: "fv-conversations-item-content" };
5253
+ const _hoisted_3$4 = { class: "fv-conversations-item-content" };
5254
5254
  const _hoisted_4$3 = ["title"];
5255
5255
  var _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
5256
5256
  ...{ name: "FvConversations" },
@@ -5382,7 +5382,7 @@
5382
5382
  onClick: ($event) => onItemClick(item)
5383
5383
  }, [
5384
5384
  vue.createCommentVNode(" \u884C\u5185\u5BB9:#item \u8986\u76D6\u6574\u884C(\u9ED8\u8BA4\u6E32\u67D3 label) "),
5385
- vue.createElementVNode("div", _hoisted_3$3, [
5385
+ vue.createElementVNode("div", _hoisted_3$4, [
5386
5386
  vue.renderSlot(_ctx.$slots, "item", {
5387
5387
  item,
5388
5388
  active: isActive(item)
@@ -6020,16 +6020,22 @@ ${fileParts.join("\n")}` });
6020
6020
  }
6021
6021
 
6022
6022
  const _hoisted_1$3 = ["data-message-id"];
6023
- const _hoisted_2$3 = { class: "fv-msg-avatar" };
6024
- const _hoisted_3$2 = { class: "fv-msg-main" };
6025
- const _hoisted_4$2 = { class: "fv-msg-header" };
6023
+ const _hoisted_2$3 = {
6024
+ key: 0,
6025
+ class: "fv-msg-avatar"
6026
+ };
6027
+ const _hoisted_3$3 = { class: "fv-msg-main" };
6028
+ const _hoisted_4$2 = {
6029
+ key: 0,
6030
+ class: "fv-msg-header"
6031
+ };
6026
6032
  const _hoisted_5 = { class: "fv-msg-role" };
6027
6033
  const _hoisted_6 = {
6028
6034
  key: 0,
6029
6035
  class: "fv-msg-model"
6030
6036
  };
6031
6037
  const _hoisted_7 = {
6032
- key: 0,
6038
+ key: 1,
6033
6039
  class: "fv-msg-files"
6034
6040
  };
6035
6041
  const _hoisted_8 = ["src", "alt"];
@@ -6038,7 +6044,7 @@ ${fileParts.join("\n")}` });
6038
6044
  class: "fv-msg-file-name"
6039
6045
  };
6040
6046
  const _hoisted_10 = {
6041
- key: 2,
6047
+ key: 3,
6042
6048
  class: "fv-msg-content"
6043
6049
  };
6044
6050
  const _hoisted_11 = {
@@ -6050,11 +6056,11 @@ ${fileParts.join("\n")}` });
6050
6056
  class: "fv-msg-pending"
6051
6057
  };
6052
6058
  const _hoisted_13 = {
6053
- key: 3,
6059
+ key: 4,
6054
6060
  class: "fv-msg-content fv-msg-content-user"
6055
6061
  };
6056
6062
  const _hoisted_14 = {
6057
- key: 4,
6063
+ key: 5,
6058
6064
  class: "fv-msg-actions"
6059
6065
  };
6060
6066
  const _hoisted_15 = {
@@ -6070,6 +6076,8 @@ ${fileParts.join("\n")}` });
6070
6076
  branch: { type: Object, required: false, default: void 0 },
6071
6077
  showActions: { type: Boolean, required: false, default: true },
6072
6078
  showBranchSwitch: { type: Boolean, required: false, default: true },
6079
+ showUserAvatar: { type: Boolean, required: false, default: true },
6080
+ showUserName: { type: Boolean, required: false, default: true },
6073
6081
  autoCollapse: { type: Boolean, required: false, default: true }
6074
6082
  },
6075
6083
  emits: ["copy", "regenerate", "branch-change"],
@@ -6100,8 +6108,8 @@ ${fileParts.join("\n")}` });
6100
6108
  class: vue.normalizeClass(["fv-msg", [`is-${__props.message.role}`, { "is-error": __props.message.status === "error", "is-user": isUser.value }]]),
6101
6109
  "data-message-id": __props.message.id
6102
6110
  }, [
6103
- vue.createCommentVNode(" \u5934\u50CF:user \u53F3\u4FA7(\u81EA\u8EAB);assistant \u5DE6\u4FA7 "),
6104
- vue.createElementVNode("div", _hoisted_2$3, [
6111
+ vue.createCommentVNode(" \u5934\u50CF:user \u53F3\u4FA7(\u81EA\u8EAB),assistant \u5DE6\u4FA7;showUserAvatar=false \u65F6\u7528\u6237\u6D88\u606F\u4E0D\u6E32\u67D3 "),
6112
+ !isUser.value || __props.showUserAvatar ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$3, [
6105
6113
  vue.renderSlot(_ctx.$slots, "message-avatar", { message: __props.message }, () => [
6106
6114
  isUser.value ? (vue.openBlock(), vue.createBlock(vue.unref(elementPlus.ElIcon), {
6107
6115
  key: 0,
@@ -6123,10 +6131,10 @@ ${fileParts.join("\n")}` });
6123
6131
  /* STABLE */
6124
6132
  }))
6125
6133
  ])
6126
- ]),
6127
- vue.createElementVNode("div", _hoisted_3$2, [
6128
- vue.createCommentVNode(" \u5934\u90E8:\u89D2\u8272\u540D + \u6A21\u578B\u6807\u8BB0 "),
6129
- vue.createElementVNode("div", _hoisted_4$2, [
6134
+ ])) : vue.createCommentVNode("v-if", true),
6135
+ vue.createElementVNode("div", _hoisted_3$3, [
6136
+ vue.createCommentVNode(" \u5934\u90E8:\u89D2\u8272\u540D + \u6A21\u578B\u6807\u8BB0;showUserName=false \u65F6\u7528\u6237\u6D88\u606F\u4E0D\u6E32\u67D3 "),
6137
+ !isUser.value || __props.showUserName ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$2, [
6130
6138
  vue.createElementVNode(
6131
6139
  "span",
6132
6140
  _hoisted_5,
@@ -6141,7 +6149,7 @@ ${fileParts.join("\n")}` });
6141
6149
  1
6142
6150
  /* TEXT */
6143
6151
  )) : vue.createCommentVNode("v-if", true)
6144
- ]),
6152
+ ])) : vue.createCommentVNode("v-if", true),
6145
6153
  vue.createCommentVNode(" \u9644\u4EF6:user \u6D88\u606F files \u4EE5 FilesCard \u5E73\u94FA "),
6146
6154
  __props.message.files?.length ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7, [
6147
6155
  vue.renderSlot(_ctx.$slots, "message-files", {
@@ -6183,7 +6191,7 @@ ${fileParts.join("\n")}` });
6183
6191
  ])) : vue.createCommentVNode("v-if", true),
6184
6192
  vue.createCommentVNode(" \u601D\u8003\u94FE\u6298\u53E0(assistant \u542B reasoning \u65F6) "),
6185
6193
  !isUser.value && hasReasoning.value ? (vue.openBlock(), vue.createBlock(_sfc_main$a, {
6186
- key: 1,
6194
+ key: 2,
6187
6195
  content: __props.message.reasoning,
6188
6196
  status: thinkingStatus.value,
6189
6197
  "auto-collapse": __props.autoCollapse
@@ -6235,10 +6243,10 @@ ${fileParts.join("\n")}` });
6235
6243
  1
6236
6244
  /* TEXT */
6237
6245
  )),
6238
- vue.createCommentVNode(" \u64CD\u4F5C\u533A:\u590D\u5236/\u91CD\u751F\u6210 + \u5206\u652F\u5207\u6362 "),
6239
- __props.showActions && !isUser.value || __props.showBranchSwitch && __props.branch && __props.branch.count > 1 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_14, [
6246
+ vue.createCommentVNode(" \u64CD\u4F5C\u533A:assistant \u590D\u5236/\u91CD\u751F\u6210 + \u5206\u652F\u5207\u6362;user \u4EC5\u590D\u5236(hover \u6D88\u606F\u65F6\u6D6E\u73B0,\u89C1 scss) "),
6247
+ __props.showActions || __props.showBranchSwitch && __props.branch && __props.branch.count > 1 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_14, [
6240
6248
  vue.renderSlot(_ctx.$slots, "message-actions", { message: __props.message }, () => [
6241
- __props.showActions && !isUser.value ? (vue.openBlock(), vue.createBlock(vue.unref(elementPlus.ElTooltip), {
6249
+ __props.showActions && isUser.value ? (vue.openBlock(), vue.createBlock(vue.unref(elementPlus.ElTooltip), {
6242
6250
  key: 0,
6243
6251
  content: "\u590D\u5236",
6244
6252
  placement: "top"
@@ -6269,6 +6277,35 @@ ${fileParts.join("\n")}` });
6269
6277
  })) : vue.createCommentVNode("v-if", true),
6270
6278
  __props.showActions && !isUser.value ? (vue.openBlock(), vue.createBlock(vue.unref(elementPlus.ElTooltip), {
6271
6279
  key: 1,
6280
+ content: "\u590D\u5236",
6281
+ placement: "top"
6282
+ }, {
6283
+ default: vue.withCtx(() => [
6284
+ vue.createVNode(vue.unref(elementPlus.ElButton), {
6285
+ text: "",
6286
+ size: "small",
6287
+ class: "fv-msg-action",
6288
+ "aria-label": "\u590D\u5236",
6289
+ onClick: onCopy
6290
+ }, {
6291
+ default: vue.withCtx(() => [
6292
+ vue.createVNode(vue.unref(elementPlus.ElIcon), null, {
6293
+ default: vue.withCtx(() => [
6294
+ vue.createVNode(vue.unref(ElementPlusIconsVue.DocumentCopy))
6295
+ ]),
6296
+ _: 1
6297
+ /* STABLE */
6298
+ })
6299
+ ]),
6300
+ _: 1
6301
+ /* STABLE */
6302
+ })
6303
+ ]),
6304
+ _: 1
6305
+ /* STABLE */
6306
+ })) : vue.createCommentVNode("v-if", true),
6307
+ __props.showActions && !isUser.value ? (vue.openBlock(), vue.createBlock(vue.unref(elementPlus.ElTooltip), {
6308
+ key: 2,
6272
6309
  content: "\u91CD\u65B0\u751F\u6210",
6273
6310
  placement: "top"
6274
6311
  }, {
@@ -6359,6 +6396,7 @@ ${fileParts.join("\n")}` });
6359
6396
  key: 0,
6360
6397
  class: "fv-messages-empty"
6361
6398
  };
6399
+ const _hoisted_3$2 = { class: "fv-messages-inner" };
6362
6400
  var _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
6363
6401
  ...{ name: "FvAiMessages" },
6364
6402
  __name: "index",
@@ -6372,7 +6410,9 @@ ${fileParts.join("\n")}` });
6372
6410
  suggestionsTitle: { type: String, required: false, default: "" },
6373
6411
  scrollThreshold: { type: Number, required: false, default: 40 },
6374
6412
  showActions: { type: Boolean, required: false, default: true },
6375
- showBranchSwitch: { type: Boolean, required: false, default: true }
6413
+ showBranchSwitch: { type: Boolean, required: false, default: true },
6414
+ showUserAvatar: { type: Boolean, required: false, default: true },
6415
+ showUserName: { type: Boolean, required: false, default: true }
6376
6416
  },
6377
6417
  emits: ["select", "copy", "regenerate", "branch-change"],
6378
6418
  setup(__props, { expose: __expose, emit: __emit }) {
@@ -6403,6 +6443,12 @@ ${fileParts.join("\n")}` });
6403
6443
  vue.watch(() => props.messages.length, (nv, ov) => {
6404
6444
  if (nv > (ov ?? 0)) scrollToBottomIfNear();
6405
6445
  });
6446
+ vue.watch(
6447
+ () => props.messages.filter((m) => m.role === "user").length,
6448
+ (nv, ov) => {
6449
+ if (nv > (ov ?? 0)) vue.nextTick(() => scrollToBottom());
6450
+ }
6451
+ );
6406
6452
  vue.watch(
6407
6453
  () => props.messages.reduce((sum, m) => sum + m.content.length + (m.reasoning?.length ?? 0), 0),
6408
6454
  () => scrollToBottomIfNear()
@@ -6463,7 +6509,7 @@ ${fileParts.join("\n")}` });
6463
6509
  vue.Fragment,
6464
6510
  { key: 1 },
6465
6511
  [
6466
- vue.createCommentVNode(" \u6D88\u606F\u5217\u8868 "),
6512
+ vue.createCommentVNode(" \u6D88\u606F\u5217\u8868:\u5185\u5C42 fv-messages-inner \u63A7\u5236\u6EDA\u52A8\u5185\u5BB9\u6700\u5927\u5BBD\u5EA6\u5E76\u5DE6\u53F3\u5C45\u4E2D(--fv-messages-max-width \u53EF\u8986\u76D6) "),
6467
6513
  vue.createElementVNode(
6468
6514
  "div",
6469
6515
  {
@@ -6472,42 +6518,46 @@ ${fileParts.join("\n")}` });
6472
6518
  class: "fv-messages-scroll"
6473
6519
  },
6474
6520
  [
6475
- (vue.openBlock(true), vue.createElementBlock(
6476
- vue.Fragment,
6477
- null,
6478
- vue.renderList(__props.messages, (m) => {
6479
- return vue.openBlock(), vue.createBlock(_sfc_main$3, {
6480
- key: m.id,
6481
- message: m,
6482
- branch: branchInfo(m),
6483
- "show-actions": __props.showActions,
6484
- "show-branch-switch": __props.showBranchSwitch,
6485
- onCopy,
6486
- onRegenerate,
6487
- onBranchChange: onBranch
6488
- }, vue.createSlots({
6489
- _: 2
6490
- /* DYNAMIC */
6491
- }, [
6492
- _ctx.$slots["message-avatar"] ? {
6493
- name: "message-avatar",
6494
- fn: vue.withCtx((scope) => [
6495
- vue.renderSlot(_ctx.$slots, "message-avatar", vue.mergeProps({ ref_for: true }, scope))
6496
- ]),
6497
- key: "0"
6498
- } : void 0,
6499
- _ctx.$slots["message-actions"] ? {
6500
- name: "message-actions",
6501
- fn: vue.withCtx((scope) => [
6502
- vue.renderSlot(_ctx.$slots, "message-actions", vue.mergeProps({ ref_for: true }, scope))
6503
- ]),
6504
- key: "1"
6505
- } : void 0
6506
- ]), 1032, ["message", "branch", "show-actions", "show-branch-switch"]);
6507
- }),
6508
- 128
6509
- /* KEYED_FRAGMENT */
6510
- ))
6521
+ vue.createElementVNode("div", _hoisted_3$2, [
6522
+ (vue.openBlock(true), vue.createElementBlock(
6523
+ vue.Fragment,
6524
+ null,
6525
+ vue.renderList(__props.messages, (m) => {
6526
+ return vue.openBlock(), vue.createBlock(_sfc_main$3, {
6527
+ key: m.id,
6528
+ message: m,
6529
+ branch: branchInfo(m),
6530
+ "show-actions": __props.showActions,
6531
+ "show-branch-switch": __props.showBranchSwitch,
6532
+ "show-user-avatar": __props.showUserAvatar,
6533
+ "show-user-name": __props.showUserName,
6534
+ onCopy,
6535
+ onRegenerate,
6536
+ onBranchChange: onBranch
6537
+ }, vue.createSlots({
6538
+ _: 2
6539
+ /* DYNAMIC */
6540
+ }, [
6541
+ _ctx.$slots["message-avatar"] ? {
6542
+ name: "message-avatar",
6543
+ fn: vue.withCtx((scope) => [
6544
+ vue.renderSlot(_ctx.$slots, "message-avatar", vue.mergeProps({ ref_for: true }, scope))
6545
+ ]),
6546
+ key: "0"
6547
+ } : void 0,
6548
+ _ctx.$slots["message-actions"] ? {
6549
+ name: "message-actions",
6550
+ fn: vue.withCtx((scope) => [
6551
+ vue.renderSlot(_ctx.$slots, "message-actions", vue.mergeProps({ ref_for: true }, scope))
6552
+ ]),
6553
+ key: "1"
6554
+ } : void 0
6555
+ ]), 1032, ["message", "branch", "show-actions", "show-branch-switch", "show-user-avatar", "show-user-name"]);
6556
+ }),
6557
+ 128
6558
+ /* KEYED_FRAGMENT */
6559
+ ))
6560
+ ])
6511
6561
  ],
6512
6562
  512
6513
6563
  /* NEED_PATCH */
@@ -6795,6 +6845,8 @@ ${fileParts.join("\n")}` });
6795
6845
  title: { type: String, required: false, default: "" },
6796
6846
  showHeader: { type: Boolean, required: false, default: false },
6797
6847
  centerWelcome: { type: Boolean, required: false, default: true },
6848
+ showUserAvatar: { type: Boolean, required: false, default: true },
6849
+ showUserName: { type: Boolean, required: false, default: true },
6798
6850
  placeholder: { type: String, required: false, default: "" },
6799
6851
  senderShadow: { type: Boolean, required: false, default: true },
6800
6852
  suggestions: { type: Array, required: false, default: () => [] },
@@ -7058,6 +7110,8 @@ ${fileParts.join("\n")}` });
7058
7110
  nodes: vue.unref(nodeTable),
7059
7111
  name: __props.title,
7060
7112
  suggestions: __props.suggestions,
7113
+ "show-user-avatar": __props.showUserAvatar,
7114
+ "show-user-name": __props.showUserName,
7061
7115
  onSelect: onSelectSuggestion,
7062
7116
  onCopy,
7063
7117
  onRegenerate,
@@ -7087,7 +7141,7 @@ ${fileParts.join("\n")}` });
7087
7141
  ]),
7088
7142
  key: "2"
7089
7143
  } : void 0
7090
- ]), 1032, ["messages", "nodes", "name", "suggestions"]),
7144
+ ]), 1032, ["messages", "nodes", "name", "suggestions", "show-user-avatar", "show-user-name"]),
7091
7145
  __props.features?.artifacts && artifacts.value.length ? (vue.openBlock(), vue.createBlock(_sfc_main$1, {
7092
7146
  key: 0,
7093
7147
  artifacts: artifacts.value,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fv-ui/ai-chat",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "基于 Vue3 + Element Plus 的 AI 对话组件库",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",