Mở đầu: một model không dùng để “viết”, mà để “quyết định”

Jev là model của TypeSafe, giá $0.042 cho 1 triệu input token, output miễn phí. Nghe như một LLM giá rẻ, nhưng dùng nó như một chatbot rẻ tiền là dùng sai.

Jev không sinh văn bản. Bạn đưa cho nó một state (dữ liệu đầu vào: ticket, log, JSON…) kèm một loạt câu hỏi có đáp án đóng. Nó trả về các quyết định có kiểu dữ liệu rõ ràng, kèm độ tự tin. Code của bạn đọc các quyết định đó và hành động.

Bài này giải thích Jev theo 4 ý chính:

  1. Vì sao hoá đơn API không phải chỗ bạn mất tiền — kiến trúc mới là chỗ mất tiền.
  2. Cách gọi rẻ hơn 12.2 lần: gom mọi câu hỏi vào một call.
  3. Dùng confidence để quyết định có nên hành động hay không.
  4. Những việc Jev không làm được, và phải để code làm.

Jev hoạt động thế nào: 1 state, nhiều câu hỏi, 3 kiểu câu trả lời

Mỗi lần gọi Jev, bạn gửi đúng hai thứ: state và một dict các câu hỏi. Mỗi câu hỏi thuộc một trong ba kiểu (primitive), và câu trả lời luôn nằm trong khuôn bạn đã định sẵn — không bao giờ là một đoạn văn tự do.

Ba kiểu câu hỏi của Jev

Hình 1: một ticket hỗ trợ đi vào, Jev trả về ba quyết định có kiểu kèm độ tự tin (số liệu minh hoạ).

Primitive Trả lời câu hỏi Kết quả Giới hạn
Choice “Cái nào trong số này?” 1 option + confidence + probabilities Tối đa 255 option
Score “Mức độ bao nhiêu?” 1 bậc trên thang + confidence 2 đến 10 bậc
Noul “Có hay không?” Xác suất từ 0 đến 1 0.5 = “có hay không ngang nhau”, không phải “mức trung bình”

Một vài thông số cần biết khi thiết kế:

  • Context: tổng 64k token mỗi request; state cộng câu hỏi dài nhất tối đa 32k.
  • Input: chỉ text (string, JSON, mảng text). Không nhận ảnh hay audio.
  • Rate limit: 250.000 token/giây và 1.200 request/phút — TypeSafe có thể thay đổi mà không báo trước trong giai đoạn mở rộng.

Vì sao tiền không mất ở hoá đơn API, mà mất ở kiến trúc

Với Jev, giá input thấp tới mức hoá đơn gần như không còn là biến số. Đặt cạnh Astra ($10 / 1 triệu input token) với cùng một khối lượng việc:

Phép tính 1.000 quyết định

Hình 2: 1.000 quyết định, mỗi lần state 10k token = 10 triệu token. Astra tốn $100.00, Jev tốn $0.42.

Nghĩa là thứ quyết định chi phí (và chất lượng) là cách bạn thiết kế lời gọi: gọi bao nhiêu lần, gửi state gì, và việc gì để code làm. Các phần sau đi lần lượt từng điểm.

Quy tắc số 1: gom mọi câu hỏi vào một call

Các câu hỏi trong cùng một request được đánh giá song song trên cùng một state. Thêm câu hỏi gần như không làm tăng độ trễ, và state chỉ bị tính tiền một lần, không phải mỗi câu một lần. Sai lầm đắt nhất vì vậy là mỗi câu hỏi một call.

Cookbook của TypeSafe chạy thử một bản briefing 13 câu hỏi theo cả hai cách: gộp vào một call rẻ hơn 12.2 lần, nhanh hơn 10.0 lần, câu trả lời không đổi.

Hình 3: 13 call gửi state 13 lần; 1 call gửi state 1 lần kèm 13 câu hỏi.

Ví dụ phân loại một ticket hỗ trợ — bốn câu hỏi, một call:

from typesafe_sdk import TypeSafeClient, Choice, Score, Noul

client = TypeSafeClient(model=”jev-1.13.0″) # pin version, không dùng alias

response = client.system_one(
state=ticket_text,
questions={
“category”: Choice(
instructions=”Determine the broad category of this support ticket”,
criteria={
“bug_report”: “Something is broken or producing errors”,
“billing”: “Charges, invoices, refunds, subscriptions”,
“feature_request”: “The user is requesting new functionality”,
“account”: “Login, permissions, profile, security”,
},
),
“bug_severity”: Score(
instructions=”How severe is the reported issue”,
criteria=[
“Cosmetic, no impact to functionality”,
“Broken or degraded feature, workaround exists”,
“Blocking issue, no workaround”,
],
),
“refund_requested”: Noul(
instructions=”The user is explicitly asking for a refund or credit”,
),
“frustration”: Score(
instructions=”How frustrated the user appears”,
criteria=[“Calm”, “Frustrated but civil”, “Very angry”],
),
},
)

