mcpField
A
ai-model-web

ai-model-web

github.com/tencentcloudbase開発79916 回インストール今日更新
リポジトリ

ai-model-web について

CloudBase を使う Web 開発者向けに、@cloudbase/js-sdk でブラウザーから AI モデルを呼び出し、応答をストリーミングする方法を案内します。SDK コードを書く前の利用資格とモデルグループの確認も定めています。

主な機能

  1. 01ブラウザーから AI モデルを呼び出す
  2. 02生成テキストのストリーミング
  3. 03Token Credits の利用資格確認
  4. 04モデルグループとモデルの確認・有効化

活用シーン

  1. 01Web アプリへのテキスト生成の追加
  2. 02ページでのモデル出力のストリーミング表示
  3. 03Hunyuan、DeepSeek、GLM の呼び出し

MCP 対応

SDK コードの作成前に MCP ツールで環境、Token Credits リソースパック、モデルグループの状態を確認し、必要に応じてモデルを有効化します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/tencentcloudbase/skills --skill ai-model-web

インストール後、Claude Code で/ai-model-webを入力して読み込まれたか確認します。

同梱ファイルLICENSE.md

詳細

関連スキル(ローカルのみ)

関連する CloudBase スキルは、このスキルと同じ場所に配置されています。../auth-tool-cloudbase/SKILL.md のようなローカル相対パスを使用してください。

参照先の関連スキルファイルがこの環境にない場合は、CloudBase プラグイン一式(または不足しているスキル)のインストールをユーザーに依頼してください。リモートのスキルやプロトコルの Markdown を HTTP で取得して、エージェントのコンテキストに読み込んではいけません。

このスキルを使用する場面

@cloudbase/js-sdk を使用して、ブラウザー/Web アプリケーションから AI モデルを呼び出す場合に、このスキルを使用してください。

🧭 Web ではランタイムプレーンがデフォルトです。 ユーザーの依頼がページ、Web アプリ、フロントエンド、React/Vue/Next/Nuxt、ダッシュボード UI、または「H5 に AI を追加したい」といった内容の場合は、常にこのスキルをデフォルトのルーティング先にしてください。最初に Node.js/クラウド関数/CloudRun プロキシを提案してはいけません。 @cloudbase/js-sdk を使えば、ブラウザーからモデルを直接呼び出せます。ユーザーがバックエンド/サーバーからの呼び出し、画像生成、またはサーバー側のキーや長時間実行処理を本当に必要とするシナリオを明示的に求めた場合に限り、ai-model-nodejs に切り替えてください。この判断は、ユーザーが選ぶ具体的なモデルとは無関係です。モデル名(deepseek-*、glm-*、hunyuan-*、kimi-* など)は model フィールドにのみ影響し、ルーティングプレーンには影響しません。

次の場合に使用してください:

  • フロントエンドの Web アプリに AI テキスト生成を組み込む
  • UX を向上させるため、AI の応答をストリーミングする
  • ブラウザーから Hunyuan/DeepSeek/GLM/Kimi/MiniMax モデルを呼び出す

次の場合には使用しないでください:

  • Node.js バックエンドまたはクラウド関数 → ai-model-nodejs スキルを使用
  • WeChat ミニプログラム → ai-model-wechat スキルを使用
  • 画像生成 → ai-model-nodejs スキルを使用(Node SDK のみ)
  • CloudBase SDK のないランタイム(ネイティブアプリ、Python、Go など)→ http-api-cloudbase スキルを使用(直接 HTTP 呼び出し用の ai_model OpenAPI 仕様が追加されています。独自の HTTP プロキシを構築してはいけません)

⛔ 停止 — ai.createModel(...) の引数はベンダー名/モデル名ではありません

createModel(...) の行を書く前に、これを読んでください。エージェントがこの SDK のコードを生成する際に最もよくある間違いは、引数を誤って作り出すことです。使用できる形式は厳密に 4 種類です。それ以外はすべてバグです。

