簡短答案
如果Whizi拒絕了你的匯入,先檢查你選的檔案:Whizi唯一會讀取的檔案,是ChatGPT或Claude匯出檔裡的conversations.json,所以請先解壓縮匯出檔,選那個檔案,而不是整個zip本身。除此之外,匯入失敗只會發生在兩個環節之一,訊息的用字就會告訴你是哪一個:讀取你匯出檔案的瀏覽器解析器,或是接收解析器產生之對話的匯入端點。檔案錯誤談的是你選的檔案,上傳錯誤談的是網路或登入狀態。中間沒有任何模糊地帶,因為每一則訊息都是綁定單一條件的固定字串。
在重試任何動作之前,第二件該知道的事:重新執行一次匯入絕對不會讓對話重複。每一段匯入的對話都是以帳號、來源和來源id為鍵值,所以不管是把同一份匯出檔匯入兩次、在連線中斷後恢復,還是連按兩次「匯入」,最後都只會落地同一批對話,只有一次。
| 你看到什麼 | 失敗在哪個環節 | 該怎麼做 |
|---|---|---|
| 關於匯出格式或conversations.json的訊息 | 讀取你的檔案時,還沒有任何內容上傳 | 從匯出檔裡選一個不同的檔案,見下方表格 |
| 關於你的登入狀態或連線的訊息 | 上傳過程中途 | 重新登入或重新連線,然後再跑一次匯入 |
| 一個無法匯入的對話數量 | 有些批次每次重試都失敗 | 再跑一次匯入,它只會補上缺少的部分 |
| 沒有訊息,但花了很久 | 速率限制,設計本來就是這樣 | 稍等,匯入程式會自己重試 |
讀取匯出檔時發生的錯誤
這些錯誤來自瀏覽器,發生在任何一個位元組離開你的機器之前。匯出檔本身從來不會被上傳:瀏覽器會解析它,只送出標準化後的對話,所以這裡出現的錯誤,代表檔案根本還沒走到能被送出的地步。
| 訊息 | 觸發條件 | 解法 |
|---|---|---|
That file is not a ChatGPT or Claude export. Look for conversations.json inside the export zip. | 解析器無法辨識任一種匯出格式,或zip解出的內容無法辨識 | 打開匯出檔的壓縮檔,明確選取conversations.json這個檔案 |
There is no conversations.json inside that zip. Unzip it and pick the file directly. | 你選的zip裡沒有對應的項目 | 自己解壓縮,找到conversations.json,選那個檔案 |
That file is not valid JSON, so there was nothing to read. | 選取的檔案無法解析為JSON | 從ChatGPT或Claude重新下載一次匯出檔,從裡面選conversations.json |
That export has no conversations with text in them. | 匯出檔能被解析,但產生零個對話 | 這份匯出檔確實沒有任何文字對話紀錄,Whizi這端沒有需要修正的地方 |
That file is too large for the browser to open. Pick the export .zip instead, which is read one file at a time. | 選取的原始.json檔超過瀏覽器讀取上限 | 改選.zip檔。原始.json匯出檔最多接受300 MB;.zip路徑本身沒有上限,因為只有conversations.json這個項目會被解壓縮 |
Could not read that file. Please try again. | 讀取檔案時因其他原因失敗 | 這確實屬於重試的情況。如果同一個檔案一直重複發生,改選匯出的.zip,它是一次讀一個項目 |
第一則訊息比較籠統,因為同一段字串涵蓋了兩種情況:解析器無法辨識的匯出格式,以及解出無法辨識內容的zip。這兩種情況的解法相同,都是解壓縮匯出檔,直接選conversations.json。
上傳過程本身發生的錯誤
檔案一旦解析完成,匯入程式就會分批把對話送出去。這個階段可能出兩種狀況,兩種都能恢復。
| 訊息 | 觸發條件 | 解法 |
|---|---|---|
Your session ended. Sign in again, then start the import. | 匯入過程中途,權杖取得沒有回應任何內容 | 重新登入,然後重新開始匯入。已經完成的部分會保留,重跑時會跳過它 |
The import could not be finished. Check your connection and try again. | 匯入過程中發生其他上傳失敗 | 檢查連線,再跑一次 |
第三種結果根本不是錯誤,而是一則摘要:{count} could not be imported. Run the import again to pick them up.。這是每次重試都失敗之批次的數量。訊息裡的指示就是完整的解法,簡短答案裡提到的去重鍵,也是為什麼第二次執行不會讓你多花任何代價。
匯入端點回傳的錯誤
以下是匯入路由本身產生的代碼和字串。網站會鏡射相同的上限,並在上傳前先做驗證,所以這些錯誤在有東西直接對端點發出請求,或某個批次格式錯誤時最重要。
| 代碼 | 訊息 | 觸發條件 |
|---|---|---|
invalid_import | A JSON object body is required. | 匯入的內容主體不是一個物件 |
invalid_source | An import source of chatgpt or claude is required. | source欄位缺漏,或不是這兩種接受的來源之一 |
empty_import | At least one conversation is required. | conversations陣列缺漏或是空的 |
too_many_conversations | This batch has {count} conversations, over the 25 per request limit. | 一次請求裡超過25段對話 |
too_many_messages | Conversation {n} carries {count} messages, over the 400 per request limit. Send the rest as an append. | 一次請求裡,某一段對話的訊息數超過400則 |
invalid_import | Conversation {n} is not an object. | conversations陣列裡的某個項目不是物件 |
invalid_import | Conversation {n} has no messages array. | 某段對話沒有messages陣列 |
invalid_import | Conversation {n} has an invalid append target. | appendTo欄位既不是字串也不是null |
invalid_message | Conversation {n} message {m} is not an object. | 某則訊息項目不是物件 |
invalid_message | Conversation {n} message {m} needs a role of "user" or "assistant". | 某則訊息的role超出這兩種角色範圍 |
invalid_message | Conversation {n} message {m} has no text. | 訊息內容不是字串 |
request_too_large | Request is too large. | JSON內容主體超過路由的位元組上限,不管是依宣告的Content-Length,還是實際讀取到的位元組數 |
這些訊息背後的上限:每次請求25段對話,每段對話每次請求400則訊息,請求內容主體最多2,000,000位元組。網站的匯入程式會精準地在25和400這兩個數字切分,並把每次請求控制在1,200,000位元組以內,刻意低於2,000,000位元組的上限,為請求外殼留出空間。超過400則訊息的對話不會被拒絕,而是會被切片:剩餘的部分會以附加片段的形式,送到第一個片段建立的那個對話上。
大型匯入每次會暫停20秒
匯入對話的速率限制是每位使用者每分鐘20次請求。一份大型匯出檔會碰到這個上限,這是預期中的情況,不是故障。
碰到這個情況時你不會看到任何錯誤。匯入碰到HTTP 429不會顯示出來:客戶端會等待20秒再重試,每個批次最多重試4次。所以一份大型匯出檔在匯入過程中,每次卡住約20秒,其實正是它該有的表現,讓它繼續跑就好。
如果批次在這4次嘗試之後仍然失敗,它們就會出現在{count} could not be imported. Run the import again to pick them up.這則摘要裡,這時解法是再跑一次匯入,而不是聯絡支援。
匯入功能刻意略過的內容
有些內容是設計上就會被略過,一次成功的匯入,對照原本的內容看起來還是可能不完整。
以ChatGPT匯出檔來說,只有畫面上顯示的那個分支會被匯入。重新產生的回覆和被捨棄的草稿,不會以訊息的形式重現。非對話內容也會被略過:隱藏的推理過程、分析工具的程式碼與輸出、瀏覽用的暫存內容、自訂指令區塊,以及函式呼叫。
以Claude匯出檔來說,思考區塊、工具呼叫和附件都會被捨棄,只有文字區塊會被匯入。
檔案裡沒有可讀文字的對話,會被計算並回報為略過,而不是被默默丟棄,所以略過的數量是一項資訊,不是失敗。
沒有可用標題的對話會變成Imported chat,超過120個字元的標題會被截短。超過內容長度上限的匯入訊息,會被截斷而不是被拒絕,所以一則過大的訊息不會讓你損失那段對話的其他內容。
最後是時間戳記:日期早於2015年1月1日,或日期在未來的匯入訊息,其時間戳記會被捨棄,該筆紀錄會退回使用匯入當下的時間。如果一段對話落地的日期,是你執行匯入的日期,而不是它原本的日期,就是碰到了這條規則。
為什麼重新執行匯入很安全
簡短答案裡提到的去重鍵,還有一個備援機制。當某份匯出檔沒有提供穩定的對話id時,這個鍵就會變成對話紀錄本身的雜湊值,所以重新執行時,還是能對上原本那些對話,而不會多出第二份副本。
有一個結果值得知道:刪除一段匯入的對話,再把同一份匯出檔匯入一次,會讓那段對話回來,而不是回報成重複。如果你是刻意刪除某段匯入的對話,除非你希望它回來,否則不要再重跑那份匯出檔。
- 從匯出檔裡選conversations.json,而不是匯出的zip本身
- 原始.json匯出檔最多接受300 MB,超過就改用.zip
- 登入狀態和連線錯誤代表要重新登入或重新連線,然後再跑一次
- 出現無法匯入的數量,代表要再跑一次匯入
- 刪除一段匯入的對話後再匯入,會讓它回來
- 大型匯入每次暫停20秒是速率限制,不是故障
- ChatGPT重新產生的分支,以及Claude的思考區塊和附件,都是設計上被略過的
常見問題
Whizi說我的ChatGPT匯出檔不是ChatGPT匯出檔,為什麼?
這則訊息是That file is not a ChatGPT or Claude export. Look for conversations.json inside the export zip.,它會在解析器無法從你選的檔案裡辨識出任一種格式,或zip解出無法辨識的內容時出現。Whizi實際讀取的檔案是conversations.json,所以請解壓縮匯出檔,直接選那個檔案。如果你選的是zip,卻收到There is no conversations.json inside that zip. Unzip it and pick the file directly.,代表這個zip裡完全沒有對應的項目,匯出檔需要重新下載。
我的匯入跑到一半就停了。再跑一次會讓我的對話重複嗎?
不會。重新執行正是設計來應對連線中斷、登入狀態結束或批次失敗的做法:第二次執行只會落地同一批對話一次,並且只補上缺少的部分。不需要先做任何清理步驟。
為什麼只匯入了我部分的對話?
會出現兩種不同的數量,只有一種代表失敗。{count} could not be imported. Run the import again to pick them up.計算的是每次重試都失敗的批次數量,解法是再跑一次匯入。另一種是略過的數量,它回報的是檔案裡沒有可讀文字的對話,而不是出錯的對話。
匯入已經卡在那裡一陣子了,是壞掉了嗎?
觀察它會不會繼續動,而不是看它已經跑了多久。大約20秒的暫停,接著繼續有進度,就是速率限制在運作,因為客戶端會等待20秒後重試,而不是顯示任何東西給你看。真正結束的匯入會有明確表示,不是顯示這頁上的某則錯誤字串,就是出現{count} could not be imported. Run the import again to pick them up.這則摘要。沒有動靜但偶爾有進度,代表就讓它繼續跑。
我的ChatGPT或Claude匯出檔會被上傳到Whizi嗎?
不會。匯出檔本身從來不會送達伺服器。你的瀏覽器會讀取它、解析它,只送出標準化後的對話,這也是為什麼這頁上每一種格式錯誤,都發生在任何東西被送出之前。完整的資料處理細節,寫在Whizi如何處理你的資料裡。