ワークフロー / JevModel

Airtableのテキスト分類:Run a scriptオートメーションとJevでレコードに自動ラベルを付ける

ベースを離れずにAirtableの長文フィールドを分類する方法。レコードが条件に一致したときにオートメーションを起動し、Run a scriptアクションからfetch()でJevModelを呼び、ラベル・確率・要確認フラグをレコードに書き戻します。シークレット、Airtableのスクリプト制限、CSVとBatchによる既存レコードの一括処理、テスト、ノーコードツールの方が向く場面も解説します。

最終更新:

要点:スクリプトアクション1つ、レコード1件につきリクエスト1回

  • Airtableのオートメーションには汎用の「HTTPリクエスト送信」アクションがないため、外部のAI APIはRun a scriptアクションからfetch()で呼びます。「When a record matches conditions」(テキストが空でない、カテゴリが空)で起動し、レコードIDと本文を入力変数として渡し、APIキーはAirtableのシークレットに置いてinput.secret()で読みます。
  • スクリプトは本文だけをJevModelの/api/v1/systemoneに送り、自分で定義した2〜12個のカテゴリのChoiceを尋ねます。その後table.updateRecordAsync()で、選ばれたラベルを単一選択フィールドに、確率を数値フィールドに書き込み、確率が低い・other・エラーのときは要確認チェックボックスをオンにします。
  • Airtableはスクリプト1回の実行あたりの制限を公開しており、fetchリクエスト50回やfetchの30秒タイムアウトなどがあります。またTeamプランの試用期間中はこのアクションを使えません。ラベルを付けたレコード1件が、トークン課金の通常のJevリクエスト1回です。認証済みアカウントは100,000トークン無料から始まります。既存レコードはCSVに書き出してConsole → Batchで処理します(購入前は1バッチ50行、購入後1,000行)。

Airtableでのテキスト分類はどんな形になるか

Airtableのベースには、人が手で仕分けている自由記述がよくたまります。フォームの回答、顧客からの依頼、フィードバック、プログラムへの応募、コンテンツ案などです。分類とは、1つの長文フィールドの本文を読み、短い固定リストからカテゴリを1つ埋めることで、誰かが全行を読む前にビュー、フィルター、次のオートメーションが動けるようにすることです。実用的なテーブルには4つのフィールドが必要です。元の本文(Long text)、Category(選択肢がラベルIDと完全に一致する単一選択。例:billing、bug、feature_request、other)、Confidence(小数2桁の数値)、Needs review(チェックボックス)。カテゴリ一覧は短く互いに排他的にし、必ずotherを入れて、どれにも当てはまらない本文の正直な行き先を用意します。緊急度も重要なら、カテゴリにurgentを足すのではなく、別のはい/いいえの質問として尋ねます。混ぜると両方の答えが悪くなります。本ガイドは1レコード1カテゴリを扱います。複数カテゴリに同時に当てはまりうるなら、複数選択フィールドを使い、先にマルチラベル分類のガイドを読んでください。

顧客フィードバック分類:テーマは1つ、優先度は別、感情分析だけでは足りない理由Jev で問い合わせを振り分けるChoice, Score, and Noul

Airtableのオートメーションを手順どおりに設定するには

手順は5つです。1)上の4フィールドを作り、最初の実行前にすべてのラベルIDを単一選択の選択肢として追加します。スクリプトは名前で選択肢を書き込むので、名前が一致している必要があります。2)Automationsでオートメーションを作り、トリガーに「When a record matches conditions」を選び、条件を2つ設定します。テキストフィールドが空でないこと、Categoryが空であること。フォーム回答が届いたときなど、レコードがその状態に入ると起動し、Categoryを書き込むとレコードが条件から外れるため、自分の更新でループしません。3)「Run a script」アクションを追加します。入力変数のサイドバーで、トリガーのAirtableレコードIDに対応するrecordIdと、テキストフィールドに対応するtextを追加します。4)メール認証済みのアカウントでConsole → API keysからJevModelのAPIキーを作り、スクリプトエディタのSecretsタブにJEVMODEL_API_KEYとして追加します。スクリプトはinput.secret("JEVMODEL_API_KEY")で読みます。Airtableはシークレットを使うスクリプトの編集を、そのシークレットにアクセスできる人に限定し、コンソール出力からシークレットを伏せます。5)サンプルレコードでアクションをテストし、実行履歴と実行ログを確認してからオートメーションをオンにします。Jevの呼び出しが失敗したらCategoryは空のままにしてNeeds reviewをオンにし、一時的なエラーで誤ったラベルが付かないようにします。

JevModel API:リクエストと応答最初の Jev 判断を実行する

想定しておくべきAirtableとJevModelの制限は

