পরিচালিত এজেন্টদের পরিচয়পত্র

ক্রেডেনশিয়াল হলো সার্ভার-পরিচালিত গোপনীয় তথ্য, যা আপনার এজেন্টদেরকে তৃতীয় পক্ষের পরিষেবাগুলিতে অ্যাক্সেস করতে দেয়, অথচ সেই গোপনীয় তথ্যটি এজেন্টের পরিবেশে প্রবেশ করে না। আপনি একটি ক্রেডেনশিয়াল একবার সংরক্ষণ করেন, আইডি দ্বারা সেটিকে রেফারেন্স করেন, এবং ইগ্রেস প্রক্সি অনুরোধের সময় সেটিকে রিজলভ করে ইনজেক্ট করে দেয়।

গোপন মানগুলো শুধুমাত্র লেখার জন্য। একবার সংরক্ষণ করা হলে, সেগুলো কোনো এন্ডপয়েন্ট থেকে আর ফেরত দেওয়া হয় না, ফলে কোনো হ্যাক হওয়া এজেন্ট তার ব্যবহৃত টোকেনগুলো পুনরায় পড়তে পারে না।

ক্রেডেনশিয়াল ব্যবহারের প্রধান জায়গা হলো environment.network এর নেটওয়ার্ক অ্যালাওলিস্ট। প্রথমে সিক্রেটটি সংরক্ষণ করুন:

পাইথন

from google import genai

client = genai.Client()

credential = client.credentials.create(
    id="github-production",
    type="bearer_token",
    token="ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
)

print(f"Credential ID: {credential.id}, Status: {credential.status}")

জাভাস্ক্রিপ্ট

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const credential = await client.credentials.create({
    id: "github-production",
    type: "bearer_token",
    token: "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
});

console.log(`Credential ID: ${credential.id}, Status: ${credential.status}`);

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/credentials" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "id": "github-production",
    "type": "bearer_token",
    "token": "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'

তারপর এটিকে সেই ডোমেইনের সাথে সংযুক্ত করুন যা এটি প্রমাণীকরণ করে:

পাইথন

interaction = client.interactions.create(
    agent="antigravity-preview-09-2026",
    input="Triage the open issues in my-org/my-repo.",
    environment={
        "type": "remote",
        "network": {
            "allowlist": [
                {"domain": "api.github.com", "credential": "github-production"},
                {"domain": "*"},
            ]
        },
    },
)

জাভাস্ক্রিপ্ট

const interaction = await client.interactions.create({
    agent: "antigravity-preview-09-2026",
    input: "Triage the open issues in my-org/my-repo.",
    environment: {
        type: "remote",
        network: {
            allowlist: [
                { domain: "api.github.com", credential: "github-production" },
                { domain: "*" },
            ],
        },
    },
});

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "agent": "antigravity-preview-09-2026",
    "input": "Triage the open issues in my-org/my-repo.",
    "environment": {
        "type": "remote",
        "network": {
            "allowlist": [
                { "domain": "api.github.com", "credential": "github-production" },
                { "domain": "*" }
            ]
        }
    }
}'

এজেন্টটি এখন api.github.com এ প্রমাণীকৃত অনুরোধ পাঠায়, এবং টোকেনটি স্যান্ডবক্সের ভিতরে কখনোই থাকে না।

শংসাপত্রের প্রকারভেদ

প্রতিটি ক্রেডেনশিয়ালের একটি type থাকে, যা নির্ধারণ করে এটি কোন কোন ফিল্ড গ্রহণ করবে এবং প্রক্সি কীভাবে তা প্রয়োগ করবে।

প্রকার ব্যবহারের ক্ষেত্র আচরণ
bearer_token ব্যক্তিগত অ্যাক্সেস টোকেন, বট টোকেন, স্ট্যাটিক এপিআই কী প্রক্সিটি টোকেনটিকে রিকোয়েস্ট হেডার হিসেবে যুক্ত করে। কোনো রিফ্রেশ লজিক নেই।
oauth2 OAuth অ্যাপ এবং ব্যবহারকারী-প্রতিনিধিত্বমূলক প্রবাহ প্রক্সিটি রিফ্রেশ টোকেনের বিনিময়ে অ্যাক্সেস টোকেন গ্রহণ করে এবং মেয়াদ শেষ হয়ে গেলে সেগুলোকে রিফ্রেশ করে।
environment_variable ক্লায়েন্ট SDK যা প্রসেস এনভায়রনমেন্ট থেকে গোপনীয় তথ্য পড়ে এজেন্টের পরিবেশে একটি প্লেসহোল্ডার জমা হয়। প্রক্সি বহির্গামী অনুরোধগুলিতে আসল গোপনীয় তথ্যটি প্রতিস্থাপন করে।