Hãy hỏi cả những câu “phòng hờ”. Nếu ticket hóa ra là feature request, câu bug_severity không tốn thêm gì — code chỉ cần bỏ qua nó.

Fan out rồi route bằng code

Hình 4: pattern cốt lõi — hỏi hết mọi thứ có thể cần trong một call (fan out), sau đó rẽ nhánh bằng code (route).

Quy tắc số 2: câu trả lời nói “cái gì”, confidence nói “có nên làm không”

Mọi câu trả lời Choice và Score đều kèm confidence — một số từ 0 đến 1, tính từ mức độ tập trung của phân bố xác suất. Phân bố càng dàn đều giữa các option, confidence càng thấp.

Hình 5: dưới 0.5 chuyển cho người; 0.5–0.9 xác nhận trước; trên 0.9 cứ làm.

Ngưỡng không cố định — nó dịch theo mức rủi ro của hành động. Code của bạn là nơi ghi lại mức chấp nhận rủi ro đó:

action = response.answers[“category”]

if action.confidence < 0.5:
route_to_human(ticket_id) # model thật sự không chắc
elif action.choice == “bug_report”:
sev = response.answers[“bug_severity”]
if sev.score >= 2 and sev.confidence > 0.8:
escalate_to_engineering(ticket_id) # rủi ro cao, cần tự tin cao
else:
add_to_backlog(ticket_id) # rủi ro thấp, cứ làm
elif action.choice == “billing”:
if response.answers[“refund_requested”].noul > 0.7:
route_to_billing(ticket_id, refund_likely=True)

Cây quyết định theo answer và confidence

Hình 6: đoạn code trên vẽ thành cây quyết định.

Hành động chỉ đọc có thể chạy ở 0.5; hành động phá huỷ nên chờ 0.9. Nếu muốn tự tính confidence theo cách riêng, TypeSafe trả về đầy đủ mảng probabilities.

Sáu điều quickstart không nói

Rút từ agent skill chính thức của TypeSafe và tuần đầu mọi người đưa Jev lên production:

  1. Các câu hỏi không đọc được câu trả lời của nhau. Chúng chạy song song trên cùng state. Nếu quyết định tiếp theo cần kết quả mới (ví dụ kết quả search), đó là request thứ hai, không phải một request to hơn.
  2. Dựng lại danh sách lựa chọn mỗi bước. Tạo option của Choice từ thứ đang tồn tại lúc này, không phải danh sách hôm qua. Danh sách dài: lọc bằng code → Score phần còn lại → Choice trên shortlist.
  3. Confidence không phải là giấy phép. Nó chỉ nói xác suất tập trung đến đâu, không nói workflow đúng hay side effect đã xảy ra. Một câu “done” tự tin không chứng minh file đã được lưu — hãy kiểm tra bằng code.
  4. Noul = 0.5 nghĩa là “có hay không ngang nhau”, không phải “mức trung bình”. Đừng đọc nó như cường độ.
  5. Gửi bằng chứng, không gửi tóm tắt. “Researcher đã xong” cho Jev ít thông tin hơn nguồn, phát hiện và chỗ còn thiếu. Tách các field đó riêng khỏi request gốc.
  6. Đảm bảo đúng kiểu ≠ đảm bảo đúng kết quả. Câu trả lời chỉ có thể là một option của bạn nên không bao giờ sai format — nhưng vẫn có thể sai. Thiết kế cho cái thứ hai; cái thứ nhất có sẵn.

Những việc Jev không làm được (theo chính docs của nó)

TypeSafe có một trang “jaggedness” liệt kê điểm yếu của version hiện tại. Đọc nó trước khi thiết kế — phần lớn là những việc thuộc về code, không thuộc về model.

Điểm yếu Điều đó có nghĩa Cách xử lý
Đọc theo nghĩa đen Trả lời câu bạn viết, không phải câu bạn nghĩ Phần bạn đang “giải thích thêm” chính là nửa còn thiếu của instruction
Không đếm, không tính toán Số lượng, phép cộng trừ không tin được Đếm bằng regex/parser; hoặc hỏi 1 Noul mỗi mục rồi tự cộng
Đọc ngày tháng như text So sánh, khoảng cách, nằm trong khung giờ đều không đáng tin Trích từng phần bằng Choice trên tập đóng, ghép và so sánh bằng code
State lớn làm giảm độ chính xác Chi tiết thừa gây nhiễu Lọc trước, chỉ gửi thứ câu hỏi cần
Không coi state là thù địch Instruction bị chèn trong state có thể làm lệch câu trả lời Test edge case trước khi ship
Phép đồng nhất cấu trúc không giữ Noul và Choice có/không cho cùng câu hỏi ra số khác nhau; P(có) + P(không) ≠ 1 Không bao giờ mang ngưỡng từ primitive này sang primitive kia
Không sinh văn bản Không viết, không tóm tắt Trích xuất → Choice trên các option; cần text → dùng model khác

