Skip to content

Commit 63184b4

Browse files
committed
feat: Support conversation branches from new ChatBox exports
1 parent f2e0009 commit 63184b4

File tree

4 files changed

+360
-39
lines changed

4 files changed

+360
-39
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
node_modules/
22
dist/
3+
测试/

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ ChatBox to OpenWebUI 是一个在线工具,帮助用户便捷地将 ChatBox
44

55
它允许用户上传 ChatBox 导出的 JSON 文件,并自动将其转换为 Open WebUI 兼容的格式,方便用户将聊天记录从轻量化的 [ChatBox](https://github.com/Bin-Huang/chatbox) 迁移到功能更加丰富的 [Open WebUI](https://github.com/open-webui/open-webui)
66

7-
该项目的代码主要由 `claude-3.5-sonnet``chatgpt-4o-latest` 编写,我提供了非常多的样式、功能设计提议和反馈。
7+
该项目的代码主要`claude-sonnet-4` `claude-3.5-sonnet``chatgpt-4o-latest` 编写,我提供了非常多的样式、功能设计提议和反馈。
88

99
![使用示例](使用示例.png)
1010

@@ -19,7 +19,7 @@ ChatBox to OpenWebUI 是一个在线工具,帮助用户便捷地将 ChatBox
1919
## 如何使用
2020

2121
1. 访问 [ChatBox to Open WebUI](https://cooksleep.github.io/ChatBox2OpenWebUI/)
22-
2. 在 ChatBox 的`设置-其它-备份与恢复`**只勾选`聊天记录`**,然后导出
22+
2. 在 ChatBox 的 `设置` > `常规设置` > `数据备份` 中,点击 `导出勾选数据`
2323
3. 点击`选择文件`按钮,选择刚刚从 ChatBox 导出的 JSON 文件。
2424
4. 查看上传的对话列表,根据需要选择或取消选择从 ChatBox 中导出的对话。
2525
5. 为每个对话指定使用的模型(可选)。

src/App.vue

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
<div class="section steps-section">
5959
<h2>聊天记录转移步骤</h2>
6060
<ol>
61-
<li>在ChatBox的<code>设置-其它-备份与恢复</code>中<strong>只勾选<code>聊天记录</code></strong>,然后导出</li>
61+
<li>在ChatBox的<code>设置</code> > <code>常规设置</code> > <code>数据备份</code>中,点击<code>导出勾选数据</code></li>
6262
<li>点击本页面的<code>选择文件</code>按钮,选择刚刚从ChatBox导出的JSON文件
6363
<blockquote>本网页不会收集也无法收集您的个人数据,一切操作均在您的浏览器本地进行</blockquote>
6464
</li>
@@ -127,13 +127,28 @@ function handleFileUpload(event) {
127127
reader.onload = (e) => {
128128
try {
129129
const data = JSON.parse(e.target.result);
130-
const chatSessionList = data['chat-sessions-list']
131-
const chatSessions = chatSessionList.map((sessionMeta) => data[`session:${sessionMeta.id}`]) || data['chat-sessions'] || [];
130+
131+
// 检查是否为新格式的ChatBox导出文件
132+
if (!data.__exported_items || !data['chat-sessions-list']) {
133+
throw new Error('不是有效的ChatBox导出文件');
134+
}
135+
136+
// 只处理包含对话记录的导出
137+
if (!data.__exported_items.includes('conversations')) {
138+
throw new Error('导出文件中不包含对话记录');
139+
}
140+
141+
const chatSessionList = data['chat-sessions-list'];
142+
const chatSessions = chatSessionList.map((sessionMeta) => data[`session:${sessionMeta.id}`]).filter(session => session);
132143
133144
chatSessions.forEach(conv => {
134145
if (conv.messages && conv.messages.length > 0) {
135146
const hasWarning = !isValidConversation(conv.messages);
136-
const hasImages = conv.messages.some(msg => msg.pictures && msg.pictures.length > 0);
147+
// 检查是否包含图片(支持新格式的contentParts)
148+
const hasImages = conv.messages.some(msg => {
149+
if (msg.contentParts && msg.contentParts.some(part => part.type === 'image')) return true;
150+
return false;
151+
});
137152
conversations.value.push({
138153
id: uuidv4(),
139154
title: conv.name || "未命名对话",
@@ -182,11 +197,17 @@ function showWarningModal(errorConversations, imageConversations) {
182197
183198
if (errorConversations.length > 0) {
184199
content += `
185-
<p><strong>以下对话包含不成对的消息(存在连续的User/Assistant消息),可能导致Open WebUI功能异常:</strong></p>
200+
<p><strong>以下对话存在问题,可能导致Open WebUI功能异常:</strong></p>
186201
<ul>
187202
${errorConversations.map(title => `<li>${title}</li>`).join('')}
188203
</ul>
189-
<p>如果您确定要转换这些对话,建议先在ChatBox中手动删除不成对消息。</p>
204+
<p>问题可能包括:</p>
205+
<ul>
206+
<li>连续的相同角色消息(连续的User或Assistant消息)</li>
207+
<li>中间消息包含错误(Open WebUI只允许最后一条消息有错误)</li>
208+
<li>空内容消息</li>
209+
</ul>
210+
<p>建议在ChatBox中手动修复这些问题后再进行转换。</p>
190211
<hr style="border-color: #ccc;"> <!-- 添加分割线 -->
191212
`;
192213
}

0 commit comments

Comments
 (0)