নেটওয়ার্ক অনুমোদিত তালিকায় থাকা ক্রেডেনশিয়াল ব্যবহার করুন।

একটি allowlist নিয়মে credential যোগ করলে প্রক্সি সেই ডোমেইনে পাঠানো প্রতিটি বহির্গামী অনুরোধকে প্রমাণীকরণ করে। কোনো এজেন্টকে একটি ব্যক্তিগত API, একটি ব্যক্তিগত রিপোজিটরি, বা একটি ব্যক্তিগত বাকেটে অ্যাক্সেস দেওয়ার জন্য এটিই প্রস্তাবিত উপায়।

আপনি একই অ্যালাওলিস্টে অথেনটিকেটেড এবং আনঅথেনটিকেটেড নিয়মগুলো মিশ্রিত করতে পারেন:

পাইথন

interaction = client.interactions.create(
    agent="antigravity-preview-09-2026",
    input="Sync the open Jira issues into the tracking sheet in my repo.",
    environment={
        "type": "remote",
        "sources": [
            {
                "type": "repository",
                "source": "https://github.com/your-org/backend",
                "target": "/backend-app",
            }
        ],
        "network": {
            "allowlist": [
                {"domain": "github.com", "credential": "github-production"},
                {"domain": "api.atlassian.com", "credential": "jira-oauth"},
                {"domain": "*.googleapis.com"},
            ]
        },
    },
)

জাভাস্ক্রিপ্ট

const interaction = await client.interactions.create({
    agent: "antigravity-preview-09-2026",
    input: "Sync the open Jira issues into the tracking sheet in my repo.",
    environment: {
        type: "remote",
        sources: [
            {
                type: "repository",
                source: "https://github.com/your-org/backend",
                target: "/backend-app",
            },
        ],
        network: {
            allowlist: [
                { domain: "github.com", credential: "github-production" },
                { domain: "api.atlassian.com", credential: "jira-oauth" },
                { domain: "*.googleapis.com" },
            ],
        },
    },
});

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "agent": "antigravity-preview-09-2026",
    "input": "Sync the open Jira issues into the tracking sheet in my repo.",
    "environment": {
        "type": "remote",
        "sources": [
            {
                "type": "repository",
                "source": "https://github.com/your-org/backend",
                "target": "/backend-app"
            }
        ],
        "network": {
            "allowlist": [
                { "domain": "github.com", "credential": "github-production" },
                { "domain": "api.atlassian.com", "credential": "jira-oauth" },
                { "domain": "*.googleapis.com" }
            ]
        }
    }
}'

যেহেতু প্রক্সি প্রতিটি অনুরোধের জন্য ক্রেডেনশিয়ালটি সমাধান করে, তাই একটি oauth2 ক্রেডেনশিয়াল স্বয়ংক্রিয়ভাবে তার অ্যাক্সেস টোকেন রিফ্রেশ করে। অ্যাক্সেস টোকেনের মেয়াদ শেষ হয়ে গেলেও একটি দীর্ঘস্থায়ী ইন্টারঅ্যাকশন ভেঙে যায় না।

credential এবং transform একত্রিত করা

Allowlist নিয়মগুলি একটি ইনলাইন transform অবজেক্টও গ্রহণ করে, যা সরাসরি নিয়মের উপর হেডার সেট করে। উভয় পদ্ধতিই ইগ্রেস প্রক্সি দ্বারা ওয়্যারে প্রয়োগ করা হয়, তাই উভয় ক্ষেত্রেই হেডারের মান স্যান্ডবক্সের ভিতরে কখনও বিদ্যমান থাকে না। উভয় ফিল্ডই একই নিয়মে থাকতে পারে।

নিয়ম কনফিগারেশন আচরণ
শুধুমাত্র credential প্রক্সিটি ক্রেডেনশিয়ালটি রিজলভ করে এবং ডোমেইনে করা প্রতিটি অনুরোধে এর হেডারটি যুক্ত করে দেয়।
শুধুমাত্র transform স্ট্যাটিক হেডার ইনজেকশন। আপনি যে হেডারগুলো লেখেন, সেগুলো হুবহু পাঠানো হয়।
উভয় প্রথমে ক্রেডেনশিয়াল প্রয়োগ করা হয়, তারপর তার উপরে transform মার্জ করা হয়। যদি উভয়ই একই কী সেট করে, তবে একটি সুস্পষ্ট transform হেডার প্রাধান্য পায়।
কোনটিই না ডোমেইনটি অনুমোদিত এবং কোনো হেডার যুক্ত করা হয়নি।