Mọi lỗi đều có chung một hình dạng: thứ lẽ ra là code lại được giao cho model.

Jev phán đoán, code tính toán

Hình 7: ranh giới giữa việc của Jev và việc của code.

Ghép lại: một hàm triage() hoàn chỉnh

Tất cả nguyên tắc trên gói trong bốn bước: lọc state → một call → log → route.

Luồng triage hoàn chỉnh

Hình 8: bốn bước của triage(), model được pin ở jev-1.13.0.

from typesafe_sdk import TypeSafeClient, Choice, Score, Noul

client = TypeSafeClient(model=”jev-1.13.0″)

def triage(ticket_id: str, text: str):
# 1. lọc bằng code trước, chỉ giữ field mà câu hỏi cần
state = extract_relevant(text)

# 2. một call, mọi câu hỏi có thể cần
r = client.system_one(state=state, questions=QUESTIONS)

# 3. log model đã trả lời (có version), vì alias sẽ thay đổi
log(ticket_id, model=r.model, usage=r.usage)

# 4. route theo câu trả lời VÀ confidence
cat = r.answers[“category”]
if cat.confidence < 0.5:
return route_to_human(ticket_id)
return HANDLERS[cat.choice](ticket_id, r)

Hai dòng quan trọng hơn vẻ ngoài của chúng:

  • Pin jev-1.13.0: jev-latest sẽ nhảy khi có bản mới, và các ngưỡng bạn đã tinh chỉnh trên version cũ không mang sang được.
  • Log r.model mỗi call: khi câu trả lời thay đổi, bạn biết ngay có phải do model thay đổi hay không.

Năm lỗi hay gặp

Lỗi Vì sao sai Làm đúng
Mỗi câu hỏi một call State bị tính tiền mỗi lần; chênh 12.2 lần Fan out trong 1 call, route bằng code
Gửi nguyên tài liệu làm state Giảm độ chính xác, không biết phần nào gây sai Retrieve và lọc trước
Bắt model làm toán Ngày, số đếm, so sánh, độ lớn đều không tin được Model phán đoán, code tính toán
Tinh chỉnh ngưỡng trên jev-latest Alias thay đổi, ngưỡng mất hiệu lực Pin version, log model, tự chọn lịch migrate
Cho rằng Noul và Choice khớp nhau Choice là tương đối (option nào thắng); Noul là tuyệt đối (có thể thấp cho tất cả) Không dùng chung ngưỡng

Setup trong 10 phút

Setup 10 phút

Hình 9: năm bước và thời gian cho mỗi bước.

  1. pip install typesafe-sdk, set TYPESAFE_API_KEY, pin jev-1.13.0 (2 phút).
  2. Viết mọi câu hỏi trong một dict, kể cả câu phòng hờ (3 phút).
  3. Lọc state bằng code trước khi gọi, chỉ gửi field câu hỏi đọc (2 phút).
  4. Đặt sàn confidence 0.5, dưới sàn chuyển cho người (1 phút).
  5. Log r.model và r.usage mỗi call (2 phút).

Nếu bạn code cùng coding agent, cài skill chính thức của TypeSafe trước. Skill mang sẵn ba primitive, các pattern và quy tắc viết câu hỏi, nên agent không phải đoán API:

# Claude Code
claude plugin marketplace add typesafe-ai/skills
claude plugin install typesafe@typesafe-ai
# sau đó gõ /typesafe:typesafe-ai trong session

# Codex và các agent khác
npx skills add typesafe-ai/skills –skill typesafe-ai

TypeSafe lưu ý: agent không giỏi viết câu hỏi, nên hãy sửa cùng nó và giữ toàn bộ câu hỏi cùng ngưỡng trong một file để dễ review.

Kết luận

Jev rẻ đến mức bạn sẽ sớm thôi nghĩ về giá. Kiến trúc thì không rẻ như vậy — và đó là đòn bẩy duy nhất còn lại. Ba điều cần nhớ:

  • Một call, nhiều câu hỏi, rồi route bằng code.
  • Confidence quyết định có hành động hay không, ngưỡng theo mức rủi ro.
  • Jev phán đoán, code tính toán — đếm, ngày tháng, lọc, kiểm tra kết quả đều là việc của code.

Bước tiếp theo: đọc trang jaggedness của TypeSafe một lần thật kỹ — đó là tài liệu ngắn và hữu ích nhất họ đã công bố.

 

Guest