From greennode-agentbase
Manages platform LLM model access and API keys for AI agents. Browse models, configure access, check rate limits, and get OpenAI-compatible endpoint.
How this skill is triggered — by the user, by Claude, or both
Slash command
/greennode-agentbase:agentbase-llmThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Manage API keys and browse LLM models on the GreenNode AI Platform (MAAS). API keys created here are OpenAI-compatible and can be used with the LLM endpoint to power AI agents.
Manage API keys and browse LLM models on the GreenNode AI Platform (MAAS). API keys created here are OpenAI-compatible and can be used with the LLM endpoint to power AI agents.
LLM Endpoint (OpenAI-compatible): https://maas-llm-aiplatform-hcm.api.vngcloud.vn/v1
Use bash .claude/skills/agentbase/scripts/aip.sh help for full command reference.
Read the shared auth setup reference at /agentbase skill's references/auth-setup.md for full IAM credential configuration. In brief: run bash .claude/skills/agentbase/scripts/check_credentials.sh iam to verify credentials are configured, then use TOKEN=$(bash .claude/skills/agentbase/scripts/get_token.sh) to obtain a token. NEVER read .greennode.json or .env directly — always use the helper scripts. On 401: re-run with --force. If check_credentials.sh iam returns MISSING, STOP — you MUST read the "If Credentials Are Not Found" section in /agentbase skill's references/auth-setup.md and follow it exactly. Do NOT skip this or provide your own credential setup instructions.
yes, confirm, ok, approve, proceed, go ahead, do it, ship it, lgtm, or equivalent affirmative. If the user responds with ANYTHING ELSE (parameter changes, questions, corrections, additional info, or ambiguous text), treat it as adjustment input — update the plan and re-present the full summary for confirmation again. NEVER interpret a non-confirmation response as approval. For destructive operations (delete API key), additionally warn that the action is irreversible.--dry-run or preview, show the exact command and API request that would be sent (method, URL, payload) and explain the expected outcome WITHOUT executing. The scripts do not support a --dry-run flag — construct the preview manually. Let user review before proceeding.API keys grant access to LLM models through the OpenAI-compatible endpoint. Once you have a key, you can use it like an OpenAI API key.
List all API keys for the current account.
bash .claude/skills/agentbase/scripts/aip.sh api-keys list [--name NAME] [--page N] [--size N]
Note: AI Platform uses 1-indexed pagination (page=1 is first page).
Response contains a paginated list with fields: listData (array of keys), page, pageSize, totalPage, totalItem. Each key has: id, name, key, status, isDefault, models, createdAt.
Create a new API key. The script sends the request, saves the key to .env, and returns immediately. You must poll api-keys get <name> until status is ACTIVE.
^[a-z0-9\-]{5,50}$ (lowercase letters, digits, hyphens only)bash .claude/skills/agentbase/scripts/aip.sh api-keys create --name my-agent-key [--default]
If creation fails with a quota error (e.g. 400/409 indicating quota exhausted), do NOT auto-retry. Instead:
aip.sh api-keys list.aip.sh api-keys list --name <name> every 5-10 seconds until no key with that exact name remains in listData (the --name filter matches substrings, so verify the exact name is gone, not just that the list is non-empty). Wait for deletion to complete before proceeding. If it doesn't complete within 2-3 minutes, inform the user that the operation is taking longer than expected.After creating a key, remind the user:
Your API key can be used as an OpenAI-compatible key:
- Base URL:
https://maas-llm-aiplatform-hcm.api.vngcloud.vn/v1- API Key: saved to
.envasLLM_API_KEY. Verify withbash .claude/skills/agentbase/scripts/check_credentials.sh llm
Get details of a specific API key. The key field is redacted in stdout by design — the plaintext key is never printed.
bash .claude/skills/agentbase/scripts/aip.sh api-keys get my-agent-key
To load an existing key into .env (e.g. when reusing a key instead of creating one), add --save-env. The key is written to .env as LLM_API_KEY silently — it never appears in output:
bash .claude/skills/agentbase/scripts/aip.sh api-keys get my-agent-key --save-env
# then verify: bash .claude/skills/agentbase/scripts/check_credentials.sh llm
Update an API key (currently supports setting default status).
bash .claude/skills/agentbase/scripts/aip.sh api-keys update my-agent-key --default true
Delete an API key. Confirm with the user before proceeding. The script sends the DELETE request and returns immediately. You must confirm deletion by polling api-keys list --name <name> until no entry with that exact name remains in listData.
bash .claude/skills/agentbase/scripts/aip.sh api-keys delete my-agent-key
Note: a key can only be deleted once it is ACTIVE — deleting a CREATING key fails, and a per-account lock rejects concurrent deletes (400 "User is already deleting API keys.").
Confirm deletion to the user only after the key no longer appears in api-keys list. Do NOT confirm immediately after the script returns — deletion is async.
Browse, inspect, and enable/disable available LLM models. These models are accessible via the OpenAI-compatible endpoint using an API key from above.
List available models with optional filters.
# List all models
bash .claude/skills/agentbase/scripts/aip.sh models list
# Filter by provider and type
bash .claude/skills/agentbase/scripts/aip.sh models list --providers openai --types chat --status ENABLED
Tip: Use
bash .claude/skills/agentbase/scripts/aip.sh models metadatato discover valid filter values for--providers,--types, and--status.
Response contains: listData (array of models), page, pageSize, totalPage, totalItem. Key fields in each model: uuid, name, code, path, description, modelStatus, isFree, provider, types.
Get detailed information about a specific model.
bash .claude/skills/agentbase/scripts/aip.sh models get MODEL_UUID
Get available filter options (providers, types, use cases) for model listing.
bash .claude/skills/agentbase/scripts/aip.sh models metadata
This is useful to discover what providers, model types, and use cases are available before filtering the model list.
Enable an LLM model for your account.
bash .claude/skills/agentbase/scripts/aip.sh models enable MODEL_UUID
After enabling, verify by fetching the model detail and checking isEnabled == true. The enable operation is synchronous — verify immediately after the call returns.
Billing errors: If the enable request fails with a billing-related error (e.g. 400/402/403 indicating unpaid balance, insufficient credits, or billing not activated), do NOT retry. Instead:
Disable an LLM model for your account.
bash .claude/skills/agentbase/scripts/aip.sh models disable MODEL_UUID
Check rate limit configuration for a specific model.
bash .claude/skills/agentbase/scripts/aip.sh models rate-limit MODEL_UUID
Once you have an API key, you can use GreenNode LLM models with any OpenAI-compatible client:
from openai import OpenAI
client = OpenAI(
api_key="YOUR_GREENNODE_API_KEY",
base_url="https://maas-llm-aiplatform-hcm.api.vngcloud.vn/v1",
)
response = client.chat.completions.create(
model="MODEL_PATH", # use the `path` field from model detail (not `code`). If `path` is missing, use `code`.
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_GREENNODE_API_KEY",
baseURL: "https://maas-llm-aiplatform-hcm.api.vngcloud.vn/v1",
});
const response = await client.chat.completions.create({
model: "MODEL_PATH", // use the `path` field from model detail (not `code`). If `path` is missing, use `code`.
messages: [{ role: "user", content: "Hello!" }],
});
| Error | Cause | Fix |
|---|---|---|
| 401 Unauthorized | Expired or invalid IAM token | Re-obtain token with valid client_id/client_secret |
| 403 Forbidden | Service account lacks permissions | Check IAM permissions at GreenNode IAM console https://iam.console.vngcloud.vn |
| 404 Not Found | API key name or model UUID not found | Verify with a list operation |
| 409 Conflict | API key name already exists | Choose a different name |
| Invalid name | Name doesn't match ^[a-z0-9\-]{5,50}$ | Use only lowercase letters, digits, and hyphens (5-50 chars). Note: this pattern differs from Identity service which allows uppercase and underscores (^[a-zA-Z0-9_-]+$, 3-50 chars) |
| 400/402/403 on model enable | Billing issue (unpaid balance, no credits, billing not activated) | Check and resolve billing at https://aiplatform.console.vngcloud.vn/models before retrying |
api-keys or models) and operation.aip.sh api-keys list.isDefault: true. If the user says "use any" or "just pick one", use the default key..env by running aip.sh api-keys get <name> --save-env. Reusing a key without this step leaves LLM_API_KEY unset — the key is only auto-saved on create, so an existing key must be captured explicitly. Confirm with check_credentials.sh llm.api-keys create, ask for the key name if not provided. Validate it matches ^[a-z0-9\-]{5,50}$.200 with the plaintext key in the response (initial status: CREATING). The script saves the key to .env immediately and returns. You must then poll the status by calling aip.sh api-keys get <name> every 5-10 seconds until the status field is ACTIVE. The key is already in .env from the create step — do NOT re-run --save-env here, it is redundant. The plaintext key is redacted from all output by design — never expect to see it; confirm it landed with check_credentials.sh llm.aip.sh api-keys list --name <name> every 5-10 seconds until no key with that exact name remains in listData (the --name filter is a substring match — confirm the exact name is absent). Only confirm deletion to the user after the key is gone. Note: a key must be ACTIVE to be deleted, and concurrent deletes are rejected with 400 "User is already deleting API keys."..env as LLM_API_KEY (verify with check_credentials.sh llm). Never print the plaintext key — it is redacted from all command output by design.path field — this is what must be passed as the model parameter when calling the LLM API (not code; if path is missing, fall back to code). Do NOT show pricing/billing info (inputPrice, outputPrice) to the user — pricing may be subject to negotiated contracts; refer users to the billing dashboard instead.status=ENABLED and sorted by most recent first, then let the user choose. Do not auto-select or recommend a specific model unless the user explicitly asks for a recommendation.aip.sh models enable, if the request fails with a billing-related error (400/402/403 with messages about billing, credits, or payment), do NOT retry. Inform the user that the operation failed due to a billing issue and that they need to check and resolve their billing status at https://aiplatform.console.vngcloud.vn/models before retrying. Do not attempt workarounds — billing issues must be resolved by the user.npx claudepluginhub vngcloud/greennode-agentbase-skills --plugin greennode-agentbaseReference guide for GreenNode AgentBase platform: architecture, services (Identity, Runtime, Memory, Observability), SDK, IAM setup, and credentials. Activated for platform overview questions.
Builds generative AI apps on Amazon Bedrock: invoke models (Converse/InvokeModel), RAG with Knowledge Bases, agents, guardrails, prompt caching, quota/throttle diagnosis, cost tracking, model migration, and AgentCore Payments.
Configures TrueFoundry AI Gateway for unified OpenAI-compatible LLM access, provider account integrations, content safety guardrails, and request observability (traces, costs, errors).