যখন আপনি কোনো গোপনীয় তথ্য একবার সংরক্ষণ করে আপনার প্রোজেক্টের প্রতিটি এনভায়রনমেন্ট, এজেন্ট এবং ট্রিগার থেকে সেটিকে রেফারেন্স হিসেবে ব্যবহার করতে চান, এবং যখন আপনি চান যে আপনার জন্য অ্যাক্সেস টোকেন রিফ্রেশ ও রোটেশন স্বয়ংক্রিয়ভাবে সম্পন্ন হোক, তখন ক্রেডেনশিয়াল ব্যবহার করা যুক্তিযুক্ত। একটি ইনলাইন transform তখন উপযুক্ত হয় যখন ভ্যালুটি একটিমাত্র কলের অন্তর্গত হয়, যেমন একটি টোকেন যা আপনি ইন্টারঅ্যাকশন তৈরি করার ঠিক আগে নিজেই জেনারেট করেন।

এই দুটিকে একত্রিত করা একটি সাধারণ বিষয়। ক্রেডেনশিয়ালটিতে অথেনটিকেশন হেডার থাকে এবং transform একই অনুরোধে আপস্ট্রিম সার্ভিসের প্রত্যাশিত অন্যান্য সবকিছু যোগ করে:

{
    "domain": "api.atlassian.com",
    "credential": "jira-oauth",
    "transform": {
        "X-Atlassian-Workspace": "my-workspace-id"
    }
}

একটি সিক্রেটকে ইনলাইন transform থেকে বের করে ক্রেডেনশিয়ালে স্থানান্তর করতে, এটিকে POST /credentials দিয়ে স্টোর করুন, transform অথ হেডারটি "credential": "<id>" দিয়ে প্রতিস্থাপন করুন এবং transform অবজেক্টের বাকি অংশ অপরিবর্তিত রাখুন।

MCP সার্ভারগুলির সাথে পরিচয়পত্র ব্যবহার করুন

রিমোট এমসিপি সার্ভারগুলো একই credential ফিল্ড গ্রহণ করে। এটি একটি mcp_server টুলে সেট করলে, প্রক্সিটি সেই সার্ভারে পাঠানো প্রতিটি অনুরোধে অথ হেডারটি যুক্ত করে দেয়:

পাইথন

interaction = client.interactions.create(
    agent="antigravity-preview-09-2026",
    input="Create a new issue in my-org/my-repo",
    environment="remote",
    tools=[{
        "type": "mcp_server",
        "name": "github",
        "url": "https://api.githubcopilot.com/mcp",
        "credential": "github-production",
    }],
)

জাভাস্ক্রিপ্ট

const interaction = await client.interactions.create({
    agent: "antigravity-preview-09-2026",
    input: "Create a new issue in my-org/my-repo",
    environment: "remote",
    tools: [{
        type: "mcp_server",
        name: "github",
        url: "https://api.githubcopilot.com/mcp",
        credential: "github-production",
    }],
});

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "agent": "antigravity-preview-09-2026",
    "input": "Create a new issue in my-org/my-repo",
    "environment": "remote",
    "tools": [
        {
            "type": "mcp_server",
            "name": "github",
            "url": "https://api.githubcopilot.com/mcp",
            "credential": "github-production"
        }
    ]
}'

credential এবং headers অ্যালাওলিস্টের মতোই একই অগ্রাধিকার নিয়ম অনুসরণ করে। ক্রেডেনশিয়াল প্রথমে প্রয়োগ করা হয় এবং headers তার উপরে মার্জ হয়, তাই যদি উভয়ই একই কী সেট করে, তবে একটি সুস্পষ্ট হেডারই প্রাধান্য পায়:

{
    "type": "mcp_server",
    "name": "jira",
    "url": "https://jira.atlassian.com/mcp",
    "credential": "jira-oauth",
    "headers": {
        "X-Atlassian-Workspace": "my-workspace-id"
    }
}

কোনো সিক্রেটকে ইনলাইন headers থেকে বের করে ক্রেডেনশিয়ালে স্থানান্তর করতে, সেটিকে POST /credentials দিয়ে স্টোর করুন এবং headers auth এন্ট্রিটিকে credential দিয়ে প্রতিস্থাপন করুন। অন্যান্য হেডারগুলো যেখানে আছে সেখানেই রাখুন।

ক্রেডেনশিয়ালগুলিকে এনভায়রনমেন্ট ভেরিয়েবল হিসেবে ব্যবহার করুন

