Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use this skill for Node.js backend AI via @cloudbase/node-sdk (>=3.16.0) — cloud functions, CloudRun, Express, Koa, NestJS, serverless APIs, scheduled jobs, LLM proxies. Only SDK supporting image generation (ai.createImageModel + generateImage). Text models via ai.createModel with groups cloudbase, hunyuan-exp, or custom-*. Model IDs (deepseek-v4-flash, deepseek-v3.2, hunyuan-2.0-instruct-20251111, glm-5, kimi-k2.6) go in the model field of generateText/streamText. MUST run two-step preflight be
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 293% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 310% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 344% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 435% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 383% | 0% |
Sibling CloudBase skills ship beside this skill. Use local relative paths such as ../auth-tool-cloudbase/SKILL.md.
If a referenced sibling skill file is missing from this environment, ask the user to install the full CloudBase plugin (or the missing skill). Do not HTTP-fetch remote skill or protocol markdown into the agent context.
Use this skill for calling AI models from Node.js backends, cloud functions, or CloudRun services via @cloudbase/node-sdk.
> 🧭 Runtime-plane fit. This is the right skill when the AI call truly belongs on the server: image generation (the only SDK that supports it), long-running agent jobs, orchestration across multiple tools, scheduled tasks, or flows that must keep secrets server-side. If the user is building a Web page / frontend AI chat UI, do NOT wrap this SDK behind a backend proxy — route to ai-model-web and call the model directly from the browser. For WeChat Mini Programs use ai-model-wechat. Routing is decided by runtime plane first; the concrete model (deepseek-*, glm-*, hunyuan-*, kimi-*, …) only affects the model field.
Use it when you need to:
Do NOT use for:
ai-model-web skillai-model-wechat skillhttp-api-cloudbase skill (it now includes the ai_model OpenAPI spec for direct HTTP calls to the AI model endpoint; do NOT wrap this SDK behind an HTTP proxy)ai.createModel(...) argument is not a vendor / model nameRead this before writing any createModel(...) line. Agents frequently hallucinate this argument. There are exactly three legal shapes. Anything else is a bug.
| ✅ Legal ai.createModel(...) argument | When to use it | |----------------------------------------|----------------| | "cloudbase" | The main managed group for server-side projects (TokenHub-backed, multi-vendor pool). Vendor + concrete model go into the model field of generateText / streamText, e.g. { model: "deepseek-v4-flash" }. No model is enabled by default — always check DescribeAIModels first and, if the target model is missing, enable it with UpdateAIModel before calling the SDK. | | "hunyuan-exp" | Only if DescribeAIModels explicitly returns this legacy builtin group for the current env. | | "custom-<your-name>" | A user-defined GroupName you onboarded via CreateAIModel. Must start with custom- (e.g. custom-kimi, custom-openai-compat). |
> Image generation is a separate entry point: ai.createImageModel("hunyuan-image"). Do not mix it with createModel(...).
jsai.createModel("deepseek") // wrong — that's a vendor, not a GroupName ai.createModel("deepseek-v4-flash") // wrong — model id goes in the `model` field ai.createModel("hunyuan") / "hunyuan-2.0-instruct-20251111" // wrong — vendor / model name ai.createModel("glm") / "kimi" / "minimax" // wrong — vendor names ai.createModel("openai") / "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
jsconst model = ai.createModel("cloudbase"); // ← GroupName await model.generateText({ model: "deepseek-v4-flash", // ← concrete model id messages: [...] });
createModel("cloudbase") stays the same.model field: { model: "deepseek-v3.2" }, { model: "hunyuan-2.0-instruct-20251111" }, { model: "kimi-k2.6" }, { model: "glm-5" }, …DescribeAIModels({ GroupName: "cloudbase" }).Models[]. If missing, call DescribeManagedAIModelList to confirm the exact Model name the platform supports (case-sensitive — do not guess the spelling) and then enable it via UpdateAIModel with Status: 1 (remember Models is a full replacement).> If you are about to type ai.createModel( and the thing inside the parentheses is a vendor name, a model name, or a guess — stop. It is almost certainly one of the three legal values above.
Before calling any AI API on the server, run the two-step preflight: ① eligibility, ② group readiness. Text generation and image generation draw from the same Token Credits resource pack, and both must complete the preflight before code is emitted.
Call the MCP tool envQuery with action=info and read EnvId from the response.
Call the MCP tool:
callCloudApi(service="tcb", action="DescribeEnvPostpayPackage", params={ EnvId })Pass conditions (all required):
envPostpayPackageInfoList contains at least one entrypostpayPackageId starts with pkg_tcb_tokencredits_status is NOT in [3, 4] (3 / 4 typically mean expired / disabled; trust the live response){envId} with the real id):> The current environment has no active Token Credits resource pack. Please purchase one before calling any AI API: > https://buy.cloud.tencent.com/lowcode?buyType=resPack&envId={envId}&resourceType=token > > Let me know once it's done and I'll re-check the resource pack status.
> Parameter casing is PascalCase by contract. If the call returns InvalidParameter, fall back to camelCase (envId) and trust the live response.
DescribeAIModels → UpdateAIModel if needed)Eligibility alone is not enough. Do not write createModel("cloudbase") yet. First confirm that the target GroupName exists in the env with Status=1, and that the target Model is present in its Models[].
callCloudApi(service="tcb", action="DescribeAIModels", params={ EnvId })
Returns AIModelGroups: AIModelGroup[] with GroupName, Type (builtin / custom), Models: [{ Model, EnableMCP, Tags }], Status (1 / 2), BaseUrl, Secret, Remark. The main managed GroupName is cloudbase.
AIModelGroups[?].Models[].Model for the target group. If the text model you plan to use (e.g. deepseek-v4-flash, or whatever the user asked for) is missing from the cloudbase group's Models[], jump to step 4 and enable it — do not call createModel("cloudbase") yet. Image generation uses createImageModel("hunyuan-image") + model: "hunyuan-image"; verify it is likewise enabled before the call.deepseek-v3.2, hunyuan-2.0-instruct-20251111): check whether that Model is already in the cloudbase group's Models[]. If not, jump to step 4. Do not guess the exact model id — confirm the canonical spelling in DescribeManagedAIModelList first. callCloudApi(service="tcb", action="DescribeManagedAIModelList", params={ EnvId })
Returns ManagedAIModelGroup[] with GroupName, Remark, and Models: [{ Model, EnableMCP, ModelSpec, ModelChargingInfo }]. This is the single source of truth for supported model names and pricing — do not infer them from memory. Use the exact Model string from here when calling UpdateAIModel. ModelChargingInfo includes input / output prices and billing unit. Surface the prices to the user before enabling.
Then enable (note: Models is a full replacement — always resend the already-enabled models together with the new one):
callCloudApi(service="tcb", action="UpdateAIModel", params={ EnvId, GroupName: "cloudbase", Models: [ // resend every model that DescribeAIModels already showed as enabled { Model: "<already-enabled model>" }, // append the newly-requested one, using the exact spelling from DescribeManagedAIModelList { Model: "<target model>" } ], Status: 1 })
DescribeManagedAIModelList) → jump to the next section, Custom onboarding (models outside the managed catalog).> All Actions use service=tcb, Version=2018-06-08. Parameters are PascalCase; fall back to camelCase only on InvalidParameter.
ai.createModel(<GroupName>) accepts exactly three kinds of legal values; ai.createImageModel("hunyuan-image") is the dedicated image-generation entry point.
"cloudbase" — the main managed group (recommended)GroupName: "cloudbase", Type: "builtin", Remark: "腾讯云开发" (Tencent CloudBase)DescribeAIModels first to see what the env has actually enabled; if your target model is missing, call DescribeManagedAIModelList for the authoritative catalog + pricing and then UpdateAIModel (Status: 1, Models full-replacement) to enable it before making the SDK call.DescribeManagedAIModelListDescribeAIModels"hunyuan-exp" — legacy builtin group (kept for compatibility)hunyuan-2.0-instruct-20251111; additional hunyuan SKUs must be discovered at runtime via DescribeAIModels({ GroupName: "hunyuan-exp" }).Models[] — do not hard-code other IDsDescribeAIModels actually returns this group with Status=1. New projects should prefer cloudbaseCreateAIModel (see the next section). The custom GroupName MUST start with custom- (e.g. custom-kimi, custom-moonshot, custom-openai-compat). This naming convention prevents future collisions with built-in / vendor GroupNames (like cloudbase, hunyuan-exp, deepseek, glm, kimi, minimax) that the platform may introduce over timecreateModel("custom-kimi"), createModel("custom-openai-compat")ai.createImageModel("hunyuan-image") + model: "hunyuan-image". Only supported in the Node SDK> Never write guesses like createModel("deepseek") or createModel("custom") unless DescribeAIModels explicitly returned that exact GroupName.
When the user wants a non-managed text model (self-hosted, enterprise-internal, third-party OpenAI-compatible endpoint, …), do not block. Guide them through onboarding:
https://tcb.cloud.tencent.com/dev?envId={envId}#/ai
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>" }
})Once onboarded, confirm with DescribeAIModels that the group is ready, then call ai.createModel("<the GroupName you just registered>") from your code. Use UpdateAIModel to add/remove models, rotate keys, or change BaseUrl (remember Models is a full replacement). Use DeleteAIModel to remove a custom group (builtin groups cannot be deleted).
> Custom-model billing is covered by the third-party provider and does not draw from the Token Credits resource pack. Field casing follows the live contract — fall back to camelCase on InvalidParameter.
bashnpm install @cloudbase/node-sdk
⚠️ The AI feature requires version 3.16.0 or above. Check with npm list @cloudbase/node-sdk.
jsconst tcb = require('@cloudbase/node-sdk'); const app = tcb.init({ env: '<YOUR_ENV_ID>' }); exports.main = async (event, context) => { const ai = app.ai(); // Use AI features };
⚠️ Important: when creating cloud functions that use AI models (especially generateImage() and large text generation), set a longer timeout — these operations can be slow.
Using the MCP tool manageFunctions(action="createFunction"):
Legacy compatibility: if an older prompt still says createFunction, keep the same payload shape but execute it through manageFunctions(action="createFunction").
Set timeout inside the func object:
func.timeout (number)Recommended timeouts:
generateText): 60 – 120 sstreamText): 60 – 120 sgenerateImage): 300 – 900 s (recommended: 900 s)jsconst tcb = require('@cloudbase/node-sdk'); const app = tcb.init({ env: '<YOUR_ENV_ID>', secretId: '<YOUR_SECRET_ID>', secretKey: '<YOUR_SECRET_KEY>' }); const ai = app.ai();
> Prerequisite: the two-step preflight (eligibility + group readiness) has passed. The example below assumes the user did not specify a model, so it uses the cloudbase managed group + deepseek-v4-flash.
jsconst 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
jsconst model = ai.createModel("cloudbase"); try { const result = await model.generateText({ model: "deepseek-v4-flash", messages: [{ role: "user", content: "Summarize today's deployment logs." }], }); console.log(result.text); } catch (error) { console.error("AI request failed", error); }
> Prerequisite: the two-step preflight has passed.
jsconst 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
⚠️ Image generation is only available in the Node SDK, not in the JS SDK (Web) or WeChat Mini Program.
⚠️ Image generation also consumes the Token Credits resource pack, so the two-step preflight must pass before calling it. Per-call cost is higher than text and calls take longer (set cloud function timeout to 900 s).
jsconst imageModel = ai.createImageModel("hunyuan-image"); const res = await imageModel.generateImage({ model: "hunyuan-image", prompt: "A cute kitten playing on the grass", size: "1024x1024", version: "v1.9", }); console.log(res.data[0].url); // image URL (valid for 24 hours) console.log(res.data[0].revised_prompt);// revised prompt when revise=true
tsinterface HunyuanGenerateImageInput { model: "hunyuan-image"; // required prompt: string; // required: image description version?: "v1.8.1" | "v1.9"; // default: "v1.8.1" size?: string; // default: "1024x1024" negative_prompt?: string; // v1.9 only style?: string; // v1.9 only revise?: boolean; // default: true n?: number; // default: 1 footnote?: string; // watermark, max 16 chars seed?: number; // range: [1, 4294967295] } interface HunyuanGenerateImageOutput { id: string; created: number; data: Array<{ url: string; // image URL (24h valid) revised_prompt?: string; }>; }
tsinterface 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; }
envQuery → callCloudApi(tcb, DescribeEnvPostpayPackage) to confirm the Token Credits resource pack (text + image share the same pack); ② group readiness: DescribeAIModels for the cloudbase group and its Models[], DescribeManagedAIModelList for the authoritative supported-model catalog, UpdateAIModel with a full-replacement Models[] + Status: 1 when the target model is missing. If the pack is missing, return the purchase link https://buy.cloud.tencent.com/lowcode?buyType=resPack&envId={envId}&resourceType=token instead of emitting SDK code and letting the user debug runtime errors.deepseek-v4-flash, not hunyuan-image, not anything. Always verify with DescribeAIModels first; if the target is missing, look up the exact Model string in DescribeManagedAIModelList (do not guess the spelling) and then UpdateAIModel to enable it.createModel accepts exactly three kinds of values — "cloudbase" (the main managed group), "hunyuan-exp" (legacy builtin), or a user-defined GroupName registered via CreateAIModel (MUST start with custom-, e.g. custom-kimi, custom-openai-compat). Never guess with createModel("deepseek") / createModel("kimi") / createModel("custom") — the first two are vendor/model names, the last is a placeholder. createImageModel("hunyuan-image") is a separate image API — keep it as-is.@cloudbase/node-sdk's AI surface — look up the method signature here (or in the Type Definitions section) before writing code. If a method or field is not documented here, stop and ask, or check the live contract via the MCP tools. No guessing.DescribeManagedAIModelList returns ModelSpec (context length, max input/output tokens) + ModelChargingInfo (input / output / cache prices, billing unit). Show the prices to the user before calling UpdateAIModel.generateImage costs more per call than text and takes longer. For cloud functions, set timeout to 900s. HTTP-function gateways cap at 60s, so use an async-task + polling pattern. Throttle per-user concurrency and frequency to avoid burning an entire Token pack on one failure.streamText + for await (const chunk of result.textStream) to flush chunks back to the client incrementally. Handle stream interruption in catch and close the underlying response.@cloudbase/node-sdk >= 3.16.0 on the server — image generation is only available from this version. Verify with npm ls @cloudbase/node-sdk to confirm the version actually loaded by the cloud function / cloud run runtime — local and production can drift.DescribeAIModels / DescribeManagedAIModelList. The managed catalog evolves; a single source of truth makes upgrades cheap. For models outside the managed catalog, follow the Custom Onboarding section — never hard-code third-party API keys in business code (let CreateAIModel.Secret.ApiKey hold them via CloudBase).UpdateAIModel (guide the user to purchase / enable). The latter is a parameter issue or upstream error. Do not wrap both in one generic toast.usage.total_tokens and a short prefix. Prompts can leak sensitive content; token counts can leak cost signals.any to silence SDK type errors. The Node SDK ships its own types; narrow with unknown + a type guard, write a precise interface for the shape you consume, or augment types in a local .d.ts. Never : any, as any, @ts-ignore, @ts-nocheck. See the Engineering constitution in the web-development skill — it applies to backend TS too.tsc --noEmit + project build + actually invoke the function (local invoke / manageFunctions(action="invokeFunction") / direct HTTP hit) and confirm usage.total_tokens > 0 and the returned text is not an error envelope. "It should work" without a real round-trip is not acceptable evidence.Other measured skills in the registry, with their headline benchmark lift.