全部技能

prisma-client-api (prisma/skills)

提供 Prisma Client 查詢、篩選、運算子與方法參考,涵蓋 CRUD、關聯與交易。

prisma-client-api:沒有可測量的效果:18 次執行全部通過每一項檢查(對照組 5.0、一句話提示組 5.0、技能組 5.0);模型本來就能寫出道地的 Prisma 程式碼。

視情況推薦安全

Codex CLI · gpt-6-astra

24.0 / 30

相對未使用技能的提升:+0.00 · 視情況推薦 · 18 次執行

視情況推薦:提升幅度 +0.00 低於 +1.0。推薦條件為總分至少 22/30、產出品質至少 3.5、提升幅度至少 +1.0。

SOTA

透過

使用 Codex 測試。

涵蓋 Codex, Claude Code

Codex CLI 0.166(SOTA 等級):18 次評分執行。依我們的等級規則,在這裡通過也涵蓋 Claude Code;但這不代表第二等級的結果。

分數

每個維度為 0 到 5 分,六個維度相加即為滿分 30 的總分。每個維度都是 5 分最好。成本 5 分代表便宜又快速;安裝 5 分代表容易安裝。

觸發可靠性
5.0
相對未使用技能的提升
2.0
產出品質
5.0
Token 與時間成本
5.0
安裝與可攜性
3.0
安全性
4.0

安全審查

安全

靜態掃描:9 CRITICAL / 9 HIGH / 0 MEDIUM。人工審查:可在無網路沙箱中安全執行(已說明掃描器的發現)。掃描結果不能證明技能一定安全。

安裝

npx skills@latest add prisma/skills --skill prisma-client-api

來源

固定 Commit: 8ea289b730c2e89f7ff1f518af128b113d842a92

測試日期: 2026-11-02