কিছু ক্লায়েন্ট লাইব্রেরি রিকোয়েস্ট হেডার হিসেবে সিক্রেট গ্রহণ করার পরিবর্তে প্রসেস এনভায়রনমেন্ট থেকে তা পড়ে নেয়। সকেট-মোড এবং লং-পোলিং ক্লায়েন্টগুলো এর সাধারণ উদাহরণ।

environment.env অধীনে একটি ভেরিয়েবলের নামের সাথে একটি environment_variable ক্রেডেনশিয়াল সংযুক্ত করুন:

পাইথন

interaction = client.interactions.create(
    agent="antigravity-preview-09-2026",
    input="Run the sync script and check notifications.",
    environment={
        "type": "remote",
        "env": {
            "NODE_ENV": "production",
            "SLACK_BOT_TOKEN": {"credential": "slack-bot-token"},
        },
    },
)

জাভাস্ক্রিপ্ট

const interaction = await client.interactions.create({
    agent: "antigravity-preview-09-2026",
    input: "Run the sync script and check notifications.",
    environment: {
        type: "remote",
        env: {
            NODE_ENV: "production",
            SLACK_BOT_TOKEN: { credential: "slack-bot-token" },
        },
    },
});

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "agent": "antigravity-preview-09-2026",
    "input": "Run the sync script and check notifications.",
    "environment": {
        "type": "remote",
        "env": {
            "NODE_ENV": "production",
            "SLACK_BOT_TOKEN": { "credential": "slack-bot-token" }
        }
    }
}'

env লিটারেল স্ট্রিং এবং ক্রেডেনশিয়াল রেফারেন্স পাশাপাশি গ্রহণ করে। একটি লিটারেল স্ট্রিংকে কন্টেইনারে একটি সাধারণ প্লেইনটেক্সট ভেরিয়েবল হিসেবে ইনজেক্ট করা হয়।

ক্রেডেনশিয়াল রেফারেন্স তেমন নয়। ভ্যারিয়েবলটি __GEMINI_CRED_<credential-id>__ প্লেসহোল্ডারটি গ্রহণ করে, এবং প্রক্সিটি শুধুমাত্র ক্রেডেনশিয়ালের trusted_domains এ থাকা কোনো ডোমেইনে পাঠানো আউটবাউন্ড রিকোয়েস্টের জন্য আসল সিক্রেটটি ব্যবহার করে। অন্য কোনো ডোমেইনে পাঠানো রিকোয়েস্ট প্রত্যাখ্যান করা হয়, ফলে সিক্রেটটি কখনোই পেরিমিটারের বাইরে যায় না এবং এর পরিবর্তে প্লেসহোল্ডারটি পাঠানো হয় না।

প্রতিটি environment_variable credential-এ trusted_domains সেট করুন। এটিই সেই নিয়ন্ত্রণ যা নির্ধারণ করে যে সিক্রেটটি কোথায় ব্যবহার করা যাবে।

একটি পরিচয়পত্র তৈরি করুন

প্রতিটি ক্রিয়েট রিকোয়েস্টের জন্য একটি type এবং সেই টাইপের জন্য প্রয়োজনীয় ফিল্ডগুলো প্রয়োজন হয়।

সরাসরি REST কল করার সময়, সমস্ত ফিল্ডের নাম snake_case ব্যবহার করে। camelCase-এ ফিল্ড পাঠালে 400 ত্রুটি ফেরত আসে।

বাহক টোকেন

একটি বেয়ারার টোকেন ক্রেডেনশিয়ালের জন্য শুধুমাত্র token প্রয়োজন:

পাইথন

credential = client.credentials.create(
    id="github-production",
    type="bearer_token",
    token="ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
)

জাভাস্ক্রিপ্ট

const credential = await client.credentials.create({
    id: "github-production",
    type: "bearer_token",
    token: "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
});

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/credentials" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "id": "github-production",
    "type": "bearer_token",
    "token": "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'

প্রতিক্রিয়াটি শুধুমাত্র মেটাডেটা ফেরত দেয়, টোকেন কখনোই নয়:

{
  "id": "github-production",
  "type": "bearer_token",
  "status": "active",
  "create_time": "2026-07-15T10:00:00.000000000Z",
  "update_time": "2026-07-15T10:00:00.000000000Z"
}

ডিফল্টরূপে প্রক্সি Authorization: Bearer <token> পাঠায়। অন্য কিছু প্রত্যাশা করে এমন কোনো সার্ভিসকে টার্গেট করতে header_name এবং prefix ওভাররাইড করুন:

পাইথন

credential = client.credentials.create(
    id="my-api-key",
    type="bearer_token",
    token="key_xxxxxxxxxxxx",
    header_name="x-goog-api-key",
    prefix="",
)

জাভাস্ক্রিপ্ট