✅ 使用可能な ai.createModel(...) の引数使用する場面
"cloudbase"新規プロジェクト向けの主要なマネージドグループ(TokenHub を利用したマルチベンダープール)。ベンダーと具体的なモデルは、generateText/streamText の model フィールドに指定します。例:{ model: "deepseek-v4-flash" }。デフォルトで有効なモデルはありません。SDK を呼び出す前に必ず DescribeAIModels を確認し、対象モデルがなければ UpdateAIModel で有効にしてください。
"hunyuan-v3"廃止予定のレガシープラングループ。 利用できるのは hy3 のみで、プラットフォームはこのグループに新しいモデルを追加しません。既存のコードは引き続き動作しますが、新しいコードでは cloudbase と { model: "hy3" } を使用してください。
"hunyuan-exp"現在の環境について、DescribeAIModels がこの旧レガシービルトイングループを明示的に返す場合に限り使用してください。元のデフォルトモデル hunyuan-2.0-instruct-20251111 はオフラインです(2026-05-31)。この ID を指定してはいけません。
"custom-<your-name>"CreateAIModel で登録した、ユーザー定義の GroupName。custom- で始まる必要があります(例:custom-kimi、custom-openai-compat)。
❌ 次のいずれも記述してはいけません — すべて誤りです
ai.createModel("deepseek")                 // wrong — that's a vendor, not a GroupName
ai.createModel("deepseek-v4-flash")        // wrong — that's a model name, goes in the `model` field
ai.createModel("hunyuan")                  // wrong — vendor family, not a GroupName
ai.createModel("hunyuan-2.0-instruct-20251111")  // wrong — model name
ai.createModel("glm") / ai.createModel("kimi") / ai.createModel("minimax")  // wrong — vendor names
ai.createModel("openai") / ai.createModel("moonshot")  // wrong — vendor names
ai.createModel("custom")                   // wrong — placeholder; use your real custom-<name>
ai.createModel(modelName)                  // wrong — do not reuse the variable that holds the model id
✅ 正しいパターン — GroupName と Model は別々のフィールドです
const model = ai.createModel("cloudbase");          // ← GroupName
await model.generateText({
  model: "deepseek-v4-flash",                       // ← concrete model id
  messages: [...]
});
意思決定手順(ユーザーが特定のモデルを指定した場合)
  1. ユーザーが「DeepSeek v3.2 を使う」/「hunyuan instruct を使う」/「Kimi k2.6 を使う」/「GLM-5 を使う」/…と言います。
  2. createModel("cloudbase") はそのままにします。
  3. モデル ID を model フィールドに設定します:{ model: "deepseek-v3.2" }、{ model: "hy3" }、{ model: "kimi-k2.6" }、{ model: "glm-5" }、…
  4. モデルがすでに有効になっていると決めつけないでください。 SDK 呼び出しを書く前に、DescribeAIModels({ GroupName: "cloudbase" }).Models[] にモデルがあることを確認します。ない場合は、DescribeManagedAIModelList を呼び出して、プラットフォームがサポートする正確な Model 名を確認してください(大文字と小文字は区別されます。綴りを推測しないでください)。その後、Status: 1 を指定して UpdateAIModel で有効にします(Models は全置換なので、すでに有効なモデルすべてと新しいモデルを再送信することを忘れないでください)。

