Sam Huang Logo
DaVinci Assistant API 前端文字解析版 v2
測試控台 v1 (網址外掛版) 查看 v1 → 端點與解析指南 查看手冊 → 返回個人首頁 sam-huang.info ↗

Assistant API 測試控台 (前端解析版) Client-Side Parser

支援在前端直接讀取 Word (.docx) 與 PDF (.pdf) 檔案並萃取文字,將純文字直接傳給 Assistant API 進行分析

切換至控台 v1
前端文字萃取引擎 內建 Mammoth.js 與 PDF.js,無論從本地上傳或輸入網址,皆在前端瀏覽器本地提取文件文字後再呼叫 Assistant API。
查看流程規格 →
檔案來源與執行參數
asst_dvc_4kdhByeY182lKrHzCGYt4Vvg
點擊選擇檔案或拖曳檔案至此處
支援 Word (.docx)、PDF (.pdf) 及純文字檔 (.txt / .md)
快速載入範例:
DOCX system_v0.2_draft.docx (12.8 KB)
已就緒
字元數:0 • 頁數:- • 解析耗時:0ms
即時執行狀態
閒置中 (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"