const credential = await client.credentials.create({
    id: "my-api-key",
    type: "bearer_token",
    token: "key_xxxxxxxxxxxx",
    header_name: "x-goog-api-key",
    prefix: "",
});

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/credentials" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "id": "my-api-key",
    "type": "bearer_token",
    "token": "key_xxxxxxxxxxxx",
    "header_name": "x-goog-api-key",
    "prefix": ""
}'

এই কনফিগারেশনটি x-goog-api-key: key_xxxxxxxxxxxx হেডারটি তৈরি করে।

নিচের সারণিতে দেখানো হয়েছে কিভাবে header_name এবং prefix একত্রিত হয়:

কনফিগারেশন ইনজেক্টেড হেডার
{"token": "ghp_xxx"} Authorization: Bearer ghp_xxx
{"token": "sk_live_xxx"} Authorization: Bearer sk_live_xxx
{"token": "key_xxx", "header_name": "x-goog-api-key", "prefix": ""} x-goog-api-key: key_xxx
{"token": "mytoken", "header_name": "X-API-Token", "prefix": ""} X-API-Token: mytoken

OAuth2

একটি OAuth2 ক্রেডেনশিয়ালের জন্য client_id , client_secret , refresh_token এবং token_url প্রয়োজন হয়। scopes ফিল্ডটি ঐচ্ছিক:

পাইথন

credential = client.credentials.create(
    id="jira-oauth",
    type="oauth2",
    client_id="my-client-id",
    client_secret="my-client-secret",
    token_url="https://auth.atlassian.com/oauth/token",
    refresh_token="rt_xxxxxxxxxxxxxxxxxxxx",
    scopes=["read:jira-work", "write:jira-work"],
)

জাভাস্ক্রিপ্ট

const credential = await client.credentials.create({
    id: "jira-oauth",
    type: "oauth2",
    client_id: "my-client-id",
    client_secret: "my-client-secret",
    token_url: "https://auth.atlassian.com/oauth/token",
    refresh_token: "rt_xxxxxxxxxxxxxxxxxxxx",
    scopes: ["read:jira-work", "write:jira-work"],
});

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/credentials" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "id": "jira-oauth",
    "type": "oauth2",
    "client_id": "my-client-id",
    "client_secret": "my-client-secret",
    "token_url": "https://auth.atlassian.com/oauth/token",
    "refresh_token": "rt_xxxxxxxxxxxxxxxxxxxx",
    "scopes": ["read:jira-work", "write:jira-work"]
}'

একটি OAuth2 ক্রেডেনশিয়াল তৈরি করার সময়, কনফিগারেশনটি সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করার জন্য token_url সাথে একটি লাইভ টোকেন বিনিময় করা হয়। ক্রেডেনশিয়ালটি কেবল তখনই সংরক্ষিত হয়, যখন প্রোভাইডার একটি access_token সম্বলিত সফল টোকেন প্রতিক্রিয়া ফেরত দেয়। JSON এবং form-urlencoded উভয় ধরনের প্রতিক্রিয়াই গ্রহণ করা হয়।

এর মানে হলো, তৈরির সময় আপনার একটি বৈধ ও মেয়াদোত্তীর্ণ নয় এমন রিফ্রেশ টোকেন প্রয়োজন। যদি প্রদানকারী বিনিময়টি প্রত্যাখ্যান করে, তবে আপনাকে ত্রুটি বার্তাটি ফেরত পাঠানো হয়:

{
  "error": {
    "message": "OAuth token validation failed with HTTP 403: {\"error\":\"unauthorized_client\",\"error_description\":\"refresh_token is invalid\"}",
    "code": "invalid_request"
  }
}

একবার সংরক্ষণ করা হলে, অ্যাক্সেস টোকেনের মেয়াদ শেষ হয়ে গেলে প্রক্সি তা রিফ্রেশ করে। যদি প্রোভাইডার রিফ্রেশ টোকেন পরিবর্তন করে এবং রিফ্রেশের সময় একটি নতুন টোকেন ফেরত দেয়, তবে নতুন টোকেনটি স্বয়ংক্রিয়ভাবে সংরক্ষিত টোকেনটিকে প্রতিস্থাপন করে।

পরিবেশগত পরিবর্তনশীল

একটি environment_variable crendential-এর জন্য value এবং injection_location প্রয়োজন:

পাইথন

credential = client.credentials.create(
    id="slack-bot-token",
    type="environment_variable",
    value="xoxb-xxxxxxxxxxxx-xxxxxxxxxxxx",
    trusted_domains=["*.slack.com", "slack.com"],
    injection_location="header",
)

