前端文字萃取引擎
內建
查看流程規格 →
Mammoth.js 與 PDF.js,無論從本地上傳或輸入網址,皆在前端瀏覽器本地提取文件文字後再呼叫 Assistant API。
檔案來源與執行參數
asst_dvc_4kdhByeY182lKrHzCGYt4Vvg
即時執行狀態
閒置中 (Ready)
0
前端萃取
1
建立 Thread
2
寫入訊息
3
觸發 Run
4
輪詢/外掛
5
取得結果
Console Output
0.0s
[Ready]系統就緒,請上傳 Word / PDF 文件或輸入網址,點擊「開始呼叫 API 測試」啟動流程。
Assistant 最終回覆分析
Completed
前端文件解析與 Assistant API 整合技術規格
Client-Side Architecture
本控台採用「前端純文字萃取」方案:在瀏覽器沙箱記憶體中直接解析 Word (.docx) 與 PDF (.pdf) 文件,將萃取後之純文字以標準 role: user 訊息形式提交至 /threads/{thread_id}/messages,完全免除後端檔案儲存風險與跨域檔案下載問題。
左右滑動可檢視完整端點規格與參數
| 步驟 | 執行環境 | 端點路徑 (Endpoint) | 用途說明 | 關鍵參數 |
|---|---|---|---|---|
| 步驟 0 | 瀏覽器前端 | Mammoth.js / PDF.js |
讀取 docx 或 pdf 二進位資料,萃取純文字與頁數 | 產生 extractedText 繁體中文內文 |
| 步驟 1 | POST | /threads |
建立獨立對話空間 (Thread) | 回傳 { "id": "thread_..." } |
| 步驟 2 | POST | /threads/{thread_id}/messages |
寫入提示詞 (Prompt) 與前端萃取之文件文字內容 | { "role": "user", "content": "..." } |
| 步驟 3 | POST | /threads/{thread_id}/runs |
發起 Run 觸發指定 Assistant 處理 | { "assistant_id": "asst_dvc_4kdhByeY182lKrHzCGYt4Vvg" } |
| 步驟 4 | GET | /threads/{thread_id}/runs/{run_id} |
輪詢狀態 (Polling),支援外掛 requires_action | 檢查狀態為 completed 或執行 tool_outputs |
| 步驟 5 | GET | /threads/{thread_id}/messages |
取得最終 AI 分析與摘要回覆文字 | 讀取 res.data[0].content[0].text.value |
純前端解析 Word (.docx) 與 PDF (.pdf) 之核心 JavaScript 函式:
client-document-parser.js
// 1. 解析 Word (.docx)
async function parseDocx(arrayBuffer) {
const result = await mammoth.extractRawText({ arrayBuffer: arrayBuffer });
return result.value.trim();
}
// 2. 解析 PDF (.pdf)
async function parsePdf(arrayBuffer, onProgress) {
const loadingTask = pdfjsLib.getDocument({ data: arrayBuffer });
const pdf = await loadingTask.promise;
let fullText = '';
for (let i = 1; i <= pdf.numPages; i++) {
if (onProgress) onProgress(i, pdf.numPages);
const page = await pdf.getPage(i);
const textContent = await page.getTextContent();
const pageText = textContent.items.map(item => item.str).join(' ');
fullText += `--- 第 ${i} 頁 ---\n${pageText}\n\n`;
}
return { text: fullText.trim(), pages: pdf.numPages };
}
// 3. 遠端網址抓取與解析
async function fetchAndParseUrl(fileUrl) {
const res = await fetch(fileUrl);
const arrayBuffer = await res.arrayBuffer();
if (fileUrl.endsWith('.docx')) {
return await parseDocx(arrayBuffer);
} else if (fileUrl.endsWith('.pdf')) {
return (await parsePdf(arrayBuffer)).text;
}
return new TextDecoder().decode(arrayBuffer);
}
davinci-text-assistant.js
const axios = require('axios');
const API_KEY = '您的_DAVINCI_API_KEY';
const ASSISTANT_ID = 'asst_dvc_4kdhByeY182lKrHzCGYt4Vvg';
const ASSISTANT_API = 'https://sandbox.davinci.tw/api/assts/v1';
// 前端萃取之文字內容
const EXTRACTED_TEXT = `【文件內容】:\n系統規格說明書草稿...`;
const headers = {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
'OpenAI-Beta': 'assistants=v2'
};
async function runAnalysis() {
// 1. 建立 Thread
const threadRes = await axios.post(`${ASSISTANT_API}/threads`, {}, { headers });
const threadId = threadRes.data.id;
// 2. 送出萃取後的純文字
await axios.post(`${ASSISTANT_API}/threads/${threadId}/messages`, {
role: 'user',
content: `請重點摘要以下文件內容:\n\n${EXTRACTED_TEXT}`
}, { headers });
// 3. 發起 Run
const runRes = await axios.post(`${ASSISTANT_API}/threads/${threadId}/runs`, {
assistant_id: ASSISTANT_ID
}, { headers });
const runId = runRes.data.id;
// 4. 輪詢直到完成
while (true) {
await new Promise(r => setTimeout(r, 1500));
const checkRes = await axios.get(`${ASSISTANT_API}/threads/${threadId}/runs/${runId}`, { headers });
if (checkRes.data.status === 'completed') break;
}
// 5. 取得分析結論
const msgRes = await axios.get(`${ASSISTANT_API}/threads/${threadId}/messages`, { headers });
console.log(msgRes.data.data[0].content[0].text.value);
}
runAnalysis();
cURL 流程範例
# 1. 建立 Thread
curl -X POST https://sandbox.davinci.tw/api/assts/v1/threads \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "OpenAI-Beta: assistants=v2"
# 2. 寫入萃取文字訊息
curl -X POST https://sandbox.davinci.tw/api/assts/v1/threads/THREAD_ID/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "OpenAI-Beta: assistants=v2" \
-d '{"role": "user", "content": "請分析以下文件內容:\n\n..."}'
# 3. 發起 Run (asst_dvc_4kdhByeY182lKrHzCGYt4Vvg)
curl -X POST https://sandbox.davinci.tw/api/assts/v1/threads/THREAD_ID/runs \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "OpenAI-Beta: assistants=v2" \
-d '{"assistant_id": "asst_dvc_4kdhByeY182lKrHzCGYt4Vvg"}'
# 4. 輪詢狀態
curl -X GET https://sandbox.davinci.tw/api/assts/v1/threads/THREAD_ID/runs/RUN_ID \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "OpenAI-Beta: assistants=v2"
# 5. 取得結果
curl -X GET https://sandbox.davinci.tw/api/assts/v1/threads/THREAD_ID/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "OpenAI-Beta: assistants=v2"