ai.createModel( を入力しようとしていて、括弧内の値がベンダー名、モデル名、または推測した値なら、いったん止めてください。上記の正当な値4つのいずれかである可能性が非常に高いです。


必須の2段階事前確認(SDK コードを書く前)

AI 関連の SDK コードを生成する前に、2段階の事前確認(①利用資格、②グループの準備状況)を実行してください。createModel(...) をすぐに出力し、ユーザーに実行時エラーをデバッグさせると、はるかに大きなコストがかかります。

ステップ 0:環境 ID の取得

MCP ツール queryEnv を action=info で呼び出し、応答から EnvId を読み取ります。以降の確認と購入リンクでは、すべてこの EnvId を使用します。


事前確認 ① — 利用資格(Token Credits リソースパック)

MCP ツールを呼び出します:

callCloudApi(service="tcb", action="DescribeEnvPostpayPackage", params={ EnvId })

合格条件(すべて必須):

  • envPostpayPackageInfoList に少なくとも1つのエントリが含まれている

  • そのエントリの postpayPackageId が pkg_tcb_tokencredits_ で始まっている

  • そのエントリの status が [3, 4] に含まれていない(3 / 4 は通常、期限切れ/無効を意味します。実際の応答を優先してください)

  • ❌ 条件を満たさない → コードの記述を止め、{envId} を実際の ID に置き換えて、次の内容をユーザーに提示します:

    現在の環境には、有効な Token Credits リソースパックがありません。AI API を呼び出す前に購入してください: https://buy.cloud.tencent.com/lowcode?buyType=resPack&envId={envId}&resourceType=token

    購入が完了したらお知らせください。リソースパックの状態を再確認します。

  • ✅ 条件を満たす → 事前確認 ② に進みます。

パラメーターの大文字・小文字の形式は、仕様上 PascalCase です。呼び出しが InvalidParameter を返した場合は、camelCase(envId / envPostpayPackageInfoList)に切り替えて、実際の応答を優先してください。ミニプログラムのシナリオには、追加の成長プランの分岐があります。ai-model-wechat スキルに切り替えてください。


事前確認 ② — グループの準備状況(DescribeAIModels → 必要に応じて UpdateAIModel)

利用資格があるだけでは不十分です。まだ createModel("cloudbase") を呼び出さないでください。 まず、対象の GroupName が環境内に存在し、Status=1 であること、また対象の Model がその Models[] に含まれていることを確認します。

  1. 現在の環境で設定されているグループを一覧表示します:

    callCloudApi(service="tcb", action="DescribeAIModels", params={ EnvId })
    

    AIModelGroups: AIModelGroup[] が返されます。各 AIModelGroup には、GroupName、Type(builtin / custom)、Models: [{ Model, EnableMCP, Tags }]、Status(1 = オン / 2 = オフ)、BaseUrl、Secret、Remark が含まれます。メインの管理対象 GroupName は cloudbase です。

  2. モデルがすでに有効になっていると思い込まないでください。 cloudbase グループの AIModelGroups[?].Models[].Model を確認します。対象モデル(ユーザーが指定していない場合は、deepseek-v4-flash など、デフォルトとして使用するモデル)が見つからない場合は、ステップ 4 に進んで有効にします。まだ createModel("cloudbase") は呼び出さないでください。cloudbase グループ自体が見つからない場合、または Status=2 の場合も、ステップ 4 に進んでください。

  3. ユーザーが管理カタログに含まれるモデルを指定した場合(例:deepseek-v3.2、hy3、glm-5、kimi-k2.6 など):その Model が cloudbase グループの Models[] にすでに含まれているか確認します。含まれていない場合は、ステップ 4 に進みます。モデル ID の正確な表記を推測しないでください。まず DescribeManagedAIModelList で正式な表記を確認してください(ステップ 4 で説明します)。

  4. 管理対象モデルを有効化/追加します(必ず最初に信頼できるカタログと料金を確認します):

    callCloudApi(service="tcb", action="DescribeManagedAIModelList", params={ EnvId })
    

    ManagedAIModelGroup[] が返されます。各グループには、GroupName(例:cloudbase)、Remark、および Models: [{ Model, EnableMCP, ModelSpec{ContextLength, MaxInputToken, MaxOutputToken}, ModelChargingInfo[{Type, InputPrice, OutputPrice, InputOutputUnit, CachePrice}] }] が含まれます。対応モデル名と料金を確認できる唯一の信頼できる情報源です。記憶をもとに推測しないでください。UpdateAIModel の呼び出しには、ここで返された Model 文字列をそのまま使用してください。 有効化する前に、料金もユーザーに提示してください。

    次に有効化します(注意:Models は全件置換です。有効化済みモデルと新しいモデルを、必ずまとめて再送してください):

    callCloudApi(service="tcb", action="UpdateAIModel", params={
      EnvId,
      GroupName: "cloudbase",
      Models: [
        // resend every model that DescribeAIModels already showed as enabled
        { Model: "<already-enabled model, e.g. deepseek-v4-flash>" },
        // append the newly-requested one, using the exact spelling from DescribeManagedAIModelList
        { Model: "<target model>" }
      ],
      Status: 1
    })
    
  5. 要求されたモデルが管理カタログに含まれていない場合(DescribeManagedAIModelList で見つからない場合)→ 次のセクション「カスタムオンボーディング(管理カタログ外のモデル)」に進みます。

すべての Action で service=tcb、Version=2018-06-08 を使用します。パラメーターは PascalCase(EnvId / GroupName / Models / Status)です。呼び出しが InvalidParameter を返した場合に限り、camelCase に切り替えてください。


利用可能なプロバイダーとモデル

ai.createModel(<GroupName>) が受け付ける値は、正確に 4 種類です。

1. "cloudbase" — メインの管理対象グループ(推奨)
  • GroupName: "cloudbase"、Type: "builtin"、Remark: "腾讯云开发"(Tencent CloudBase)
  • Tencent Cloud TokenHub を基盤とする、複数のベンダーを対象とした統合管理プールです。Hunyuan(HY 2.0 Instruct、HY 2.0 Think、Hunyuan-role、Hy3 プレビューなど)、DeepSeek(DeepSeek-V4-Pro、DeepSeek-V4-Flash、Deepseek-v3.2、Deepseek-v3.1、Deepseek-r1-0528、Deepseek-v3-0324 など)、Zhipu GLM(GLM-5、GLM-5-Turbo、GLM-5.1、GLM-5V-Turbo)、Kimi(K2.5、K2.6)、MiniMax(M2.5、M2.7)などを利用できます。提供モデルは随時変更されます。アプリケーションコードに特定の SKU をハードコードしないでください。実行時に確認してください。
  • デフォルトで有効になっているモデルはありません。 環境で実際に有効になっているモデルを確認するため、必ず最初に DescribeAIModels を呼び出してください。対象モデルが見つからない場合は、信頼できるカタログと料金を確認するために DescribeManagedAIModelList を呼び出し、その後 SDK を呼び出す前に UpdateAIModel(Status: 1、Models は全件置換)で有効化してください。
  • 信頼できるカタログと料金:DescribeManagedAIModelList
  • 環境で有効なモデルの一覧:DescribeAIModels
2. "hunyuan-v3" — レガシーのプラングループ(廃止予定)
  • hy3 のみです。このグループに新しいモデルが追加されることはなく、廃止に向けて移行中です。移行先は cloudbase + { model: "hy3" } です
  • 既存のコードでは引き続き使用できます。createModel("hunyuan-v3") を createModel("hy3") に「修正」しないでください。hy3 はモデル ID であり、GroupName ではありません
  • 主にミニプログラム成長プラン環境で関係します(ai-model-wechat を参照)
3. "hunyuan-exp" — 旧レガシー組み込みグループ(互換性のため維持)
  • 環境が明示的に返す場合を除き、Web から使用しないでください(そのフローでは ai-model-wechat スキルに切り替えてください)
  • 元のデフォルトモデル hunyuan-2.0-instruct-20251111 は 2026-05-31 にオフラインになりました。このモデル ID を指定しないでください。このグループが現在公開しているモデルは、DescribeAIModels({ GroupName: "hunyuan-exp" }).Models[] から読み取る必要があります
4. ユーザー定義の GroupName
  • CreateAIModel で登録します(次のセクションを参照)。カスタム GroupName は 必ず custom- で始める必要があります(例:custom-kimi、custom-moonshot、custom-openai-compat)。この命名規則により、プラットフォームが将来追加する可能性のある組み込み/ベンダーの GroupName(cloudbase、hunyuan-exp、deepseek、glm、kimi、minimax、…)との衝突を防げます
  • 例:createModel("custom-kimi")、createModel("custom-openai-compat")

DescribeAIModels がその正確な GroupName を明示的に返した場合を除き、createModel("deepseek") や createModel("custom") のような推測に基づく指定は絶対に行わないでください(古い環境では、過去の deepseek/hunyuan-exp 組み込みグループが残っている場合があります。互換性のため引き続き使用できますが、新しいプロジェクトでは必ず cloudbase を使用してください)。


カスタム登録(管理対象カタログ外のモデル)

ユーザーが管理対象外のモデル(セルフホスト型、企業内モデル、サードパーティの OpenAI 互換エンドポイントなど)を呼び出したい場合、拒否しないでください。登録手順を案内してください。

オプション 1:コンソールでの手続き(推奨、ユーザーが操作)

https://tcb.cloud.tencent.com/dev?envId={envId}#/ai

オプション 2:プログラムによる登録(CreateAIModel)
callCloudApi(service="tcb", action="CreateAIModel", params={
  EnvId: "<envId>",
  GroupName: "custom-<your-name>",  // MUST start with "custom-" (e.g. custom-kimi, custom-openai-compat); never start with "cloudbase"
  BaseUrl: "<OpenAI-compatible endpoint, e.g. https://api.moonshot.cn/v1>",
  Models: [
    { Model: "<model name, e.g. kimi-k2.5>", EnableMCP: true }
  ],
  Remark: "<optional remark>",
  Status: 1,
  Secret: { ApiKey: "<vendor api key supplied by the user>" }
})

登録後、DescribeAIModels でグループが準備できていることを確認し、コードから ai.createModel("<the GroupName you just registered>") を呼び出してください。モデルの追加/削除、キーのローテーション、BaseUrl の変更には UpdateAIModel を使用してください(Models は全置換であることに注意してください)。カスタムグループを削除するには DeleteAIModel を使用します(組み込みグループは削除できません)。

カスタムモデルの料金はサードパーティプロバイダーが請求し、Token Credits リソースパックからは差し引かれません。フィールドの大文字/小文字は実際のコントラクトに従います。InvalidParameter が返された場合は camelCase に切り替えてください。


インストール

npm install @cloudbase/js-sdk

初期化

⚠️ 匿名サインインをデフォルトとして使用しないでください。 新しい環境では匿名ログインはデフォルトで無効になっており、既存の非アクティブな環境も自動的に無効化されています。匿名ログインを手動で有効にした場合でも、匿名ユーザーにはデフォルトで AI モデルの呼び出し権限が付与されません。AI モデルスキルでは、特定のログイン UI を指定していません。この点は次のスキルに委ねてください。

  • ログインプロバイダーの有効化/設定(電話番号の SMS、メール、WeChat Open Platform、ユーザー名+パスワード、OAuth など)→ auth-tool-cloudbase スキルに従ってください(callCloudApi を使用したバックエンド設定)。
  • ブラウザーで実際のサインインフローを構築(ログインフォーム、コールバック、セッションのガード)→ auth-web-cloudbase スキルに従ってください(@cloudbase/js-sdk の認証 API、例:signInWithPassword、signInWithPhone、getSession)。

AI 機能で signInAnonymously() にフォールバックしないでください。匿名ユーザーは AI モデルを呼び出せません。ユーザーが明示的に希望し、トレードオフを了承した場合に限り、AI を使わない読み取り専用のデモで匿名ログインを使用してください。

import cloudbase from "@cloudbase/js-sdk";

const app = cloudbase.init({
  env: "<YOUR_ENV_ID>",
  accessKey: import.meta.env.VITE_PUBLISHABLE_KEY  // auto-provision via queryAppAuth / manageAppAuth, write to .env.local (see auth-web-cloudbase prerequisites)
});

const auth = app.auth;

// CRITICAL: Use auth.getSession() to check login — NOT the deprecated getLoginState().
// getLoginState() returns uid even without real login (just accessKey), causing false positives.
// getSession() returns data.session === undefined when no real login exists.
// Anonymous users are DENIED AI model permissions — calling AI without real login will fail.
const { data: sessionData } = await auth.getSession();
if (!sessionData?.session || sessionData.session.user?.is_anonymous) {
  // No real login or anonymous session — route to sign-in page
  window.location.href = "/login";
  return;
}

const ai = app.ai();

重要な注意事項:

  • トップレベルのインポートを使って同期的に初期化してください。
  • accessKey を使うと、getLoginState() が誤解を招く認証データを返します。非推奨の getLoginState() は、実際にログインしていなくても uid を含むオブジェクトを返すため、単純な !!loginState のチェックが機能しません。代わりに auth.getSession() を使用してください。実際にログインしていない場合は data.session === undefined が返されるため、!!data.session を信頼できる認証ゲートとして使用できます。
  • AI 機能を使用する前に、ユーザーは検証済みのログイン(電話番号、メール、WeChat、ユーザー名+パスワード、カスタム)で認証されている必要があります。匿名ユーザーには AI モデルの権限が付与されません。具体的なフローは auth-web-cloudbase スキルの責任範囲です。
  • accessKey は CloudBase コンソールから取得してください。

generateText() — 非ストリーミング

前提条件: 2 段階の事前チェック(利用資格+グループの準備状況)が完了し、対象モデルが DescribeAIModels({ GroupName: "cloudbase" }).Models[] に存在することを確認済みである必要があります。存在しない場合は、すでに UpdateAIModel で有効化されているはずです。以下の例では説明のために deepseek-v4-flash を使用しています。ユーザーが指定した実際のモデルに置き換えてください。

const model = ai.createModel("cloudbase");

const result = await model.generateText({
  model: "deepseek-v4-flash",  // must already be enabled in this env (DescribeAIModels → UpdateAIModel)
  messages: [{ role: "user", content: "Give me a one-paragraph intro to Li Bai." }],
});

console.log(result.text);           // generated text string
console.log(result.usage);          // { prompt_tokens, completion_tokens, total_tokens }
console.log(result.messages);       // full message history
console.log(result.rawResponses);   // raw model responses

streamText() — ストリーミング

前提条件: 2 段階の事前チェックが完了している必要があります。

const model = ai.createModel("cloudbase");

const res = await model.streamText({
  model: "deepseek-v4-flash",
  messages: [{ role: "user", content: "Give me a one-paragraph intro to Li Bai." }],
});

// Option 1: iterate the text stream (recommended)
for await (let text of res.textStream) {
  console.log(text);  // incremental text chunks
}

// Option 2: iterate the data stream for full response chunks
for await (let data of res.dataStream) {
  console.log(data);  // full response chunk with metadata
}

// Option 3: access final results
const messages = await res.messages;  // full message history
const usage = await res.usage;        // token usage

エラー処理パターン

const model = ai.createModel("cloudbase");

try {
  const result = await model.generateText({
    model: "deepseek-v4-flash",
    messages: [{ role: "user", content: "Generate a concise onboarding checklist." }],
  });

  console.log(result.text);
} catch (error) {
  console.error("Failed to call CloudBase AI from Web", error);
}

型定義

interface BaseChatModelInput {
  model: string;                        // required: model name
  messages: Array<ChatModelMessage>;    // required: message array
  temperature?: number;                 // optional: sampling temperature
  topP?: number;                        // optional: nucleus sampling
}

type ChatModelMessage =
  | { role: "user"; content: string }
  | { role: "system"; content: string }
  | { role: "assistant"; content: string };

interface GenerateTextResult {
  text: string;                         // generated text
  messages: Array<ChatModelMessage>;    // full message history
  usage: Usage;                         // token usage
  rawResponses: Array<unknown>;         // raw model responses
  error?: unknown;                      // error if any
}

interface StreamTextResult {
  textStream: AsyncIterable<string>;    // incremental text stream
  dataStream: AsyncIterable<DataChunk>; // full data stream
  messages: Promise<ChatModelMessage[]>;// final message history
  usage: Promise<Usage>;                // final token usage
  error?: unknown;                      // error if any
}

interface Usage {
  prompt_tokens: number;
  completion_tokens: number;
  total_tokens: number;
}

ベストプラクティス

  1. まず2段階の事前確認を実行します — ①利用資格(DescribeEnvPostpayPackage を使用した Token Credits リソースパックの確認)+②グループの準備状況(有効になっているものを確認する DescribeAIModels、正式な対応モデルカタログを確認する DescribeManagedAIModelList、対象モデルが見つからない場合は Models[] 全体を置き換えて Status: 1 を指定する UpdateAIModel)。事前確認を省略すると、実行時に「model not found」/「model not enabled」エラーが発生します。
  2. モデルがすでに有効になっていると決めつけないでください — deepseek-v4-flash も、hunyuan-* も、その他のモデルも同様です。まず必ず DescribeAIModels で確認してください。対象モデルが見つからない場合は、DescribeManagedAIModelList で正確な Model 文字列を調べ(スペルを推測したり、ベンダーのプレフィックスを作ったりしないでください)、続けて UpdateAIModel で有効にします。
  3. createModel が受け付ける値は、次の4種類だけです — "cloudbase"(メインのマネージドグループ)、"hunyuan-v3"(旧プラングループ。hy3 のみで、廃止予定)、"hunyuan-exp"(さらに古い組み込みモデル)、または CreateAIModel で登録したユーザー定義の GroupName(必ず custom- で始めてください。例:custom-kimi、custom-openai-compat)。createModel("deepseek")/createModel("kimi")/createModel("custom") のように推測して指定することは絶対にしないでください。
  4. SDK のメソッド名やパラメーターを作り出さないでください。 この SKILL.md は @cloudbase/js-sdk の AI API に関する正式なリファレンスです。コードを書く前に、ここ(または以下の「型定義」セクション)でメソッドのシグネチャを確認してください。ここに記載されていないメソッドやフィールドがある場合は、作業を止めて確認を求めるか、MCP ツールを使って実際の契約を確認してください。推測は禁物です。
  5. 新しいマネージドモデルを有効にする前に料金を提示します — DescribeManagedAIModelList は ModelSpec(コンテキスト長、最大入出力トークン数)と ModelChargingInfo(入力/出力/キャッシュの料金、課金単位)を返します。UpdateAIModel を呼び出す前に、料金をユーザーに提示してください。
  6. 長い応答にはストリーミングを使用します — 体感レイテンシーが改善し、対話性も高まります。
  7. エラーを適切に処理します — AI 呼び出しを try/catch で囲んでください。
  8. accessKey を安全に管理します — 公開可能なキーを使用し、シークレットキーは使用しないでください。
  9. 早めに初期化します — アプリのエントリーポイントで SDK をセットアップし、ルーティングの前に認証と AI の両方を利用できる状態にします。
  10. AI 機能に匿名認証を使用しないでください — 新しい環境では匿名ログインはデフォルトで無効になっており、匿名ユーザーには AI モデルの権限が付与されません。AI API を呼び出す前に、確認済みのサインイン(電話番号、メールアドレス、ユーザー名+パスワード、WeChat、カスタム)を必須としてください。プロバイダーの設定は auth-tool-cloudbase スキルに、ブラウザーでのサインインフローは auth-web-cloudbase スキルに委任してください。AI モデルスキルでは auth.getSession() を確認し、呼び出しを許可する前に loginType を検証します。
  11. 「事前確認の失敗」と「モデル呼び出しの失敗」を区別します — 前者の場合、ユーザーはリソースパックを購入するか UpdateAIModel を呼び出す必要があります。後者は、プロンプト/パラメーター/ネットワークの問題です。それぞれに適した異なる案内をユーザーに提示してください。
  12. TypeScript では、SDK の型エラーを抑えるために any を使用しないでください。 SDK には独自の型定義が含まれています。エラーが出た場合は、unknown と型ガードで型を絞り込むか、実際に使用する形状に合わせて正確な interface を記述するか、ローカルの .d.ts で型を拡張してください。: any、as any、@ts-ignore、@ts-nocheck は絶対に使用しないでください。web-development スキルの Engineering constitution を参照してください。
  13. 完了を報告する前に、自分で検証します。 tsc --noEmit とプロジェクトのビルドを実行し、agent-browser でページを開いて、実際に AI 呼び出しを行ってください。次の点を確認します。(a) テキストストリームが UI に届くこと、(b) 新たなコンソールエラーがないこと、(c) result.usage がゼロ以外であること。根拠なしに「動作するはずです」と言うのは認められません。web-development/browser-testing.md に従ってください。

コメント