জাভাস্ক্রিপ্ট

const credential = await client.credentials.create({
    id: "slack-bot-token",
    type: "environment_variable",
    value: "xoxb-xxxxxxxxxxxx-xxxxxxxxxxxx",
    trusted_domains: ["*.slack.com", "slack.com"],
    injection_location: "header",
});

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/credentials" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "id": "slack-bot-token",
    "type": "environment_variable",
    "value": "xoxb-xxxxxxxxxxxx-xxxxxxxxxxxx",
    "trusted_domains": ["*.slack.com", "slack.com"],
    "injection_location": "header"
}'

injection_location ফিল্ডটি প্রক্সিকে বলে দেয় যে আউটবাউন্ড রিকোয়েস্টের কোথায় সিক্রেটটি প্রতিস্থাপন করতে হবে। এটি header , query , বা body গ্রহণ করে, যা একটি একক স্ট্রিং হিসাবে অথবা একটি অ্যারে হিসাবেও নেওয়া যায়, যখন কোনো সার্ভিসের একাধিকের প্রয়োজন হয়।

"injection_location": ["header", "query"]

প্রতিস্থাপন শুধুমাত্র আপনার তালিকাভুক্ত স্থানগুলিতেই ঘটে। অন্য কোথাও প্লেসহোল্ডার সহ কোনো অনুরোধ পাঠানো হলে, তা প্রেরণ না করে প্রত্যাখ্যান করা হয়।

ক্রেডেনশিয়ালকে কোনো ভেরিয়েবলের নামের সাথে যুক্ত করতে, “Use credentials as environment variables” দেখুন।

তৈরি করা আইডি

id ফিল্ডটি ঐচ্ছিক। এটি বাদ দিলে সার্ভিসটি একটি UUID তৈরি করবে:

{
  "id": "9e545973-4330-49bb-9a44-930cea9fbe3c",
  "type": "bearer_token",
  "status": "active",
  "create_time": "2026-07-15T10:00:00.000000000Z",
  "update_time": "2026-07-15T10:00:00.000000000Z"
}

যখন আপনি বিভিন্ন ইন্টারঅ্যাকশনে ব্যবহারের জন্য একটি স্থিতিশীল ও পাঠযোগ্য রেফারেন্স চান, তখন আপনার নিজস্ব আইডি সরবরাহ করুন। যেহেতু আইডিটি রিসোর্স পাথে প্রদর্শিত হয়, তাই হাইফেন বা আন্ডারস্কোর সহ ছোট হাতের অক্ষর ও সংখ্যা ব্যবহার করা শ্রেয়।

পরিচয়পত্রের তালিকা

আপনার প্রোজেক্টের ক্রেডেনশিয়ালগুলো তালিকাভুক্ত করুন। রেসপন্স ব্যাচ সাইজ নিয়ন্ত্রণ করতে পেজিনেশন প্যারামিটার ব্যবহার করুন।

পাইথন

response = client.credentials.list(page_size=10)
for credential in response.credentials:
    print(f"Credential ID: {credential.id}, Type: {credential.type}")

জাভাস্ক্রিপ্ট

const response = await client.credentials.list({ page_size: 10 });
for (const credential of response.credentials) {
    console.log(`Credential ID: ${credential.id}, Type: ${credential.type}`);
}

বিশ্রাম

curl -X GET "https://generativelanguage.googleapis.com/v1beta/credentials?page_size=10" \
-H "x-goog-api-key: $GEMINI_API_KEY"

প্রতিক্রিয়াটিতে শুধুমাত্র মেটাডেটা রয়েছে:

{
  "credentials": [
    {
      "id": "github-production",
      "type": "bearer_token",
      "status": "active",
      "create_time": "2026-07-15T10:00:00.000000000Z",
      "update_time": "2026-07-15T10:00:00.000000000Z"
    },
    {
      "id": "jira-oauth",
      "type": "oauth2",
      "status": "active",
      "create_time": "2026-07-15T10:05:00.000000000Z",
      "update_time": "2026-07-15T10:05:00.000000000Z"
    }
  ],
  "next_page_token": "Cj...5aE="
}

পরবর্তী পৃষ্ঠা আনার জন্য next_page_token page_token হিসেবে ফেরত পাঠান। আর কোনো ফলাফল না থাকলে এই ফিল্ডটি বাদ দেওয়া হয়।

প্যারামিটার প্রকার বর্ণনা
page_size পূর্ণসংখ্যা প্রতি পৃষ্ঠায় সর্বোচ্চ সংখ্যক পরিচয়পত্র।
page_token স্ট্রিং পূর্ববর্তী প্রতিক্রিয়ার next_page_token থেকে প্রাপ্ত টোকেন।

