Skip to content

Managing Resources

Beyond agents themselves, CX Agent Studio has a rich set of supporting resources — tools, guardrails, session variables, deployments, versioned snapshots, and changelogs. This page covers each one: what it does, how to instantiate the client class, and the key methods you'll use day to day.


Tools

Tools are the functions your agents call during conversations. SCRAPI's Tools class wraps both the platform's tool management API and a few convenience methods for working with tool metadata.

Constructor

from cxas_scrapi.core.tools import Tools

tools = Tools(
    app_name="projects/my-project/locations/us-central1/apps/my-app",
    creds=None,  # Optional — uses ADC by default
)

The app_name is the full resource name of your app. The class derives project_id and location from this string automatically.

Key methods

Method Description
list_tools() Returns all tools in the app
get_tool(tool_id) Gets a specific tool by its ID
get_tools_map(reverse=False) Returns a dict mapping tool names to display names (or reversed)
create_tool(tool_id, display_name, ...) Creates a new tool
update_tool(tool_name, **kwargs) Updates tool fields
delete_tool(tool_name) Deletes a tool
execute_tool(tool_display_name, args) Invokes a tool directly for testing

Example: listing tools and running one directly

from cxas_scrapi.core.tools import Tools

tools = Tools(app_name="projects/my-project/locations/us/apps/my-app")

# List all tools
for tool in tools.list_tools():
    print(tool.display_name, tool.name)

# Run a tool directly (useful for debugging)
result = tools.execute_tool(
    tool_display_name="lookup_order",
    args={"order_id": "ORD-12345"},
)
print(result)

Using get_tools_map

When you need to go from a display name (what the LLM sees) to a resource name (what the API needs), get_tools_map(reverse=True) gives you display_name -> resource_name.


Guardrails

Guardrails filter or transform inputs and outputs to enforce content policies, safety rules, or business logic.

Constructor

from cxas_scrapi.core.guardrails import Guardrails

guardrails = Guardrails(
    app_name="projects/my-project/locations/us-central1/apps/my-app",
)

Key methods

Method Description
list_guardrails() Returns all guardrails in the app
get_guardrail(guardrail_id) Gets a specific guardrail
create_guardrail(guardrail_id, display_name, payload) Creates a new guardrail
update_guardrail(guardrail_id, **kwargs) Updates guardrail fields
delete_guardrail(guardrail_id) Deletes a guardrail

Example: creating a content safety guardrail

from cxas_scrapi.core.guardrails import Guardrails

guardrails = Guardrails(app_name="projects/.../apps/my-app")

guardrail = guardrails.create_guardrail(
    guardrail_id="content-safety",
    display_name="Content Safety",
    payload={
        "messageTemplates": [
            {"responseMessage": "I can't help with that request."}
        ],
    },
)

Variables

Session variables let you inject dynamic data into conversations — things like the authenticated user's account ID, their region, or feature flags. The Variables class manages these at the app level.

Constructor

from cxas_scrapi.core.variables import Variables

variables = Variables(
    app_name="projects/my-project/locations/us-central1/apps/my-app",
)

Key methods

Method Description
list_variables() Lists all session variables
get_variable(variable_name) Gets a specific variable by name
create_variable(variable_name, variable_type, variable_value) Creates a variable
update_variable(variable_name, variable_type, variable_value) Updates a variable
delete_variable(variable_name) Deletes a variable

Example: declaring a session variable

from cxas_scrapi.core.variables import Variables

variables = Variables(app_name="projects/.../apps/my-app")

variables.create_variable(
    variable_name="account_id",
    variable_type="STRING",
    variable_value="",
)

Variables declared here can be injected at session start via the Sessions API's session_parameters field, and read inside callbacks via callback_context.session.session_parameters.


Deployments

A deployment makes a specific version of your app available to handle live traffic. You can have multiple deployments — for example, a production deployment and a staging one.

Constructor

from cxas_scrapi.core.deployments import Deployments

deployments = Deployments(
    app_name="projects/my-project/locations/us-central1/apps/my-app",
)

Key methods

Method Description
list_deployments() Lists all deployments
get_deployment(deployment_id) Gets a specific deployment
create_deployment(deployment_id, display_name, app_version) Creates a new deployment
update_deployment(deployment_id, **kwargs) Updates deployment settings
delete_deployment(deployment_id) Deletes a deployment

Example: creating a deployment

from cxas_scrapi.core.deployments import Deployments

deployments = Deployments(app_name="projects/.../apps/my-app")

deployment = deployments.create_deployment(
    deployment_id="production",
    display_name="Production",
    app_version="draft",  # or a specific version ID
)

print(deployment.name)
# projects/.../apps/my-app/deployments/production

The deployed_app_id in gecx-config.json should point to this deployment's resource name when using the skills system.


Versions

Versions are immutable snapshots of your app at a point in time. Creating a version before a major change gives you a safe rollback point.

Constructor

from cxas_scrapi.core.versions import Versions

versions = Versions(
    app_name="projects/my-project/locations/us-central1/apps/my-app",
)

Key methods

Method Description
list_versions() Lists all versions
get_version(version_id) Gets a specific version
get_versions_map(reverse=False) Returns a dict mapping version names to display names
revert_version(version_id) Restores the app to a previous version
delete_version(version_id) Deletes a version

Example: listing and reverting versions

from cxas_scrapi.core.versions import Versions

versions = Versions(app_name="projects/.../apps/my-app")

# List available versions
for version in versions.list_versions():
    print(f"{version.display_name}: {version.name}")

# Revert to a previous version
versions.revert_version("v1-0-0")

Versions are immutable

Once created, a version cannot be edited. You can restore it (which overwrites the draft) or delete it, but you cannot change its contents.


Changelogs

Changelogs give you a structured audit trail of changes made to your app. Every push, version creation, and agent update appears in the changelog. This is useful for debugging regressions — you can see exactly what changed and when.

Constructor

from cxas_scrapi.core.changelogs import Changelogs

changelogs = Changelogs(
    app_name="projects/my-project/locations/us-central1/apps/my-app",
)

Key methods

Method Description
list_changelogs() Returns recent changelog entries
get_changelog(changelog_id) Gets a specific entry

Example: reviewing recent changes

from cxas_scrapi.core.changelogs import Changelogs

changelogs = Changelogs(app_name="projects/.../apps/my-app")

for entry in changelogs.list_changelogs():
    print(f"{entry.create_time}: {entry.display_name}{entry.description}")

The cxas branch command uses changelogs internally to perform drift detection before a push — see Branching for details.


Working with multiple resource types together

A common pattern is to chain these classes when preparing for a release:

from cxas_scrapi.core.versions import Versions
from cxas_scrapi.core.deployments import Deployments
from cxas_scrapi.core.changelogs import Changelogs

app_name = "projects/my-project/locations/us/apps/my-app"

# 1. Check what changed
changelogs = Changelogs(app_name=app_name)
recent = changelogs.list_changelogs()
if recent:
    print(f"Latest change: {recent[0].display_name}")

# 2. List available versions
versions = Versions(app_name=app_name)
for v in versions.list_versions():
    print(f"Version: {v.display_name} ({v.name})")

# 3. Update the deployment to point to a specific version
deployments = Deployments(app_name=app_name)
deployments.update_deployment(
    deployment_id="production",
    app_version="v2-0-0",
)

print("Release complete.")