Airtable側では、ヘルプセンターがRun a scriptアクションの制限を挙げています。スクリプトのタイムアウトは30秒と記載(執筆時点では一時的に120秒に緩和)、fetch1回あたり30秒、スクリプトAPI呼び出しは12秒でタイムアウト、メモリ512MB、1回の実行でfetchリクエスト50回とselectRecordsクエリ30回まで、変更は毎秒15回までで1回の変更は最大50レコードです。このアクションは制限の差はあるもののすべてのプランで使えますが、Teamプランの試用期間中は使えません。例のように1回の実行で1レコードなら、これらの制限には遠く及びません。JevModel側では、リクエスト全体(stateとquestions)が8,000文字以内である必要があるため、長い本文は送る前に切り詰めます。例では先頭6,000文字だけを残しています。1リクエストで尋ねられる質問は1〜8個。Choiceの選択肢は2〜12個で、IDは小文字で始まり小文字・数字・アンダースコアだけを使います。Scoreは2〜10段階の順序付きレベルです。modelフィールドも冪等キーもありません。同じレコードでオートメーションを再実行すれば新しいリクエストとして再び課金されます。失敗した実行は返金されます。ラベルを付けたレコード1件が、トークン残高から引かれる通常のAPIリクエスト1回です。認証済みアカウントは100,000トークン無料から始まり、有料パックは料金ページに載っています。

JevModel の料金と Jev 無料枠JevModel API:リクエストと応答

比較:Run a script vs ノーコードツール vs CSV書き出しとBatch

3つとも同じJevの質問を送ります。違うのはロジックをどこに置き、結果をどうベースに戻すかです。下表はワークフローの形の比較で精度の比較ではなく、どの行もベンチマークではありません。

Zapierテキスト分類:AI by Zapier Classify vs Vertex Classify Text vs HTTP → JevMake.com Categorize Text:AI Toolkit vs HTTP → Jev(型付きラベルと信頼度しきい値)JevModel API によるバッチテキスト分類
比較:Run a script vs ノーコードツール vs CSV書き出しとBatch
観点AirtableのRun a script → Jevノーコードツール(Zapier、Make、n8n…)CSV書き出し → Console → Batch
実行場所ベースの中、オートメーションのアクションとしてツール側で、Airtable用トリガーとアクションを使うブラウザで1回だけ
タイミングレコードが条件に一致した直後ツールのポーリング/Webhookの方式次第既存分をまとめて事後に
結果の書き戻し同じスクリプト内のtable.updateRecordAsync()ツールの「レコード更新」ステップ書き出した回答を再インポートか貼り付け
Jevの出力Choiceのラベルと確率同じ回答をツール側でマッピング行ごとの回答(購入前は1バッチ50行、購入後1,000行)

コード例:1レコードを分類してラベルを書き戻す(説明用)

スクリプトをRun a scriptアクションに貼り付け、テーブル名、フィールド名、ラベル定義を自分のベースに合わせて書き換えます。リクエストはJevModelのドキュメントどおりです。認証済みアカウントのBearerキーでPOST /api/v1/systemoneし、stateと名前付きの質問を送ります。ここではcategoryというChoiceが1つです。成功した応答はcode 0でdata.answersを含みます。本サイトは常にOpenRouter経由でtypesafe/jev-1.13を呼ぶため、modelフィールドはありません。JevModelはJevを開発するTypeSafe AIとは独立しています。スクリプトが送るのは本文だけで、氏名、メール、ほかの列は送りません。単一選択の値はnameを持つオブジェクトとして書き込み、その選択肢はフィールドに既に存在している必要があります。仮のしきい値未満のレコード、otherと判定されたレコード、呼び出しに失敗したレコードはNeeds reviewがオンになるので、このチェックボックスで絞り込んだビューが人の作業キューになります。0.7は仮の値です。ラベル付きサンプルから自分でしきい値を決めてください。

JevModel API:リクエストと応答Choice, Score, and NoulJev probability, confidence and human-review thresholds
// Illustrative only. Airtable automation → "Run a script" action.
// Input variables: recordId (Airtable record ID from the trigger), text (the long-text field).
// Secret: JEVMODEL_API_KEY (Secrets tab in the script editor).
// Fields: Category (single select), Confidence (number), Needs review (checkbox).
const { recordId, text } = input.config();
const table = base.getTable("Requests");

const res = await fetch("https://jevmodel.app/api/v1/systemone", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + input.secret("JEVMODEL_API_KEY"),
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    // The whole request must stay within 8,000 characters.
    state: { text: String(text || "").slice(0, 6000) },
    questions: {
      category: {
        type: "choice",
        instructions: "Which team should handle this request submitted through our form?",
        criteria: {
          billing: "Invoices, payments, refunds, or plan changes.",
          bug: "Something is broken, shows an error, or behaves unexpectedly.",
          feature_request: "Asks for something the product does not do yet.",
          other: "Anything that fits none of the labels above.",
        },
      },
    },
  }),
});
const out = await res.json();

if (out.code !== 0) {
  // Leave Category empty and hand the record to a person.
  await table.updateRecordAsync(recordId, { "Needs review": true });
  console.log("Jev call failed: " + out.message);
} else {
  const { choice, probabilities } = out.data.answers.category;
  const p = probabilities ? probabilities[choice] : 0;
  await table.updateRecordAsync(recordId, {
    Category: { name: choice }, // the option must already exist in the field
    Confidence: p,
    "Needs review": p < 0.7 || choice === "other", // 0.7 is a placeholder
  });
}