একটি শংসাপত্র নিন

কোনো নির্দিষ্ট ক্রেডেনশিয়ালের আইডি ব্যবহার করে তার মেটাডেটা পুনরুদ্ধার করুন।

পাইথন

credential = client.credentials.get(id="github-production")
print(f"Credential ID: {credential.id}, Status: {credential.status}")

জাভাস্ক্রিপ্ট

const credential = await client.credentials.get("github-production");
console.log(`Credential ID: ${credential.id}, Status: ${credential.status}`);

বিশ্রাম

curl -X GET "https://generativelanguage.googleapis.com/v1beta/credentials/github-production" \
-H "x-goog-api-key: $GEMINI_API_KEY"

প্রতিক্রিয়াটি দেখতে নিম্নলিখিতের অনুরূপ:

{
  "id": "github-production",
  "type": "bearer_token",
  "status": "active",
  "create_time": "2026-07-15T10:00:00.000000000Z",
  "update_time": "2026-08-01T14:30:00.000000000Z"
}

এমন কোনো ক্রেডেনশিয়াল অনুরোধ করলে যা বিদ্যমান নেই, তার জন্য 404 ত্রুটি দেখা দেয়।

{
  "error": {
    "message": "Result not found.; GetCredential call failed",
    "code": "not_found"
  }
}

একটি শংসাপত্র ঘোরান

কোনো অ্যালাওলিস্ট রুল, টুল ডেফিনিশন, বা এনভায়রনমেন্ট ভেরিয়েবল যা এটিকে রেফারেন্স করে, সেগুলোকে স্পর্শ না করে একটি সিক্রেট প্রতিস্থাপন করুন। এই রোটেশন পরবর্তী প্রক্সি রেজোলিউশনে কার্যকর হবে।

অনুরোধে অবশ্যই type এবং আপনি যে ফিল্ডগুলো পরিবর্তন করতে চান তা অন্তর্ভুক্ত থাকতে হবে। আপনি যে ফিল্ডগুলো বাদ দেবেন, সেগুলোর বর্তমান মানই থাকবে।

একটি বেয়ারার টোকেন ঘোরান:

পাইথন

credential = client.credentials.update(
    id="github-production",
    type="bearer_token",
    token="ghp_new_xxxxxxxxxxxxxxxxxxxx",
)

জাভাস্ক্রিপ্ট

const credential = await client.credentials.update("github-production", {
    type: "bearer_token",
    token: "ghp_new_xxxxxxxxxxxxxxxxxxxx",
});

বিশ্রাম

curl -X PATCH "https://generativelanguage.googleapis.com/v1beta/credentials/github-production" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "type": "bearer_token",
    "token": "ghp_new_xxxxxxxxxxxxxxxxxxxx"
}'

একটি OAuth2 রিফ্রেশ টোকেন ঘোরান:

পাইথন

credential = client.credentials.update(
    id="jira-oauth",
    type="oauth2",
    refresh_token="rt_new_xxxxxxxxxxxxxxxxxxxx",
)

জাভাস্ক্রিপ্ট

const credential = await client.credentials.update("jira-oauth", {
    type: "oauth2",
    refresh_token: "rt_new_xxxxxxxxxxxxxxxxxxxx",
});

বিশ্রাম

curl -X PATCH "https://generativelanguage.googleapis.com/v1beta/credentials/jira-oauth" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "type": "oauth2",
    "refresh_token": "rt_new_xxxxxxxxxxxxxxxxxxxx"
}'

প্রতিক্রিয়াটি নতুন update_time প্রতিফলিত করে:

{
  "id": "jira-oauth",
  "type": "oauth2",
  "status": "active",
  "create_time": "2026-07-15T10:05:00.000000000Z",
  "update_time": "2026-08-01T14:30:00.000000000Z"
}

ক্রেডেনশিয়ালের type তৈরির সময় স্থির হয়ে যায়। এটি পরিবর্তন করতে, ক্রেডেনশিয়ালটি মুছে ফেলুন এবং একটি নতুন তৈরি করুন।

একটি পরিচয়পত্র মুছে ফেলুন

যখন কোনো ক্রেডেনশিয়াল এবং এর সংরক্ষিত গোপনীয় তথ্য অপ্রয়োজনীয় হয়ে পড়ে, তখন তা মুছে ফেলুন।

পাইথন

client.credentials.delete(id="github-production")

জাভাস্ক্রিপ্ট

await client.credentials.delete("github-production");

বিশ্রাম

curl -X DELETE "https://generativelanguage.googleapis.com/v1beta/credentials/github-production" \
-H "x-goog-api-key: $GEMINI_API_KEY"

