Version: 0.9.42.dev.260424
后端: 1. 新增课表图片识别接口,支持上传截图后返回“可编辑草稿”(success / partial / reject),并补齐大图、空图、格式不支持、识别能力未配置等错误分支。 2. 课表识别服务接入多模态 Responses 链路,完善图片请求归一化与安全校验(大小、MIME、内容探测),并对识别结果做结构化清洗、强/弱约束校验、告警去重与默认文案兜底。 3. 新增 Ark Responses 统一客户端抽象,支持文本+图片输入、JSON对象输出、usage统计透传与不完整输出识别;同时补齐模型返回 finish_reason 透传,便于定位截断问题。 4. 启动阶段增加课表识图模型与参数注入(模型名、最大图片字节、最大输出token),并将配置示例收敛为“仅保留当前代码实际读取项”。 前端: 5. 课表中心新增“导入课表”完整闭环:上传图片识别、草稿编辑校对、正式导入落库;并新增对应 API 与类型定义。 6. 导入弹窗支持识别中止、全局告警与行级告警展示、低置信度提示、行内编辑、手动新增、删除、拖拽排序、本地校验与提交前二次确认。 7. 正式导入前将草稿按“课程名+地点+是否允许嵌入”聚合为导入结构,并统一携带幂等键请求头,降低重复提交风险。 8. 周课表画板修复跨节次事件遮挡导致的网格错位问题,改进“完全遮挡/部分遮挡”渲染判定与 grid 行定位。 9. 助手流式区域优化“思考中”指示逻辑与样式,避免已有正文时仍展示回答中占位;同时补充全局组件视觉统一(弹窗/按钮)样式。 仓库: 10. 新增课表图片识别前端对接说明文档,补充主动优化能力 PRD 讨论稿,并在协作规范中新增“实现 Eino 新能力前需先查官方文档”的约束。
This commit is contained in:
@@ -1189,7 +1189,9 @@ function shouldShowDisplayReasoningBox(dm: DisplayMessage): boolean {
|
||||
}
|
||||
|
||||
function shouldShowDisplayAnsweringIndicator(dm: DisplayMessage): boolean {
|
||||
return isDisplayStreaming(dm) && dm.sources.every(m => thinkingMessageMap[m.id] !== true)
|
||||
return isDisplayStreaming(dm) &&
|
||||
dm.sources.every(m => thinkingMessageMap[m.id] !== true) &&
|
||||
!dm.content.trim()
|
||||
}
|
||||
|
||||
function isDisplayReasoningCollapsed(dm: DisplayMessage): boolean {
|
||||
@@ -2714,10 +2716,8 @@ onBeforeUnmount(() => {
|
||||
v-html="renderMessageMarkdown(block.text)"
|
||||
/>
|
||||
<div v-else class="chat-message__streaming chat-message__streaming--reasoning">
|
||||
<div class="typing-indicator">
|
||||
<span />
|
||||
<span />
|
||||
<span />
|
||||
<div class="thinking-indicator">
|
||||
<span class="thinking-indicator__text">正在思考</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -2735,10 +2735,8 @@ onBeforeUnmount(() => {
|
||||
</template>
|
||||
|
||||
<div v-else-if="block.type === 'content_indicator'" class="assistant-timeline__answering-indicator">
|
||||
<div class="typing-indicator">
|
||||
<span />
|
||||
<span />
|
||||
<span />
|
||||
<div class="thinking-indicator">
|
||||
<span class="thinking-indicator__text">正在思考</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -4652,26 +4650,33 @@ onBeforeUnmount(() => {
|
||||
border-color: rgba(15, 23, 42, 0.08);
|
||||
}
|
||||
|
||||
.typing-indicator {
|
||||
display: flex;
|
||||
.thinking-indicator {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.typing-indicator span {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 999px;
|
||||
background: #86a9dd;
|
||||
animation: typing-bounce 1.2s ease-in-out infinite;
|
||||
.thinking-indicator__text {
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
color: #64748b;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
#64748b 0%,
|
||||
#64748b 25%,
|
||||
#e2e8f0 50%,
|
||||
#64748b 75%,
|
||||
#64748b 100%
|
||||
);
|
||||
background-size: 200% 100%;
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
animation: thinking-shimmer 2s infinite linear;
|
||||
}
|
||||
|
||||
.typing-indicator span:nth-child(2) {
|
||||
animation-delay: 0.12s;
|
||||
}
|
||||
|
||||
.typing-indicator span:nth-child(3) {
|
||||
animation-delay: 0.24s;
|
||||
@keyframes thinking-shimmer {
|
||||
from { background-position: 200% 0; }
|
||||
to { background-position: 0% 0; }
|
||||
}
|
||||
|
||||
@keyframes confirm-card-enter {
|
||||
@@ -4679,11 +4684,6 @@ onBeforeUnmount(() => {
|
||||
100% { opacity: 1; transform: translateY(0) scale(1); }
|
||||
}
|
||||
|
||||
@keyframes typing-bounce {
|
||||
0%, 80%, 100% { transform: translateY(0); opacity: 0.5; }
|
||||
40% { transform: translateY(-4px); opacity: 1; }
|
||||
}
|
||||
|
||||
@keyframes pulse-dot {
|
||||
0% { box-shadow: 0 0 0 0 rgba(90, 152, 255, 0.34); }
|
||||
70% { box-shadow: 0 0 0 8px rgba(90, 152, 255, 0); }
|
||||
|
||||
Reference in New Issue
Block a user