我們測了什麼

  • 依描述撰寫型別化查詢 — 使用 Prisma Client 撰寫 src/queries.ts,包含以下函式:getUserWithPosts(id) 回傳該使用者及僅限已發布的文章,依最新排序,最多 10 篇;searchPosts(term, cursor?) 為游標分頁(每頁 20 筆)、不分大小寫的標題搜尋;upsertUser(…
  • 移除 N+1 查詢 — src/report.ts 在大型資料表上很慢。請修正 src/report.ts 的效能問題,並維持相同的回傳結構。
  • 審查 Prisma 程式碼的錯誤 — 請審查 src/search.ts 和 src/report.ts 是否有 Prisma 錯誤及任何有風險的地方;依嚴重程度由高到低列出問題。不要修改任何檔案。

優點

  • 技能即使未被點名也會被採用:6/6 次實驗組執行都讀取了技能檔案。
  • 沒有 Token 額外負擔:Token 用量是未使用技能的 1.05 倍。
  • 使用技能後的絕對品質很高:5.0 / 5。

缺點

  • 相較於未使用技能,沒有可測量的提升(+0.00,落在雜訊範圍內)。
  • 一句話提示得分 5.0,使用技能則為 5.0(+0.00)。
  • 對照組本來就拿到 5.0:這是天花板效應,因此測試無法顯示提升。
  • 每個任務的每個組別 n=2;約 1 分以內的差異屬於雜訊。

評測

在專用的 Windows 測試電腦上執行 Codex CLI 0.166(gpt-6-astra,低推理),每次執行都使用全新的暫存專案,以及臨時的 HOME/TMPDIR/快取;技能分成已安裝(實驗組)、未安裝(對照組),以及未安裝但把技能的核心要求濃縮成一句話附加在提示詞後(一句話提示組)。每個任務的每個組別各執行 2 次,關閉網路,封鎖 /tmp 寫入。提示詞從未提及技能(下方註明者除外)。使用一個小型 Prisma 專案(schema、seed、src 檔案)。任務:撰寫 src/queries.ts,包含五個型別化的查詢函式(使用者及其最近 10 篇已發布文章、以游標分頁且不分大小寫的搜尋、upsert、原子性的文章轉移、groupBy 計數);修正 src/report.ts 的 N+1,同時維持輸出結構;審查兩個檔案中的 Prisma 錯誤(一個用字串插值組出的 raw query 等)。提示詞未指名 Prisma 功能。一句話提示組則用一句話列出這些慣用做法。

三組對照

組別平均分數(0-5)每次執行 Token 用量
未使用技能5.092k
一句話提示5.088k
使用技能5.097k

以 Codex CLI 執行 18 次,採規則式檢查評分,不經 LLM 評審。總分 24.0 / 30,評級為 視情況推薦。

判定:視情況而定(24.0 / 30)。 來源:prisma/skills,prisma-client-api,固定於提交 8ea289b。安裝:npx skills@latest add prisma/skills --skill prisma-client-api。授權條款: Apache-2.0(儲存庫 LICENSE)。

這是什麼

prisma-client-api 技能(prisma/skills):Prisma Client 查詢 API 的參考(findUnique/findMany、select/include、篩選、游標分頁、upsert、交易、groupBy、原始查詢),加上文件風格的指引,以 SKILL.md 與規則檔案的形式提供。

我們如何測試

在專用 Windows 測試 PC 上使用 Codex CLI 0.166(gpt-6-astra,低推理),每次執行都使用全新的暫存專案與暫存 HOME/TMPDIR/快取,安裝技能(實驗組)、未安裝(對照組),或未安裝但將技能核心要求濃縮成一句話附加在提示詞後(一句話提示組),每個任務每組執行 2 次,網路關閉,/tmp 寫入封鎖。提示詞從未提及技能(以下註明的措辭除外)。

一個小型 Prisma 專案(schema、seed、src 檔案)。任務:寫出 src/queries.ts,包含五個具型別的查詢函式(使用者及其最近 10 篇已發布文章、以游標分頁且不區分大小寫的搜尋、upsert、原子性地轉移文章、groupBy 計數);修正 src/report.ts 的 N+1 並維持輸出的形狀;以及審查兩個檔案中的 Prisma 錯誤(以字串插值建構的原始查詢等)。提示詞不點名 Prisma 功能。一句話提示則用一句話列出慣用功能。

  1. 依描述寫出具型別的查詢 — 使用 Prisma Client 寫出 src/queries.ts,包含這些函式:getUserWithPosts(id) 回傳該使用者以及僅其已發布的文章,最新在前,最多 10 篇;searchPosts(term, cursor?) 以游標分頁(每頁 20 筆)進行不區分大小寫的標題搜尋;upsertUser(…
  2. 移除 N+1 查詢 — src/report.ts 在大型資料表上很慢。修正 src/report.ts 的效能問題,並保持回傳的形狀不變。
  3. 審查 Prisma 程式碼中的錯誤 — 審查 src/search.ts 與 src/report.ts 中的 Prisma 錯誤與任何有風險的地方;列出問題,最嚴重的排在最前面。不要修改任何檔案。

評分方式為程式化檢查(隱藏測試/預埋問題召回/限制條件檢查/視情況進行渲染與 OCR),每次執行 0–5 分。沒有任何 LLM 評審決定分數。

結果

提供給第三組的一句話提示:「以慣用方式使用 Prisma Client:在唯一欄位上用 findUnique,以 include/select 避免 N+1 與過度抓取,篩選條件用 mode: 'insensitive',以 take 做游標分頁,插入或更新用 upsert,原子性變更用 $transaction 或 updateMany,彙總用 groupBy,且絕不用 $queryRawUnsafe 搭配插值輸入。」

任務對照組分數一句話提示使用技能對照組 Token 數一句話提示 Token 數使用技能 Token 數技能讀取
t1-queries5.05.05.083k83k105k2/2
t2-n-plus-15.05.05.0103k103k100k2/2
t3-review5.05.05.089k75k84k2/2

平均分數:未使用技能 5.0,使用技能 5.0(差異 +0.0)。每次執行 Token 數:92k 對 97k(1.05 倍);時間 44 秒對 40 秒。一句話提示組:5.0(技能相較一句話提示的增益:+0.0;一句話提示相較無技能的增益:+0.0);一句話提示每次執行 88k Token,因此技能的成本是一句話提示的 1.10 倍。

實際發生了什麼

  • 每一組的每一次執行都通過每一項檢查:對照組 5.00、一句話提示 5.00、技能 5.00(各 n=6)。產生的查詢使用了 findUnique、mode: 'insensitive'、cursor + take、upsert、$transaction/updateMany 與 groupBy;N+1 以 include/select 或批次處理修正;審查在每次執行都找到不安全的原始字串插值。
  • 技能在 6/6 次實驗組執行中被讀取,每次執行花費 97k Token,對照組 92k、一句話提示 88k(1.05 倍):一點小額外成本,沒有增益。
  • 實驗組執行會把技能的規則檔案複製到專案(平均每次執行 9.7 個檔案)。
  • 檢查集有天花板效應:所有執行都在滿分時,只能說技能沒有造成傷害,不能說它從未有幫助。需要更難的任務(Prisma 7 driver adapters、模型可能不知道的較新功能)才能看出效益。

各面向分數

面向分數原因
1_輸出品質5.0

使用技能時平均分數 5.00/5(程式化檢查,見各任務 表格)。

2_相較無技能的提升2.0

相較未使用技能的 5.00,+0.00 分(每項任務 n=2;約 1 分以下 屬於雜訊)。

3_觸發5.0技能檔案在 6/6 次實驗組執行中被讀取。
4_指令可攜性3SKILL.md 加上約十個規則檔案;只有文件。
5_效率51.05 倍 Token(每次執行 97k 對 92k)與 0.92 倍時間(40 秒對 44 秒)。
6_安全性與衛生4

掃描器回報 9 個 CRITICAL,全部是文件在脈絡中提及 .env 檔案(見 security.md)。

這項測試的限制

  • 對程式碼文字做規則式檢查;沒有產生 Prisma client,也沒有執行任何查詢(離線、沒有資料庫)。
  • 所有組別都到達天花板:這些任務衡量的是基礎模型早已知道的慣用 Prisma。
  • 每個儲存格 n=2;較新 API 的知識(文件型技能最可能補充的部分)未被演練。
  • 每項任務每組 n = 2:約 1 分以下的差異屬於雜訊。
  • 規則式評分只能衡量檢查看得到的部分;無法評判品味,也無法判斷結果是否為最佳可能。

安全性

見 security.md。掃描:CRITICAL 9 / HIGH 9 / MEDIUM 0。判定:可安全執行(網路關閉的沙箱)。乾淨的掃描結果不能證明技能安全。

總結

在日常的 Prisma Client 工作上,原生 Codex 已經正確,因此技能只增加一點 Token 成本,在此看不到任何變化。對於本次測試未觸及的嶄新 Prisma 功能,它可能有意義。

完整紀錄

執行日誌:prisma-client-api (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.)
欄位:任務、組-輪次、得分(0-5)、token、秒、通過的檢查、代理開啟的 skill 檔案。

t1-queries control-1: 得分 5.0, token 84040, 秒 35.0, 檢查 7/7, 未開啟
t1-queries control-2: 得分 5.0, token 83803, 秒 36.4, 檢查 7/7, 未開啟
t1-queries oneliner-1: 得分 5.0, token 83731, 秒 38.4, 檢查 7/7, 未開啟
t1-queries oneliner-2: 得分 5.0, token 83779, 秒 38.1, 檢查 7/7, 未開啟
t1-queries treatment-1: 得分 5.0, token 110031, 秒 39.9, 檢查 7/7, 開啟 prisma-client-api
t1-queries treatment-2: 得分 5.0, token 100691, 秒 36.8, 檢查 7/7, 開啟 prisma-client-api
t2-n-plus-1 control-1: 得分 5.0, token 103258, 秒 57.7, 檢查 3/3, 未開啟
t2-n-plus-1 control-2: 得分 5.0, token 103374, 秒 54.2, 檢查 3/3, 未開啟
t2-n-plus-1 oneliner-1: 得分 5.0, token 103307, 秒 51.8, 檢查 3/3, 未開啟

18 次執行、3 個產出檔案

範例產出

SOTA · 装了 skill:src/queries.ts(t1-queries,第 1 次,Codex)

import { prisma } from "./db"; export function getUserWithPosts(id: number) { return prisma.user.findUnique({ where: { id }, include: { posts: { where: { published: true }, orderBy: [{ createdAt: "desc" }, { id: "desc" }], take: 10, }, }, }); } // Pass the last post's id as the cursor for the next page. export function searchPosts(term: string, cursor?: number) { return prisma.post.findMany({ where: { title: { contains: term, mode: "insensitive" } }, orderBy: { id: "asc" }, take: 20, ...(cursor !== undefined ? { cursor: { id: cursor }, skip: 1 } : {}), }); } export function upsertUser(email: string, name: string | null) { return prisma.user.upsert({ where: { email }, update: { name }, create: { email, name }, }); } // Returns { count } with the number of posts transferred. export function transferPosts(fromId: number, toId: number) { return prisma.$transaction(async (tx) => { await tx.user.findUniqueOrThrow({ where: { id: fromId } }); await tx.user.findUniqueOrThrow({ where: { id: toId } }); return tx.post.updateMany({ where: { authorId: fromId }, data: { authorId: toId }, }); }); } // Includes authors with posts; each row has { authorId, _count: { _all } }. export function postCountsByAuthor() { return prisma.post.groupBy({ by: ["authorId"], _count: { _all: true }, orderBy: { authorId: "asc" }, }); }

檢視 Pro