ラベルをどう検証し、既存レコードをどう扱うか

まず、人がすでにカテゴリを付けたレコードから始めます。数百件を本文と人手のラベル付きでCSVに書き出し、本文をJevModel Console → Batchにアップロードして同じChoiceの質問を実行し、行ごとの回答を書き出します。次に表計算ソフトでラベルごとに2列を比べます。Batchは精度を計算してくれません。どのペアが混同されやすいか、確率のしきい値を上げると一致率がどう変わるかを見て、曖昧な定義を書き直し、同じサンプルで再実行してからオートメーションをオンにします。既存レコードにラベルを付けるのも、このCSVの経路がいちばん簡単です。オートメーションは新たに条件に一致したレコードでしか起動せず、1回の実行で多数のレコードをループするスクリプトはすぐにfetch50回の上限に達します。運用開始後は、Needs reviewで絞り込みConfidenceで並べたビューを置き、毎週otherの割合を確認します。割合が増えていれば、カテゴリ一覧が実際の投稿内容に合わなくなっています。誤り率を測るまでは、ラベルを理由に削除・非表示・メール送信をさせず、ラベルのフィールドは人が直せるよう編集可能にしておきます。

Evaluate a Jev workflowJev probability, confidence and human-review thresholdsGoogleスプレッドシートのテキスト分類:=AI()関数 vs Apps Script → Jev API

Airtableではどの構成を選ぶべきか

作業がベースの中で行われ、短いスクリプトを編集でき、プランにこのアクションが含まれているならRun a scriptを選びます。ほかの自動化がすでにノーコードツールで動いている、または同じ本文をSlack、メール、CRMにも送る必要があるならノーコードツールを。Zapier、Make、n8n、Power Automate、Pipedreamの各ガイドで同じJevリクエストを紹介しています。既存分を一度に処理したい、あるいは自動化を作る前にラベル定義を試したいなら、CSVとConsole → Batchを。データがAirtableではなくGoogleスプレッドシートにあるなら、Googleスプレッドシートのガイドが同じパターンをApps Scriptで解説しています。どれを選んでも確認すること:1)明確なotherを含むラベル定義を書く、2)緊急度は別のはい/いいえの質問にする、3)本文だけを送り、8,000文字のリクエスト上限未満に切り詰める、4)呼び出しが失敗したらカテゴリを空のままにしてレコードに印を付ける、5)まずラベルと確認用ビューだけにし、ラベル付きサンプルで一致率を測ってから後続のアクションを加える。JevModelはテキスト専用でオープンソースではありません。Airtableの添付ファイル、画像、音声はこの構成では分類されません。

マルチラベルテキスト分類:1つのChoice、複数のはい/いいえ、それとも2回目のリクエストかn8n Text Classifierノード:組み込み分類 vs ワークフローからJevを呼ぶPower Automateテキスト分類:AI Builderカテゴリモデル vs HTTP → JevPipedreamテキスト分類:Hugging Faceアクション vs HTTP → Jev(型付きラベル)Jevはマルチモーダル/ダウンロード可能なモデルか?JevModelの実態

よくある質問

スクリプトなしでAirtableのオートメーションからAI APIを呼べますか?

任意のAPIには呼べません。Airtableのヘルプセンターは、オートメーションに汎用の「HTTPリクエスト送信」アクションはないと説明しており、外部呼び出しはRun a scriptアクション内のfetch()で行います。スクリプトを書かないなら、Zapier、Make、n8nなどのノーコードツールのAirtableトリガーとHTTPステップを使います。

なぜ「When a record is created」ではなく「When a record matches conditions」で起動するのですか?

グリッドで手入力したレコードは空のまま作られ、少し後に本文が入ることがあるため、作成トリガーだと空のフィールドを送る恐れがあります。「本文が空でなく、Categoryが空」を条件にすれば分類すべき内容が入るまで待ち、Categoryを埋めるとレコードが条件から外れるので、同じレコードが再送されません。

既存の数千件のAirtableレコードにラベルを付けるには?

ビューをCSVに書き出し、同じChoiceの質問でJevModel Console → Batchにかけ(購入前は1バッチ50行、購入後1,000行)、レコードIDで回答を取り込み直します。オートメーションは新しいレコード向けです。スクリプト1回の実行で許されるfetchは50回なので、1回の実行で大きなテーブルをループするのは現実的ではありません。

JevでAirtableのレコードを分類する費用は?

分類したレコード1件が通常のAPIリクエスト1回で、JevModelの残高からトークン単位で課金されます。認証済みアカウントは100,000トークン無料から始まり、1リクエスト内の複数の質問はまとめて課金されます。本文が短く、1レコード1リクエストなら使用量は小さく済みます。Airtableのオートメーション実行回数は別途Airtableのプランで数えられます。最新のパックは料金ガイドを参照してください。

JevModel は独立したプロジェクトで、TypeSafe AI とは提携していません。