Sửa lỗi OpenAI Assistants API: Cách xử lý 'No thread found' (Lỗi 404)

intermedi🧠 AI Tools2026-05-17| Python 3.8+, OpenAI Python SDK v1.0.0+, Node.js OpenAI SDK v4.0.0+, hoặc bất kỳ môi trường nào sử dụng OpenAI Assistants API.

Error Message

openai.NotFoundError: Error code: 404 - {'error': {'message': 'No thread found with id thread_abc123XYZ', 'type': 'invalid_request_error', 'param': None, 'code': None}}
#openai#assistants-api#python#xu-ly-loi#404-not-found

TL;DR: Cách khắc phục nhanh

Thread không tồn tại vĩnh viễn. OpenAI tự động xóa chúng sau 30 ngày không hoạt động. Để tránh ứng dụng bị dừng đột ngột, hãy bao bọc logic gửi tin nhắn trong khối try-except. Nếu bắt được lỗi 404, chỉ cần tạo một thread mới, lưu ID mới vào cơ sở dữ liệu và thử lại yêu cầu.

import openai

try:
    # Thử sử dụng thread hiện có
    client.beta.threads.messages.create(
        thread_id=stored_thread_id,
        role="user",
        content="Xin chào!"
    )
except openai.NotFoundError:
    # Nếu thread không còn tồn tại, khởi tạo một cái mới
    new_thread = client.beta.threads.create()
    stored_thread_id = new_thread.id
    # Cập nhật cơ sở dữ liệu của bạn tại đây
    
    client.beta.threads.messages.create(
        thread_id=stored_thread_id,
        role="user",
        content="Xin chào!"
    )

Tại sao Thread biến mất

Thread là các vùng chứa hội thoại, nhưng chúng không sống mãi mãi. Ngay cả khi bạn lưu trữ thread_id trong cơ sở dữ liệu như PostgreSQL hoặc Redis, ID đó vẫn có thể trở thành một liên kết chết. Điều này thường xảy ra vì hai lý do:

- **Hết hạn sau 30 ngày:** OpenAI hiện tại sẽ xóa các thread sau **30 ngày không hoạt động**. Nếu người dùng không gửi tin nhắn hoặc kích hoạt một lượt chạy (run) trong khoảng thời gian đó, thread sẽ bị xóa vĩnh viễn.
- **Dọn dẹp thủ công:** Ai đó có thể đã xóa thread thông qua phương thức `client.beta.threads.delete()` hoặc thông qua OpenAI Dashboard trong quá trình thử nghiệm.

Một khi thread đã bị xóa, bất kỳ nỗ lực nào nhằm truy xuất hoặc thêm tin nhắn sẽ kích hoạt lỗi 404. Mã nguồn của bạn phải sẵn sàng để xử lý trạng thái "bị thiếu" này một cách mượt mà.

Chiến lược thông minh để xử lý lỗi 404

1. Mô hình "Lazy Check"

Một cách để xử lý vấn đề này là xác minh sự tồn tại của thread trước khi sử dụng nó. Tuy nhiên, điều này làm tăng thêm một lần gọi API và gây ra độ trễ khoảng 150ms đến 300ms cho mỗi lần tương tác. Chỉ sử dụng cách này nếu bạn cần xác minh trạng thái thread trước khi thực hiện các logic phức tạp.

def get_active_thread_id(user_id):
    thread_id = db.get_thread_for_user(user_id)
    
    if not thread_id:
        return create_and_save_new_thread(user_id)

    try:
        client.beta.threads.retrieve(thread_id)
        return thread_id
    except openai.NotFoundError:
        return create_and_save_new_thread(user_id)

2. Mô hình "Fail-Fast and Recover" (Khuyên dùng)

Thay vì kiểm tra trước, hãy cứ thử gửi tin nhắn. Điều này giúp tiết kiệm chi phí API và giữ cho ứng dụng của bạn phản hồi nhanh nhạy. Nếu thread bị thiếu, API sẽ thông báo cho bạn ngay lập tức. Cách tiếp cận này hiệu quả hơn đối với các ứng dụng có lưu lượng truy cập cao, nơi hầu hết các thread vẫn còn hoạt động.

def send_message(user_id, user_input):
    thread_id = db.get_thread_for_user(user_id)
    
    try:
        return client.beta.threads.messages.create(
            thread_id=thread_id,
            role="user",
            content=user_input
        )
    except openai.NotFoundError:
        # Thread đã chết. Tạo một cái mới và thử lại.
        new_thread = client.beta.threads.create()
        db.update_thread_for_user(user_id, new_thread.id)
        return client.beta.threads.messages.create(
            thread_id=new_thread.id,
            role="user",
            content=user_input
        )

3. Quản lý ngữ cảnh dài hạn

Bắt đầu một thread mới đồng nghĩa với việc mất đi lịch sử trò chuyện trước đó. Nếu bot của bạn cần ghi nhớ những điều từ nhiều tháng trước, đừng chỉ dựa vào bộ nhớ thread của OpenAI. Hãy lưu trữ các cột mốc quan trọng của cuộc hội thoại trong cơ sở dữ liệu riêng của bạn. Khi một thread hết hạn, bạn có thể "nạp lại" thread mới bằng cách đưa vào một bản tóm tắt các tương tác cũ dưới dạng tin nhắn đầu tiên.

Kiểm tra logic khôi phục của bạn

Đừng đợi 30 ngày để xem cách khắc phục của bạn có hoạt động hay không. Bạn có thể mô phỏng việc hết hạn chỉ trong vài giây:

- Lấy một `thread_id` đang hoạt động từ môi trường phát triển của bạn.
- Chạy lệnh `client.beta.threads.delete("thread_ID_tai_day")` trong một script hoặc terminal.
- Kích hoạt chức năng gửi tin nhắn trong ứng dụng của bạn.
- Kiểm tra cơ sở dữ liệu. Bạn sẽ thấy ID cũ đã được thay thế bằng một ID mới bắt đầu bằng `thread_`.

Đọc thêm

- [OpenAI API Reference: Threads](https://platform.openai.com/docs/api-reference/threads)
- [Hướng dẫn chính thức: Quản lý Threads](https://platform.openai.com/docs/assistants/how-it-works/managing-threads-and-messages)
- [Mã nguồn Exception của OpenAI Python SDK](https://github.com/openai/openai-python/blob/main/src/openai/_exceptions.py)

Related Error Notes