সফলভাবে ডিলিট করলে একটি খালি অবজেক্ট ফেরত আসে:

{}

যে কোনো অ্যালাওলিস্ট রুল, টুল, বা এনভায়রনমেন্ট ভেরিয়েবল যা এখনও আইডিটিকে উল্লেখ করছে, তা রিজলভ হতে ব্যর্থ হবে, তাই প্রথমে সেগুলো আপডেট করুন।

ক্ষেত্র রেফারেন্স

প্রতিটি শংসাপত্রের সাধারণ ক্ষেত্রসমূহ:

মাঠ প্রকার প্রয়োজনীয় বর্ণনা
id স্ট্রিং না অনন্য শনাক্তকারী। এটি বাদ দিলে UUID হিসাবে তৈরি হয়।
type স্ট্রিং হ্যাঁ bearer_token , oauth2 , environment_variable এর মধ্যে যেকোনো একটি।
status স্ট্রিং শুধুমাত্র পঠনযোগ্য শংসাপত্রটির বর্তমান অবস্থা।
create_time স্ট্রিং শুধুমাত্র পঠনযোগ্য RFC 3339 তৈরির সময়চিহ্ন।
update_time স্ট্রিং শুধুমাত্র পঠনযোগ্য RFC 3339 সর্বশেষ আপডেটের টাইমস্ট্যাম্প।

bearer_token এর জন্য ক্ষেত্রসমূহ :

মাঠ প্রকার প্রয়োজনীয় বর্ণনা
token স্ট্রিং হ্যাঁ শুধুমাত্র লেখার অনুমতি আছে। টোকেনের মান।
header_name স্ট্রিং না ইনজেক্ট করার জন্য হেডার। ডিফল্ট হিসেবে Authorization থাকে।
prefix স্ট্রিং না মানের উপসর্গ। ডিফল্ট হলো Bearer । কোনো উপসর্গ না থাকলে এটিকে "" এ সেট করুন।

oauth2 এর জন্য ক্ষেত্রসমূহ :

মাঠ প্রকার প্রয়োজনীয় বর্ণনা
client_id স্ট্রিং হ্যাঁ OAuth2 ক্লায়েন্ট আইডি।
client_secret স্ট্রিং হ্যাঁ শুধুমাত্র লেখার অনুমতি আছে। OAuth2 ক্লায়েন্ট সিক্রেট।
refresh_token স্ট্রিং হ্যাঁ শুধুমাত্র লেখার অনুমতি আছে। অ্যাক্সেস টোকেন পেতে রিফ্রেশ টোকেন ব্যবহার করা হয়।
token_url স্ট্রিং হ্যাঁ প্রোভাইডার টোকেন এন্ডপয়েন্ট।
scopes অ্যারে না অনুরোধ করার জন্য OAuth স্কোপসমূহ।

environment_variable জন্য ক্ষেত্রসমূহ :

মাঠ প্রকার প্রয়োজনীয় বর্ণনা
value স্ট্রিং হ্যাঁ শুধুমাত্র লেখার জন্য। গোপন মূল্য।
injection_location স্ট্রিং বা অ্যারে হ্যাঁ গোপনীয় তথ্যটি কোথায় প্রতিস্থাপন করতে হবে। header , query , body এক বা একাধিকের ক্ষেত্রে।
trusted_domains অ্যারে না প্রতিস্থাপনের জন্য অনুমোদিত ডোমেইন প্যাটার্ন।

ত্রুটি

ত্রুটিগুলো একটি message এবং একটি code সহ একটি JSON অবজেক্ট ফেরত দেয়:

{
  "error": {
    "message": "Credential 'github-production' already exists.; CreateCredential call failed",
    "code": "aborted"
  }
}
HTTP অবস্থা code কারণ
৪০০ invalid_request প্রয়োজনীয় ফিল্ড অনুপস্থিত, ফিল্ডটি অজানা, type অসমর্থিত, অথবা OAuth2 যাচাইকরণ ব্যর্থ হয়েছে।
৪০৪ not_found ঐ আইডিতে কোনো পরিচয়পত্র নেই।
৪০৯ aborted ওই আইডি সহ একটি ক্রেডেনশিয়াল ইতিমধ্যেই বিদ্যমান আছে।

অজানা ফিল্ডগুলো উপেক্ষা না করে বাতিল করা হয় এবং ত্রুটি বার্তায় ফিল্ডটির নাম উল্লেখ করা থাকে:

{
  "error": {
    "message": "Unknown parameter 'headerName'. Did you mean 'header_name'?",
    "code": "invalid_request"
  }
}

এরপর কী?