AiReasoningEngine class
ReasoningEngine provides a customizable runtime for models to determine which actions to take and in which order.
To get more information about ReasoningEngine, see:
Example Usage
Vertex Ai Reasoning Engine Source Based Deployment
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
import * as std from "@pulumi/std";
const reasoningEngine = new gcp.vertex.AiReasoningEngine("reasoning_engine", {
displayName: "reasoning-engine",
description: "A basic reasoning engine",
region: "us-central1",
spec: {
sourceCodeSpec: {
inlineSource: {
sourceArchive: std.filebase64({
input: "./test-fixtures/source.tar.gz",
}).then(invoke => invoke.result),
},
pythonSpec: {
entrypointModule: "simple_agent",
entrypointObject: "fixed_name_generator",
version: "3.14",
},
},
},
});
import pulumi
import pulumi_gcp as gcp
import pulumi_std as std
reasoning_engine = gcp.vertex.AiReasoningEngine("reasoning_engine",
display_name="reasoning-engine",
description="A basic reasoning engine",
region="us-central1",
spec={
"source_code_spec": {
"inline_source": {
"source_archive": std.filebase64(input="./test-fixtures/source.tar.gz").result,
},
"python_spec": {
"entrypoint_module": "simple_agent",
"entrypoint_object": "fixed_name_generator",
"version": "3.14",
},
},
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
using Std = Pulumi.Std;
return await Deployment.RunAsync(() =>
{
var reasoningEngine = new Gcp.Vertex.AiReasoningEngine("reasoning_engine", new()
{
DisplayName = "reasoning-engine",
Description = "A basic reasoning engine",
Region = "us-central1",
Spec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecArgs
{
SourceCodeSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecArgs
{
InlineSource = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs
{
SourceArchive = Std.Filebase64.Invoke(new()
{
Input = "./test-fixtures/source.tar.gz",
}).Apply(invoke => invoke.Result),
},
PythonSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs
{
EntrypointModule = "simple_agent",
EntrypointObject = "fixed_name_generator",
Version = "3.14",
},
},
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/vertex"
"github.com/pulumi/pulumi-std/sdk/go/std"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
invokeFilebase64, err := std.Filebase64(ctx, &std.Filebase64Args{
Input: "./test-fixtures/source.tar.gz",
}, nil)
if err != nil {
return err
}
_, err = vertex.NewAiReasoningEngine(ctx, "reasoning_engine", &vertex.AiReasoningEngineArgs{
DisplayName: pulumi.String("reasoning-engine"),
Description: pulumi.String("A basic reasoning engine"),
Region: pulumi.String("us-central1"),
Spec: &vertex.AiReasoningEngineSpecArgs{
SourceCodeSpec: &vertex.AiReasoningEngineSpecSourceCodeSpecArgs{
InlineSource: &vertex.AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs{
SourceArchive: pulumi.String(invokeFilebase64.Result),
},
PythonSpec: &vertex.AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs{
EntrypointModule: pulumi.String("simple_agent"),
EntrypointObject: pulumi.String("fixed_name_generator"),
Version: pulumi.String("3.14"),
},
},
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
std = {
source = "pulumi/std"
}
}
}
resource "gcp_vertex_aireasoningengine" "reasoning_engine" {
display_name = "reasoning-engine"
description = "A basic reasoning engine"
region = "us-central1"
spec = {
source_code_spec = {
inline_source = {
source_archive = filebase64("./test-fixtures/source.tar.gz")
}
python_spec = {
entrypoint_module = "simple_agent"
entrypoint_object = "fixed_name_generator"
version = "3.14"
}
}
}
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.vertex.AiReasoningEngine;
import com.pulumi.gcp.vertex.AiReasoningEngineArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs;
import com.pulumi.std.StdFunctions;
import com.pulumi.std.inputs.Filebase64Args;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var reasoningEngine = new AiReasoningEngine("reasoningEngine", AiReasoningEngineArgs.builder()
.displayName("reasoning-engine")
.description("A basic reasoning engine")
.region("us-central1")
.spec(AiReasoningEngineSpecArgs.builder()
.sourceCodeSpec(AiReasoningEngineSpecSourceCodeSpecArgs.builder()
.inlineSource(AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs.builder()
.sourceArchive(StdFunctions.filebase64(Filebase64Args.builder()
.input("./test-fixtures/source.tar.gz")
.build()).result())
.build())
.pythonSpec(AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs.builder()
.entrypointModule("simple_agent")
.entrypointObject("fixed_name_generator")
.version("3.14")
.build())
.build())
.build())
.build());
}
}
resources:
reasoningEngine:
type: gcp:vertex:AiReasoningEngine
name: reasoning_engine
properties:
displayName: reasoning-engine
description: A basic reasoning engine
region: us-central1
spec:
sourceCodeSpec:
inlineSource:
sourceArchive:
fn::invoke:
function: std:filebase64
arguments:
input: ./test-fixtures/source.tar.gz
return: result
pythonSpec:
entrypointModule: simple_agent
entrypointObject: fixed_name_generator
version: '3.14'
Vertex Ai Reasoning Engine Developer Connect Source
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const project = gcp.organizations.getProject({});
const reasoningEngine = new gcp.vertex.AiReasoningEngine("reasoning_engine", {
displayName: "reasoning-engine",
description: "A basic reasoning engine",
region: "us-central1",
spec: {
sourceCodeSpec: {
developerConnectSource: {
config: {
gitRepositoryLink: project.then(project => `projects/${project.projectId}/locations/us-central1/connections/tpg-test-bot-github/gitRepositoryLinks/tpg-test-vertex-reasoning`),
dir: "source",
revision: "main",
},
},
pythonSpec: {
version: "3.14",
entrypointModule: "simple_agent",
entrypointObject: "fixed_name_generator",
},
},
},
});
import pulumi
import pulumi_gcp as gcp
project = gcp.organizations.get_project()
reasoning_engine = gcp.vertex.AiReasoningEngine("reasoning_engine",
display_name="reasoning-engine",
description="A basic reasoning engine",
region="us-central1",
spec={
"source_code_spec": {
"developer_connect_source": {
"config": {
"git_repository_link": f"projects/{project.project_id}/locations/us-central1/connections/tpg-test-bot-github/gitRepositoryLinks/tpg-test-vertex-reasoning",
"dir": "source",
"revision": "main",
},
},
"python_spec": {
"version": "3.14",
"entrypoint_module": "simple_agent",
"entrypoint_object": "fixed_name_generator",
},
},
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var project = Gcp.Organizations.GetProject.Invoke();
var reasoningEngine = new Gcp.Vertex.AiReasoningEngine("reasoning_engine", new()
{
DisplayName = "reasoning-engine",
Description = "A basic reasoning engine",
Region = "us-central1",
Spec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecArgs
{
SourceCodeSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecArgs
{
DeveloperConnectSource = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceArgs
{
Config = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceConfigArgs
{
GitRepositoryLink = $"projects/{project.Apply(getProjectResult => getProjectResult.ProjectId)}/locations/us-central1/connections/tpg-test-bot-github/gitRepositoryLinks/tpg-test-vertex-reasoning",
Dir = "source",
Revision = "main",
},
},
PythonSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs
{
Version = "3.14",
EntrypointModule = "simple_agent",
EntrypointObject = "fixed_name_generator",
},
},
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/organizations"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/vertex"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
project, err := organizations.LookupProject(ctx, &organizations.LookupProjectArgs{}, nil)
if err != nil {
return err
}
_, err = vertex.NewAiReasoningEngine(ctx, "reasoning_engine", &vertex.AiReasoningEngineArgs{
DisplayName: pulumi.String("reasoning-engine"),
Description: pulumi.String("A basic reasoning engine"),
Region: pulumi.String("us-central1"),
Spec: &vertex.AiReasoningEngineSpecArgs{
SourceCodeSpec: &vertex.AiReasoningEngineSpecSourceCodeSpecArgs{
DeveloperConnectSource: &vertex.AiReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceArgs{
Config: &vertex.AiReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceConfigArgs{
GitRepositoryLink: pulumi.Sprintf("projects/%v/locations/us-central1/connections/tpg-test-bot-github/gitRepositoryLinks/tpg-test-vertex-reasoning", project.ProjectId),
Dir: pulumi.String("source"),
Revision: pulumi.String("main"),
},
},
PythonSpec: &vertex.AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs{
Version: pulumi.String("3.14"),
EntrypointModule: pulumi.String("simple_agent"),
EntrypointObject: pulumi.String("fixed_name_generator"),
},
},
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
data "gcp_organizations_getproject" "project" {
}
resource "gcp_vertex_aireasoningengine" "reasoning_engine" {
display_name = "reasoning-engine"
description = "A basic reasoning engine"
region = "us-central1"
spec = {
source_code_spec = {
developer_connect_source = {
config = {
git_repository_link ="projects/${data.gcp_organizations_getproject.project.project_id}/locations/us-central1/connections/tpg-test-bot-github/gitRepositoryLinks/tpg-test-vertex-reasoning"
dir = "source"
revision = "main"
}
}
python_spec = {
version = "3.14"
entrypoint_module = "simple_agent"
entrypoint_object = "fixed_name_generator"
}
}
}
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.organizations.OrganizationsFunctions;
import com.pulumi.gcp.organizations.inputs.GetProjectArgs;
import com.pulumi.gcp.vertex.AiReasoningEngine;
import com.pulumi.gcp.vertex.AiReasoningEngineArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
final var project = OrganizationsFunctions.getProject(GetProjectArgs.builder()
.build());
var reasoningEngine = new AiReasoningEngine("reasoningEngine", AiReasoningEngineArgs.builder()
.displayName("reasoning-engine")
.description("A basic reasoning engine")
.region("us-central1")
.spec(AiReasoningEngineSpecArgs.builder()
.sourceCodeSpec(AiReasoningEngineSpecSourceCodeSpecArgs.builder()
.developerConnectSource(AiReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceArgs.builder()
.config(AiReasoningEngineSpecSourceCodeSpecDeveloperConnectSourceConfigArgs.builder()
.gitRepositoryLink(String.format("projects/%s/locations/us-central1/connections/tpg-test-bot-github/gitRepositoryLinks/tpg-test-vertex-reasoning", project.projectId()))
.dir("source")
.revision("main")
.build())
.build())
.pythonSpec(AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs.builder()
.version("3.14")
.entrypointModule("simple_agent")
.entrypointObject("fixed_name_generator")
.build())
.build())
.build())
.build());
}
}
resources:
reasoningEngine:
type: gcp:vertex:AiReasoningEngine
name: reasoning_engine
properties:
displayName: reasoning-engine
description: A basic reasoning engine
region: us-central1
spec:
sourceCodeSpec:
developerConnectSource:
config:
gitRepositoryLink: projects/${project.projectId}/locations/us-central1/connections/tpg-test-bot-github/gitRepositoryLinks/tpg-test-vertex-reasoning
dir: source
revision: main
pythonSpec:
version: '3.14'
entrypointModule: simple_agent
entrypointObject: fixed_name_generator
variables:
project:
fn::invoke:
function: gcp:organizations:getProject
arguments: {}
Vertex Ai Reasoning Engine Image Spec
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
import * as std from "@pulumi/std";
const reasoningEngine = new gcp.vertex.AiReasoningEngine("reasoning_engine", {
displayName: "reasoning-engine",
description: "Deployed with BYOC Dockerfile through Terraform",
region: "us-central1",
spec: {
sourceCodeSpec: {
inlineSource: {
sourceArchive: std.filebase64({
input: "./test-fixtures/agent_src.tar.gz",
}).then(invoke => invoke.result),
},
imageSpec: {
buildArgs: {},
},
},
},
});
import pulumi
import pulumi_gcp as gcp
import pulumi_std as std
reasoning_engine = gcp.vertex.AiReasoningEngine("reasoning_engine",
display_name="reasoning-engine",
description="Deployed with BYOC Dockerfile through Terraform",
region="us-central1",
spec={
"source_code_spec": {
"inline_source": {
"source_archive": std.filebase64(input="./test-fixtures/agent_src.tar.gz").result,
},
"image_spec": {
"build_args": {},
},
},
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
using Std = Pulumi.Std;
return await Deployment.RunAsync(() =>
{
var reasoningEngine = new Gcp.Vertex.AiReasoningEngine("reasoning_engine", new()
{
DisplayName = "reasoning-engine",
Description = "Deployed with BYOC Dockerfile through Terraform",
Region = "us-central1",
Spec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecArgs
{
SourceCodeSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecArgs
{
InlineSource = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs
{
SourceArchive = Std.Filebase64.Invoke(new()
{
Input = "./test-fixtures/agent_src.tar.gz",
}).Apply(invoke => invoke.Result),
},
ImageSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecImageSpecArgs
{
BuildArgs = null,
},
},
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/vertex"
"github.com/pulumi/pulumi-std/sdk/go/std"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
invokeFilebase64, err := std.Filebase64(ctx, &std.Filebase64Args{
Input: "./test-fixtures/agent_src.tar.gz",
}, nil)
if err != nil {
return err
}
_, err = vertex.NewAiReasoningEngine(ctx, "reasoning_engine", &vertex.AiReasoningEngineArgs{
DisplayName: pulumi.String("reasoning-engine"),
Description: pulumi.String("Deployed with BYOC Dockerfile through Terraform"),
Region: pulumi.String("us-central1"),
Spec: &vertex.AiReasoningEngineSpecArgs{
SourceCodeSpec: &vertex.AiReasoningEngineSpecSourceCodeSpecArgs{
InlineSource: &vertex.AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs{
SourceArchive: pulumi.String(invokeFilebase64.Result),
},
ImageSpec: &vertex.AiReasoningEngineSpecSourceCodeSpecImageSpecArgs{
BuildArgs: pulumi.StringMap{},
},
},
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
std = {
source = "pulumi/std"
}
}
}
resource "gcp_vertex_aireasoningengine" "reasoning_engine" {
display_name = "reasoning-engine"
description = "Deployed with BYOC Dockerfile through Terraform"
region = "us-central1"
spec = {
source_code_spec = {
inline_source = {
source_archive = filebase64("./test-fixtures/agent_src.tar.gz")
}
image_spec = {
build_args = {}
}
}
}
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.vertex.AiReasoningEngine;
import com.pulumi.gcp.vertex.AiReasoningEngineArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecImageSpecArgs;
import com.pulumi.std.StdFunctions;
import com.pulumi.std.inputs.Filebase64Args;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var reasoningEngine = new AiReasoningEngine("reasoningEngine", AiReasoningEngineArgs.builder()
.displayName("reasoning-engine")
.description("Deployed with BYOC Dockerfile through Terraform")
.region("us-central1")
.spec(AiReasoningEngineSpecArgs.builder()
.sourceCodeSpec(AiReasoningEngineSpecSourceCodeSpecArgs.builder()
.inlineSource(AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs.builder()
.sourceArchive(StdFunctions.filebase64(Filebase64Args.builder()
.input("./test-fixtures/agent_src.tar.gz")
.build()).result())
.build())
.imageSpec(AiReasoningEngineSpecSourceCodeSpecImageSpecArgs.builder()
.buildArgs(Map.ofEntries(
))
.build())
.build())
.build())
.build());
}
}
resources:
reasoningEngine:
type: gcp:vertex:AiReasoningEngine
name: reasoning_engine
properties:
displayName: reasoning-engine
description: Deployed with BYOC Dockerfile through Terraform
region: us-central1
spec:
sourceCodeSpec:
inlineSource:
sourceArchive:
fn::invoke:
function: std:filebase64
arguments:
input: ./test-fixtures/agent_src.tar.gz
return: result
imageSpec:
buildArgs: {}
Vertex Ai Reasoning Engine Byoc
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
import * as std from "@pulumi/std";
const project = gcp.organizations.getProject({});
const vertexArReader = new gcp.projects.IAMMember("vertex_ar_reader", {
project: project.then(project => project.projectId),
role: "roles/artifactregistry.reader",
member: project.then(project => `serviceAccount:service-${project.number}@gcp-sa-aiplatform-re.iam.gserviceaccount.com`),
});
// Provision and retrieve the tenant service agent through another agent
const tenantMdsAiReasoningEngine = new gcp.vertex.AiReasoningEngine("tenant_mds", {
displayName: "reasoning-engine-mds",
region: "us-central1",
spec: {
sourceCodeSpec: {
inlineSource: {
sourceArchive: std.filebase64({
input: "./test-fixtures/mds_agent_src.tar.gz",
}).then(invoke => invoke.result),
},
pythonSpec: {
entrypointModule: "metadata_agent",
entrypointObject: "root_agent",
},
},
},
});
const tenantMds = gcp.vertex.getAiReasoningEngineQueryOutput({
region: "us-central1",
reasoningEngineId: tenantMdsAiReasoningEngine.name,
});
const tenantArReader = new gcp.projects.IAMMember("tenant_ar_reader", {
project: project.then(project => project.projectId),
role: "roles/artifactregistry.reader",
member: std.jsondecodeOutput({
input: tenantMds.output,
}).apply(invoke => `serviceAccount:${invoke.result?.output}`),
});
const reasoningEngine = new gcp.vertex.AiReasoningEngine("reasoning_engine", {
displayName: "reasoning-engine",
description: "Deployed with BYOC through Terraform",
region: "us-central1",
spec: {
containerSpec: {
imageUri: project.then(project => `us-central1-docker.pkg.dev/${project.projectId}/vertex-byoc/byoc-agent:latest`),
port: 8080,
},
},
}, {
dependsOn: [
vertexArReader,
tenantArReader,
],
});
import pulumi
import pulumi_gcp as gcp
import pulumi_std as std
project = gcp.organizations.get_project()
vertex_ar_reader = gcp.projects.IAMMember("vertex_ar_reader",
project=project.project_id,
role="roles/artifactregistry.reader",
member=f"serviceAccount:service-{project.number}@gcp-sa-aiplatform-re.iam.gserviceaccount.com")
# Provision and retrieve the tenant service agent through another agent
tenant_mds_ai_reasoning_engine = gcp.vertex.AiReasoningEngine("tenant_mds",
display_name="reasoning-engine-mds",
region="us-central1",
spec={
"source_code_spec": {
"inline_source": {
"source_archive": std.filebase64(input="./test-fixtures/mds_agent_src.tar.gz").result,
},
"python_spec": {
"entrypoint_module": "metadata_agent",
"entrypoint_object": "root_agent",
},
},
})
tenant_mds = gcp.vertex.get_ai_reasoning_engine_query_output(region="us-central1",
reasoning_engine_id=tenant_mds_ai_reasoning_engine.name)
tenant_ar_reader = gcp.projects.IAMMember("tenant_ar_reader",
project=project.project_id,
role="roles/artifactregistry.reader",
member=std.jsondecode_output(input=tenant_mds.output).apply(lambda invoke: f"serviceAccount:{invoke.result['output']}"))
reasoning_engine = gcp.vertex.AiReasoningEngine("reasoning_engine",
display_name="reasoning-engine",
description="Deployed with BYOC through Terraform",
region="us-central1",
spec={
"container_spec": {
"image_uri": f"us-central1-docker.pkg.dev/{project.project_id}/vertex-byoc/byoc-agent:latest",
"port": 8080,
},
},
opts = pulumi.ResourceOptions(depends_on=[
vertex_ar_reader,
tenant_ar_reader,
]))
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
using Std = Pulumi.Std;
return await Deployment.RunAsync(() =>
{
var project = Gcp.Organizations.GetProject.Invoke();
var vertexArReader = new Gcp.Projects.IAMMember("vertex_ar_reader", new()
{
Project = project.Apply(getProjectResult => getProjectResult.ProjectId),
Role = "roles/artifactregistry.reader",
Member = $"serviceAccount:service-{project.Apply(getProjectResult => getProjectResult.Number)}@gcp-sa-aiplatform-re.iam.gserviceaccount.com",
});
// Provision and retrieve the tenant service agent through another agent
var tenantMdsAiReasoningEngine = new Gcp.Vertex.AiReasoningEngine("tenant_mds", new()
{
DisplayName = "reasoning-engine-mds",
Region = "us-central1",
Spec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecArgs
{
SourceCodeSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecArgs
{
InlineSource = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs
{
SourceArchive = Std.Filebase64.Invoke(new()
{
Input = "./test-fixtures/mds_agent_src.tar.gz",
}).Apply(invoke => invoke.Result),
},
PythonSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs
{
EntrypointModule = "metadata_agent",
EntrypointObject = "root_agent",
},
},
},
});
var tenantMds = Gcp.Vertex.GetAiReasoningEngineQuery.Invoke(new()
{
Region = "us-central1",
ReasoningEngineId = tenantMdsAiReasoningEngine.Name,
});
var tenantArReader = new Gcp.Projects.IAMMember("tenant_ar_reader", new()
{
Project = project.Apply(getProjectResult => getProjectResult.ProjectId),
Role = "roles/artifactregistry.reader",
Member = Std.Jsondecode.Invoke(new()
{
Input = tenantMds.Apply(getAiReasoningEngineQueryResult => getAiReasoningEngineQueryResult.Output),
}).Apply(invoke => $"serviceAccount:{invoke.Result?.Output}"),
});
var reasoningEngine = new Gcp.Vertex.AiReasoningEngine("reasoning_engine", new()
{
DisplayName = "reasoning-engine",
Description = "Deployed with BYOC through Terraform",
Region = "us-central1",
Spec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecArgs
{
ContainerSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecContainerSpecArgs
{
ImageUri = $"us-central1-docker.pkg.dev/{project.Apply(getProjectResult => getProjectResult.ProjectId)}/vertex-byoc/byoc-agent:latest",
Port = 8080,
},
},
}, new CustomResourceOptions
{
DependsOn =
{
vertexArReader,
tenantArReader,
},
});
});
package main
import (
"fmt"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/organizations"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/projects"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/vertex"
"github.com/pulumi/pulumi-std/sdk/go/std"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
project, err := organizations.LookupProject(ctx, &organizations.LookupProjectArgs{}, nil)
if err != nil {
return err
}
vertexArReader, err := projects.NewIAMMember(ctx, "vertex_ar_reader", &projects.IAMMemberArgs{
Project: pulumi.String(project.ProjectId),
Role: pulumi.String("roles/artifactregistry.reader"),
Member: pulumi.Sprintf("serviceAccount:service-%v@gcp-sa-aiplatform-re.iam.gserviceaccount.com", project.Number),
})
if err != nil {
return err
}
invokeFilebase64, err := std.Filebase64(ctx, &std.Filebase64Args{
Input: "./test-fixtures/mds_agent_src.tar.gz",
}, nil)
if err != nil {
return err
}
// Provision and retrieve the tenant service agent through another agent
tenantMdsAiReasoningEngine, err := vertex.NewAiReasoningEngine(ctx, "tenant_mds", &vertex.AiReasoningEngineArgs{
DisplayName: pulumi.String("reasoning-engine-mds"),
Region: pulumi.String("us-central1"),
Spec: &vertex.AiReasoningEngineSpecArgs{
SourceCodeSpec: &vertex.AiReasoningEngineSpecSourceCodeSpecArgs{
InlineSource: &vertex.AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs{
SourceArchive: pulumi.String(invokeFilebase64.Result),
},
PythonSpec: &vertex.AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs{
EntrypointModule: pulumi.String("metadata_agent"),
EntrypointObject: pulumi.String("root_agent"),
},
},
},
})
if err != nil {
return err
}
tenantMds := vertex.GetAiReasoningEngineQueryOutput(ctx, vertex.GetAiReasoningEngineQueryOutputArgs{
Region: pulumi.String("us-central1"),
ReasoningEngineId: tenantMdsAiReasoningEngine.Name,
}, nil)
tenantArReader, err := projects.NewIAMMember(ctx, "tenant_ar_reader", &projects.IAMMemberArgs{
Project: pulumi.String(project.ProjectId),
Role: pulumi.String("roles/artifactregistry.reader"),
Member: std.JsondecodeOutput(ctx, std.JsondecodeOutputArgs{
Input: tenantMds.Output(),
}, nil).ApplyT(func(invoke std.JsondecodeResult) (string, error) {
return fmt.Sprintf("serviceAccount:%v", invoke.Result.Output), nil
}).(pulumi.StringOutput),
})
if err != nil {
return err
}
_, err = vertex.NewAiReasoningEngine(ctx, "reasoning_engine", &vertex.AiReasoningEngineArgs{
DisplayName: pulumi.String("reasoning-engine"),
Description: pulumi.String("Deployed with BYOC through Terraform"),
Region: pulumi.String("us-central1"),
Spec: &vertex.AiReasoningEngineSpecArgs{
ContainerSpec: &vertex.AiReasoningEngineSpecContainerSpecArgs{
ImageUri: pulumi.Sprintf("us-central1-docker.pkg.dev/%v/vertex-byoc/byoc-agent:latest", project.ProjectId),
Port: pulumi.Int(8080),
},
},
}, pulumi.DependsOn([]pulumi.Resource{
vertexArReader,
tenantArReader,
}))
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
std = {
source = "pulumi/std"
}
}
}
data "gcp_vertex_getaireasoningenginequery" "tenantMds" {
region = "us-central1"
reasoning_engine_id = gcp_vertex_aireasoningengine.tenant_mds.name
}
data "gcp_organizations_getproject" "project" {
}
resource "gcp_vertex_aireasoningengine" "reasoning_engine" {
depends_on = [gcp_projects_iammember.vertex_ar_reader, gcp_projects_iammember.tenant_ar_reader]
display_name = "reasoning-engine"
description = "Deployed with BYOC through Terraform"
region = "us-central1"
spec = {
container_spec = {
image_uri ="us-central1-docker.pkg.dev/${data.gcp_organizations_getproject.project.project_id}/vertex-byoc/byoc-agent:latest"
port = 8080
}
}
}
# Provision and retrieve the tenant service agent through another agent
resource "gcp_vertex_aireasoningengine" "tenant_mds" {
display_name = "reasoning-engine-mds"
region = "us-central1"
spec = {
source_code_spec = {
inline_source = {
source_archive = filebase64("./test-fixtures/mds_agent_src.tar.gz")
}
python_spec = {
entrypoint_module = "metadata_agent"
entrypoint_object = "root_agent"
}
}
}
}
resource "gcp_projects_iammember" "vertex_ar_reader" {
project = data.gcp_organizations_getproject.project.project_id
role = "roles/artifactregistry.reader"
member ="serviceAccount:service-${data.gcp_organizations_getproject.project.number}@gcp-sa-aiplatform-re.iam.gserviceaccount.com"
}
resource "gcp_projects_iammember" "tenant_ar_reader" {
project = data.gcp_organizations_getproject.project.project_id
role = "roles/artifactregistry.reader"
member ="serviceAccount:${jsondecode(data.gcp_vertex_getaireasoningenginequery.tenantMds.output).output}"
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.organizations.OrganizationsFunctions;
import com.pulumi.gcp.organizations.inputs.GetProjectArgs;
import com.pulumi.gcp.projects.IAMMember;
import com.pulumi.gcp.projects.IAMMemberArgs;
import com.pulumi.gcp.vertex.AiReasoningEngine;
import com.pulumi.gcp.vertex.AiReasoningEngineArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs;
import com.pulumi.std.StdFunctions;
import com.pulumi.std.inputs.Filebase64Args;
import com.pulumi.gcp.vertex.VertexFunctions;
import com.pulumi.gcp.vertex.inputs.GetAiReasoningEngineQueryArgs;
import com.pulumi.std.inputs.JsondecodeArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecContainerSpecArgs;
import com.pulumi.resources.CustomResourceOptions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
final var project = OrganizationsFunctions.getProject(GetProjectArgs.builder()
.build());
var vertexArReader = new IAMMember("vertexArReader", IAMMemberArgs.builder()
.project(project.projectId())
.role("roles/artifactregistry.reader")
.member(String.format("serviceAccount:service-%s@gcp-sa-aiplatform-re.iam.gserviceaccount.com", project.number()))
.build());
// Provision and retrieve the tenant service agent through another agent
var tenantMdsAiReasoningEngine = new AiReasoningEngine("tenantMdsAiReasoningEngine", AiReasoningEngineArgs.builder()
.displayName("reasoning-engine-mds")
.region("us-central1")
.spec(AiReasoningEngineSpecArgs.builder()
.sourceCodeSpec(AiReasoningEngineSpecSourceCodeSpecArgs.builder()
.inlineSource(AiReasoningEngineSpecSourceCodeSpecInlineSourceArgs.builder()
.sourceArchive(StdFunctions.filebase64(Filebase64Args.builder()
.input("./test-fixtures/mds_agent_src.tar.gz")
.build()).result())
.build())
.pythonSpec(AiReasoningEngineSpecSourceCodeSpecPythonSpecArgs.builder()
.entrypointModule("metadata_agent")
.entrypointObject("root_agent")
.build())
.build())
.build())
.build());
final var tenantMds = VertexFunctions.getAiReasoningEngineQuery(GetAiReasoningEngineQueryArgs.builder()
.region("us-central1")
.reasoningEngineId(tenantMdsAiReasoningEngine.name())
.build());
var tenantArReader = new IAMMember("tenantArReader", IAMMemberArgs.builder()
.project(project.projectId())
.role("roles/artifactregistry.reader")
.member(StdFunctions.jsondecode(JsondecodeArgs.builder()
.input(tenantMds.applyValue(_tenantMds -> _tenantMds.output()))
.build()).applyValue(_invoke -> String.format("serviceAccount:%s", _invoke.result().get("output"))))
.build());
var reasoningEngine = new AiReasoningEngine("reasoningEngine", AiReasoningEngineArgs.builder()
.displayName("reasoning-engine")
.description("Deployed with BYOC through Terraform")
.region("us-central1")
.spec(AiReasoningEngineSpecArgs.builder()
.containerSpec(AiReasoningEngineSpecContainerSpecArgs.builder()
.imageUri(String.format("us-central1-docker.pkg.dev/%s/vertex-byoc/byoc-agent:latest", project.projectId()))
.port(8080)
.build())
.build())
.build(), CustomResourceOptions.builder()
.dependsOn(
vertexArReader,
tenantArReader)
.build());
}
}
resources:
reasoningEngine:
type: gcp:vertex:AiReasoningEngine
name: reasoning_engine
properties:
displayName: reasoning-engine
description: Deployed with BYOC through Terraform
region: us-central1
spec:
containerSpec:
imageUri: us-central1-docker.pkg.dev/${project.projectId}/vertex-byoc/byoc-agent:latest
port: 8080
options:
dependsOn:
- ${vertexArReader}
- ${tenantArReader}
# Provision and retrieve the tenant service agent through another agent
tenantMdsAiReasoningEngine:
type: gcp:vertex:AiReasoningEngine
name: tenant_mds
properties:
displayName: reasoning-engine-mds
region: us-central1
spec:
sourceCodeSpec:
inlineSource:
sourceArchive:
fn::invoke:
function: std:filebase64
arguments:
input: ./test-fixtures/mds_agent_src.tar.gz
return: result
pythonSpec:
entrypointModule: metadata_agent
entrypointObject: root_agent
vertexArReader:
type: gcp:projects:IAMMember
name: vertex_ar_reader
properties:
project: ${project.projectId}
role: roles/artifactregistry.reader
member: serviceAccount:service-${project.number}@gcp-sa-aiplatform-re.iam.gserviceaccount.com
tenantArReader:
type: gcp:projects:IAMMember
name: tenant_ar_reader
properties:
project: ${project.projectId}
role: roles/artifactregistry.reader
member:
fn::join:
- ""
- - 'serviceAccount:'
- fn::invoke:
function: std:jsondecode
arguments:
input: ${tenantMds.output}
return: result.output
variables:
tenantMds:
fn::invoke:
function: gcp:vertex:getAiReasoningEngineQuery
arguments:
region: us-central1
reasoningEngineId: ${tenantMdsAiReasoningEngine.name}
project:
fn::invoke:
function: gcp:organizations:getProject
arguments: {}
Vertex Ai Reasoning Engine Psc Interface
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
import * as time from "@pulumiverse/time";
const bucket = new gcp.storage.Bucket("bucket", {
name: "reasoning-engine",
location: "us-central1",
uniformBucketLevelAccess: true,
forceDestroy: true,
});
const bucketObjRequirementsTxt = new gcp.storage.BucketObject("bucket_obj_requirements_txt", {
name: "requirements.txt",
bucket: bucket.id,
source: new pulumi.asset.FileAsset("./test-fixtures/requirements_adk.txt"),
});
const bucketObjPickle = new gcp.storage.BucketObject("bucket_obj_pickle", {
name: "code.pkl",
bucket: bucket.id,
source: new pulumi.asset.FileAsset("./test-fixtures/pickle_adk.pkl"),
});
const bucketObjDependenciesTarGz = new gcp.storage.BucketObject("bucket_obj_dependencies_tar_gz", {
name: "dependencies.tar.gz",
bucket: bucket.id,
source: new pulumi.asset.FileAsset("./test-fixtures/dependencies_adk.tar.gz"),
});
const network = new gcp.compute.Network("network", {
name: "network",
autoCreateSubnetworks: false,
});
const subnetwork = new gcp.compute.Subnetwork("subnetwork", {
name: "subnetwork",
region: "us-central1",
ipCidrRange: "10.0.0.0/16",
network: network.id,
});
const networkAttachment = new gcp.compute.NetworkAttachment("network_attachment", {
name: "network-attachment",
region: "us-central1",
connectionPreference: "ACCEPT_MANUAL",
subnetworks: [subnetwork.id],
});
// Destroy network attachment 35 minutes after reasoning engine is deleted.
// It guarantees that the network attachment has no more active PSC interfaces.
const wait35Minutes = new time.Sleep("wait_35_minutes", {destroyDuration: "35m"}, {
dependsOn: [networkAttachment],
});
const project = gcp.organizations.getProject({});
// When PSC-I is configured, Agent deletion will fail,
// although the agent will be deleted.
// Bug at https://github.com/hashicorp/terraform-provider-google/issues/25637
const reasoningEngine = new gcp.vertex.AiReasoningEngine("reasoning_engine", {
displayName: "reasoning-engine",
description: "A basic reasoning engine",
region: "us-central1",
spec: {
agentFramework: "google-adk",
packageSpec: {
pythonVersion: "3.11",
dependencyFilesGcsUri: pulumi.interpolate`${bucket.url}/${bucketObjDependenciesTarGz.name}`,
pickleObjectGcsUri: pulumi.interpolate`${bucket.url}/${bucketObjPickle.name}`,
requirementsGcsUri: pulumi.interpolate`${bucket.url}/${bucketObjRequirementsTxt.name}`,
},
deploymentSpec: {
pscInterfaceConfig: {
networkAttachment: networkAttachment.id,
dnsPeeringConfigs: [{
domain: "example.com.",
targetProject: project.then(project => project.projectId),
targetNetwork: network.name,
}],
},
},
},
}, {
dependsOn: [wait35Minutes],
});
import pulumi
import pulumi_gcp as gcp
import pulumiverse_time as time
bucket = gcp.storage.Bucket("bucket",
name="reasoning-engine",
location="us-central1",
uniform_bucket_level_access=True,
force_destroy=True)
bucket_obj_requirements_txt = gcp.storage.BucketObject("bucket_obj_requirements_txt",
name="requirements.txt",
bucket=bucket.id,
source=pulumi.FileAsset("./test-fixtures/requirements_adk.txt"))
bucket_obj_pickle = gcp.storage.BucketObject("bucket_obj_pickle",
name="code.pkl",
bucket=bucket.id,
source=pulumi.FileAsset("./test-fixtures/pickle_adk.pkl"))
bucket_obj_dependencies_tar_gz = gcp.storage.BucketObject("bucket_obj_dependencies_tar_gz",
name="dependencies.tar.gz",
bucket=bucket.id,
source=pulumi.FileAsset("./test-fixtures/dependencies_adk.tar.gz"))
network = gcp.compute.Network("network",
name="network",
auto_create_subnetworks=False)
subnetwork = gcp.compute.Subnetwork("subnetwork",
name="subnetwork",
region="us-central1",
ip_cidr_range="10.0.0.0/16",
network=network.id)
network_attachment = gcp.compute.NetworkAttachment("network_attachment",
name="network-attachment",
region="us-central1",
connection_preference="ACCEPT_MANUAL",
subnetworks=[subnetwork.id])
# Destroy network attachment 35 minutes after reasoning engine is deleted.
# It guarantees that the network attachment has no more active PSC interfaces.
wait35_minutes = time.Sleep("wait_35_minutes", destroy_duration="35m",
opts = pulumi.ResourceOptions(depends_on=[network_attachment]))
project = gcp.organizations.get_project()
# When PSC-I is configured, Agent deletion will fail,
# although the agent will be deleted.
# Bug at https://github.com/hashicorp/terraform-provider-google/issues/25637
reasoning_engine = gcp.vertex.AiReasoningEngine("reasoning_engine",
display_name="reasoning-engine",
description="A basic reasoning engine",
region="us-central1",
spec={
"agent_framework": "google-adk",
"package_spec": {
"python_version": "3.11",
"dependency_files_gcs_uri": pulumi.Output.all(
url=bucket.url,
name=bucket_obj_dependencies_tar_gz.name
).apply(lambda resolved_outputs: f"{resolved_outputs['url']}/{resolved_outputs['name']}")
,
"pickle_object_gcs_uri": pulumi.Output.all(
url=bucket.url,
name=bucket_obj_pickle.name
).apply(lambda resolved_outputs: f"{resolved_outputs['url']}/{resolved_outputs['name']}")
,
"requirements_gcs_uri": pulumi.Output.all(
url=bucket.url,
name=bucket_obj_requirements_txt.name
).apply(lambda resolved_outputs: f"{resolved_outputs['url']}/{resolved_outputs['name']}")
,
},
"deployment_spec": {
"psc_interface_config": {
"network_attachment": network_attachment.id,
"dns_peering_configs": [{
"domain": "example.com.",
"target_project": project.project_id,
"target_network": network.name,
}],
},
},
},
opts = pulumi.ResourceOptions(depends_on=[wait35_minutes]))
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
using Time = Pulumiverse.Time;
return await Deployment.RunAsync(() =>
{
var bucket = new Gcp.Storage.Bucket("bucket", new()
{
Name = "reasoning-engine",
Location = "us-central1",
UniformBucketLevelAccess = true,
ForceDestroy = true,
});
var bucketObjRequirementsTxt = new Gcp.Storage.BucketObject("bucket_obj_requirements_txt", new()
{
Name = "requirements.txt",
Bucket = bucket.Id,
Source = new FileAsset("./test-fixtures/requirements_adk.txt"),
});
var bucketObjPickle = new Gcp.Storage.BucketObject("bucket_obj_pickle", new()
{
Name = "code.pkl",
Bucket = bucket.Id,
Source = new FileAsset("./test-fixtures/pickle_adk.pkl"),
});
var bucketObjDependenciesTarGz = new Gcp.Storage.BucketObject("bucket_obj_dependencies_tar_gz", new()
{
Name = "dependencies.tar.gz",
Bucket = bucket.Id,
Source = new FileAsset("./test-fixtures/dependencies_adk.tar.gz"),
});
var network = new Gcp.Compute.Network("network", new()
{
Name = "network",
AutoCreateSubnetworks = false,
});
var subnetwork = new Gcp.Compute.Subnetwork("subnetwork", new()
{
Name = "subnetwork",
Region = "us-central1",
IpCidrRange = "10.0.0.0/16",
Network = network.Id,
});
var networkAttachment = new Gcp.Compute.NetworkAttachment("network_attachment", new()
{
Name = "network-attachment",
Region = "us-central1",
ConnectionPreference = "ACCEPT_MANUAL",
Subnetworks = new[]
{
subnetwork.Id,
},
});
// Destroy network attachment 35 minutes after reasoning engine is deleted.
// It guarantees that the network attachment has no more active PSC interfaces.
var wait35Minutes = new Time.Sleep("wait_35_minutes", new()
{
DestroyDuration = "35m",
}, new CustomResourceOptions
{
DependsOn =
{
networkAttachment,
},
});
var project = Gcp.Organizations.GetProject.Invoke();
// When PSC-I is configured, Agent deletion will fail,
// although the agent will be deleted.
// Bug at https://github.com/hashicorp/terraform-provider-google/issues/25637
var reasoningEngine = new Gcp.Vertex.AiReasoningEngine("reasoning_engine", new()
{
DisplayName = "reasoning-engine",
Description = "A basic reasoning engine",
Region = "us-central1",
Spec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecArgs
{
AgentFramework = "google-adk",
PackageSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecPackageSpecArgs
{
PythonVersion = "3.11",
DependencyFilesGcsUri = Output.Tuple(bucket.Url, bucketObjDependenciesTarGz.Name).Apply(values =>
{
var url = values.Item1;
var name = values.Item2;
return $"{url}/{name}";
}),
PickleObjectGcsUri = Output.Tuple(bucket.Url, bucketObjPickle.Name).Apply(values =>
{
var url = values.Item1;
var name = values.Item2;
return $"{url}/{name}";
}),
RequirementsGcsUri = Output.Tuple(bucket.Url, bucketObjRequirementsTxt.Name).Apply(values =>
{
var url = values.Item1;
var name = values.Item2;
return $"{url}/{name}";
}),
},
DeploymentSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecDeploymentSpecArgs
{
PscInterfaceConfig = new Gcp.Vertex.Inputs.AiReasoningEngineSpecDeploymentSpecPscInterfaceConfigArgs
{
NetworkAttachment = networkAttachment.Id,
DnsPeeringConfigs = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineSpecDeploymentSpecPscInterfaceConfigDnsPeeringConfigArgs
{
Domain = "example.com.",
TargetProject = project.Apply(getProjectResult => getProjectResult.ProjectId),
TargetNetwork = network.Name,
},
},
},
},
},
}, new CustomResourceOptions
{
DependsOn =
{
wait35Minutes,
},
});
});
package main
import (
"fmt"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/organizations"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/storage"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/vertex"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
"github.com/pulumiverse/pulumi-time/sdk/go/time"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
bucket, err := storage.NewBucket(ctx, "bucket", &storage.BucketArgs{
Name: pulumi.String("reasoning-engine"),
Location: pulumi.String("us-central1"),
UniformBucketLevelAccess: pulumi.Bool(true),
ForceDestroy: pulumi.Bool(true),
})
if err != nil {
return err
}
bucketObjRequirementsTxt, err := storage.NewBucketObject(ctx, "bucket_obj_requirements_txt", &storage.BucketObjectArgs{
Name: pulumi.String("requirements.txt"),
Bucket: bucket.ID().ToIDOutput().ToStringOutput(),
Source: pulumi.NewFileAsset("./test-fixtures/requirements_adk.txt"),
})
if err != nil {
return err
}
bucketObjPickle, err := storage.NewBucketObject(ctx, "bucket_obj_pickle", &storage.BucketObjectArgs{
Name: pulumi.String("code.pkl"),
Bucket: bucket.ID().ToIDOutput().ToStringOutput(),
Source: pulumi.NewFileAsset("./test-fixtures/pickle_adk.pkl"),
})
if err != nil {
return err
}
bucketObjDependenciesTarGz, err := storage.NewBucketObject(ctx, "bucket_obj_dependencies_tar_gz", &storage.BucketObjectArgs{
Name: pulumi.String("dependencies.tar.gz"),
Bucket: bucket.ID().ToIDOutput().ToStringOutput(),
Source: pulumi.NewFileAsset("./test-fixtures/dependencies_adk.tar.gz"),
})
if err != nil {
return err
}
network, err := compute.NewNetwork(ctx, "network", &compute.NetworkArgs{
Name: pulumi.String("network"),
AutoCreateSubnetworks: pulumi.Bool(false),
})
if err != nil {
return err
}
subnetwork, err := compute.NewSubnetwork(ctx, "subnetwork", &compute.SubnetworkArgs{
Name: pulumi.String("subnetwork"),
Region: pulumi.String("us-central1"),
IpCidrRange: pulumi.String("10.0.0.0/16"),
Network: network.ID().ToIDOutput().ToStringOutput(),
})
if err != nil {
return err
}
networkAttachment, err := compute.NewNetworkAttachment(ctx, "network_attachment", &compute.NetworkAttachmentArgs{
Name: pulumi.String("network-attachment"),
Region: pulumi.String("us-central1"),
ConnectionPreference: pulumi.String("ACCEPT_MANUAL"),
Subnetworks: pulumi.StringArray{
subnetwork.ID().ToIDOutput().ToStringOutput(),
},
})
if err != nil {
return err
}
// Destroy network attachment 35 minutes after reasoning engine is deleted.
// It guarantees that the network attachment has no more active PSC interfaces.
wait35Minutes, err := time.NewSleep(ctx, "wait_35_minutes", &time.SleepArgs{
DestroyDuration: pulumi.String("35m"),
}, pulumi.DependsOn([]pulumi.Resource{
networkAttachment,
}))
if err != nil {
return err
}
project, err := organizations.LookupProject(ctx, &organizations.LookupProjectArgs{}, nil)
if err != nil {
return err
}
// When PSC-I is configured, Agent deletion will fail,
// although the agent will be deleted.
// Bug at https://github.com/hashicorp/terraform-provider-google/issues/25637
_, err = vertex.NewAiReasoningEngine(ctx, "reasoning_engine", &vertex.AiReasoningEngineArgs{
DisplayName: pulumi.String("reasoning-engine"),
Description: pulumi.String("A basic reasoning engine"),
Region: pulumi.String("us-central1"),
Spec: &vertex.AiReasoningEngineSpecArgs{
AgentFramework: pulumi.String("google-adk"),
PackageSpec: &vertex.AiReasoningEngineSpecPackageSpecArgs{
PythonVersion: pulumi.String("3.11"),
DependencyFilesGcsUri: pulumi.All(bucket.Url, bucketObjDependenciesTarGz.Name).ApplyT(func(_args []interface{}) (string, error) {
url := _args[0].(string)
name := _args[1].(string)
return fmt.Sprintf("%v/%v", url, name), nil
}).(pulumi.StringOutput),
PickleObjectGcsUri: pulumi.All(bucket.Url, bucketObjPickle.Name).ApplyT(func(_args []interface{}) (string, error) {
url := _args[0].(string)
name := _args[1].(string)
return fmt.Sprintf("%v/%v", url, name), nil
}).(pulumi.StringOutput),
RequirementsGcsUri: pulumi.All(bucket.Url, bucketObjRequirementsTxt.Name).ApplyT(func(_args []interface{}) (string, error) {
url := _args[0].(string)
name := _args[1].(string)
return fmt.Sprintf("%v/%v", url, name), nil
}).(pulumi.StringOutput),
},
DeploymentSpec: &vertex.AiReasoningEngineSpecDeploymentSpecArgs{
PscInterfaceConfig: &vertex.AiReasoningEngineSpecDeploymentSpecPscInterfaceConfigArgs{
NetworkAttachment: networkAttachment.ID().ToIDOutput().ToStringOutput(),
DnsPeeringConfigs: vertex.AiReasoningEngineSpecDeploymentSpecPscInterfaceConfigDnsPeeringConfigArray{
&vertex.AiReasoningEngineSpecDeploymentSpecPscInterfaceConfigDnsPeeringConfigArgs{
Domain: pulumi.String("example.com."),
TargetProject: pulumi.String(project.ProjectId),
TargetNetwork: network.Name,
},
},
},
},
},
}, pulumi.DependsOn([]pulumi.Resource{
wait35Minutes,
}))
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
time = {
source = "pulumi/time"
}
}
}
data "gcp_organizations_getproject" "project" {
}
# When PSC-I is configured, Agent deletion will fail,
# although the agent will be deleted.
# Bug at https://github.com/hashicorp/terraform-provider-google/issues/25637
resource "gcp_vertex_aireasoningengine" "reasoning_engine" {
depends_on = [time_sleep.wait_35_minutes]
display_name = "reasoning-engine"
description = "A basic reasoning engine"
region = "us-central1"
spec = {
agent_framework = "google-adk"
package_spec = {
python_version = "3.11"
dependency_files_gcs_uri ="${gcp_storage_bucket.bucket.url}/${gcp_storage_bucketobject.bucket_obj_dependencies_tar_gz.name}"
pickle_object_gcs_uri ="${gcp_storage_bucket.bucket.url}/${gcp_storage_bucketobject.bucket_obj_pickle.name}"
requirements_gcs_uri ="${gcp_storage_bucket.bucket.url}/${gcp_storage_bucketobject.bucket_obj_requirements_txt.name}"
}
deployment_spec = {
psc_interface_config = {
network_attachment = gcp_compute_networkattachment.network_attachment.id
dns_peering_configs = [{
"domain" = "example.com."
"targetProject" = data.gcp_organizations_getproject.project.project_id
"targetNetwork" = gcp_compute_network.network.name
}]
}
}
}
}
resource "gcp_storage_bucketobject" "bucket_obj_requirements_txt" {
name = "requirements.txt"
bucket = gcp_storage_bucket.bucket.id
source = fileAsset("./test-fixtures/requirements_adk.txt")
}
resource "gcp_storage_bucketobject" "bucket_obj_pickle" {
name = "code.pkl"
bucket = gcp_storage_bucket.bucket.id
source = fileAsset("./test-fixtures/pickle_adk.pkl")
}
resource "gcp_storage_bucketobject" "bucket_obj_dependencies_tar_gz" {
name = "dependencies.tar.gz"
bucket = gcp_storage_bucket.bucket.id
source = fileAsset("./test-fixtures/dependencies_adk.tar.gz")
}
resource "gcp_storage_bucket" "bucket" {
name = "reasoning-engine"
location = "us-central1"
uniform_bucket_level_access = true
force_destroy = true
}
# Destroy network attachment 35 minutes after reasoning engine is deleted.
# It guarantees that the network attachment has no more active PSC interfaces.
resource "time_sleep" "wait_35_minutes" {
depends_on = [gcp_compute_networkattachment.network_attachment]
destroy_duration = "35m"
}
resource "gcp_compute_networkattachment" "network_attachment" {
name = "network-attachment"
region = "us-central1"
connection_preference = "ACCEPT_MANUAL"
subnetworks = [gcp_compute_subnetwork.subnetwork.id]
}
resource "gcp_compute_subnetwork" "subnetwork" {
name = "subnetwork"
region = "us-central1"
ip_cidr_range = "10.0.0.0/16"
network = gcp_compute_network.network.id
}
resource "gcp_compute_network" "network" {
name = "network"
auto_create_subnetworks = false
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.storage.Bucket;
import com.pulumi.gcp.storage.BucketArgs;
import com.pulumi.gcp.storage.BucketObject;
import com.pulumi.gcp.storage.BucketObjectArgs;
import com.pulumi.gcp.compute.Network;
import com.pulumi.gcp.compute.NetworkArgs;
import com.pulumi.gcp.compute.Subnetwork;
import com.pulumi.gcp.compute.SubnetworkArgs;
import com.pulumi.gcp.compute.NetworkAttachment;
import com.pulumi.gcp.compute.NetworkAttachmentArgs;
import com.pulumiverse.time.Sleep;
import com.pulumiverse.time.SleepArgs;
import com.pulumi.gcp.organizations.OrganizationsFunctions;
import com.pulumi.gcp.organizations.inputs.GetProjectArgs;
import com.pulumi.gcp.vertex.AiReasoningEngine;
import com.pulumi.gcp.vertex.AiReasoningEngineArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecPackageSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecDeploymentSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecDeploymentSpecPscInterfaceConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecDeploymentSpecPscInterfaceConfigDnsPeeringConfigArgs;
import com.pulumi.asset.FileAsset;
import com.pulumi.resources.CustomResourceOptions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var bucket = new Bucket("bucket", BucketArgs.builder()
.name("reasoning-engine")
.location("us-central1")
.uniformBucketLevelAccess(true)
.forceDestroy(true)
.build());
var bucketObjRequirementsTxt = new BucketObject("bucketObjRequirementsTxt", BucketObjectArgs.builder()
.name("requirements.txt")
.bucket(bucket.id())
.source(new FileAsset("./test-fixtures/requirements_adk.txt"))
.build());
var bucketObjPickle = new BucketObject("bucketObjPickle", BucketObjectArgs.builder()
.name("code.pkl")
.bucket(bucket.id())
.source(new FileAsset("./test-fixtures/pickle_adk.pkl"))
.build());
var bucketObjDependenciesTarGz = new BucketObject("bucketObjDependenciesTarGz", BucketObjectArgs.builder()
.name("dependencies.tar.gz")
.bucket(bucket.id())
.source(new FileAsset("./test-fixtures/dependencies_adk.tar.gz"))
.build());
var network = new Network("network", NetworkArgs.builder()
.name("network")
.autoCreateSubnetworks(false)
.build());
var subnetwork = new Subnetwork("subnetwork", SubnetworkArgs.builder()
.name("subnetwork")
.region("us-central1")
.ipCidrRange("10.0.0.0/16")
.network(network.id())
.build());
var networkAttachment = new NetworkAttachment("networkAttachment", NetworkAttachmentArgs.builder()
.name("network-attachment")
.region("us-central1")
.connectionPreference("ACCEPT_MANUAL")
.subnetworks(subnetwork.id())
.build());
// Destroy network attachment 35 minutes after reasoning engine is deleted.
// It guarantees that the network attachment has no more active PSC interfaces.
var wait35Minutes = new Sleep("wait35Minutes", SleepArgs.builder()
.destroyDuration("35m")
.build(), CustomResourceOptions.builder()
.dependsOn(networkAttachment)
.build());
final var project = OrganizationsFunctions.getProject(GetProjectArgs.builder()
.build());
// When PSC-I is configured, Agent deletion will fail,
// although the agent will be deleted.
// Bug at https://github.com/hashicorp/terraform-provider-google/issues/25637
var reasoningEngine = new AiReasoningEngine("reasoningEngine", AiReasoningEngineArgs.builder()
.displayName("reasoning-engine")
.description("A basic reasoning engine")
.region("us-central1")
.spec(AiReasoningEngineSpecArgs.builder()
.agentFramework("google-adk")
.packageSpec(AiReasoningEngineSpecPackageSpecArgs.builder()
.pythonVersion("3.11")
.dependencyFilesGcsUri(Output.tuple(bucket.url(), bucketObjDependenciesTarGz.name()).applyValue(values -> {
var url = values.t1;
var name = values.t2;
return String.format("%s/%s", url,name);
}))
.pickleObjectGcsUri(Output.tuple(bucket.url(), bucketObjPickle.name()).applyValue(values -> {
var url = values.t1;
var name = values.t2;
return String.format("%s/%s", url,name);
}))
.requirementsGcsUri(Output.tuple(bucket.url(), bucketObjRequirementsTxt.name()).applyValue(values -> {
var url = values.t1;
var name = values.t2;
return String.format("%s/%s", url,name);
}))
.build())
.deploymentSpec(AiReasoningEngineSpecDeploymentSpecArgs.builder()
.pscInterfaceConfig(AiReasoningEngineSpecDeploymentSpecPscInterfaceConfigArgs.builder()
.networkAttachment(networkAttachment.id())
.dnsPeeringConfigs(AiReasoningEngineSpecDeploymentSpecPscInterfaceConfigDnsPeeringConfigArgs.builder()
.domain("example.com.")
.targetProject(project.projectId())
.targetNetwork(network.name())
.build())
.build())
.build())
.build())
.build(), CustomResourceOptions.builder()
.dependsOn(wait35Minutes)
.build());
}
}
resources:
# When PSC-I is configured, Agent deletion will fail,
# although the agent will be deleted.
# Bug at https://github.com/hashicorp/terraform-provider-google/issues/25637
reasoningEngine:
type: gcp:vertex:AiReasoningEngine
name: reasoning_engine
properties:
displayName: reasoning-engine
description: A basic reasoning engine
region: us-central1
spec:
agentFramework: google-adk
packageSpec:
pythonVersion: '3.11'
dependencyFilesGcsUri: ${bucket.url}/${bucketObjDependenciesTarGz.name}
pickleObjectGcsUri: ${bucket.url}/${bucketObjPickle.name}
requirementsGcsUri: ${bucket.url}/${bucketObjRequirementsTxt.name}
deploymentSpec:
pscInterfaceConfig:
networkAttachment: ${networkAttachment.id}
dnsPeeringConfigs:
- domain: example.com.
targetProject: ${project.projectId}
targetNetwork: ${network.name}
options:
dependsOn:
- ${wait35Minutes}
bucketObjRequirementsTxt:
type: gcp:storage:BucketObject
name: bucket_obj_requirements_txt
properties:
name: requirements.txt
bucket: ${bucket.id}
source:
fn::fileAsset: ./test-fixtures/requirements_adk.txt
bucketObjPickle:
type: gcp:storage:BucketObject
name: bucket_obj_pickle
properties:
name: code.pkl
bucket: ${bucket.id}
source:
fn::fileAsset: ./test-fixtures/pickle_adk.pkl
bucketObjDependenciesTarGz:
type: gcp:storage:BucketObject
name: bucket_obj_dependencies_tar_gz
properties:
name: dependencies.tar.gz
bucket: ${bucket.id}
source:
fn::fileAsset: ./test-fixtures/dependencies_adk.tar.gz
bucket:
type: gcp:storage:Bucket
properties:
name: reasoning-engine
location: us-central1
uniformBucketLevelAccess: true
forceDestroy: true
# Destroy network attachment 35 minutes after reasoning engine is deleted.
# It guarantees that the network attachment has no more active PSC interfaces.
wait35Minutes:
type: time:Sleep
name: wait_35_minutes
properties:
destroyDuration: 35m
options:
dependsOn:
- ${networkAttachment}
networkAttachment:
type: gcp:compute:NetworkAttachment
name: network_attachment
properties:
name: network-attachment
region: us-central1
connectionPreference: ACCEPT_MANUAL
subnetworks:
- ${subnetwork.id}
subnetwork:
type: gcp:compute:Subnetwork
properties:
name: subnetwork
region: us-central1
ipCidrRange: 10.0.0.0/16
network: ${network.id}
network:
type: gcp:compute:Network
properties:
name: network
autoCreateSubnetworks: false
variables:
project:
fn::invoke:
function: gcp:organizations:getProject
arguments: {}
Vertex Ai Reasoning Engine Full
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
import * as time from "@pulumiverse/time";
const classMethods = [{
apiMode: "async",
description: null,
name: "async_query",
parameters: {
type: "object",
required: [],
properties: {},
},
}];
const secret = new gcp.secretmanager.Secret("secret", {
secretId: "secret",
replication: {
auto: {},
},
});
const secretVersion = new gcp.secretmanager.SecretVersion("secret_version", {
secret: secret.id,
secretData: "test",
});
const serviceAccount = new gcp.serviceaccount.Account("service_account", {accountId: "sa"});
const secretAccess = new gcp.secretmanager.SecretIamMember("secret_access", {
secretId: secret.id,
role: "roles/secretmanager.secretAccessor",
member: serviceAccount.member,
});
const project = gcp.organizations.getProject({});
const saIamObjectViewer = new gcp.projects.IAMMember("sa_iam_object_viewer", {
role: "roles/storage.objectViewer",
project: project.then(project => project.id),
member: serviceAccount.member,
});
const saIamAiPlatformUser = new gcp.projects.IAMMember("sa_iam_ai_platform_user", {
role: "roles/aiplatform.user",
project: project.then(project => project.id),
member: serviceAccount.member,
});
const saIamViewer = new gcp.projects.IAMMember("sa_iam_viewer", {
role: "roles/viewer",
project: project.then(project => project.id),
member: serviceAccount.member,
});
// Ensure we wait enough time for IAM permissions to be propagated
const wait5Minutes = new time.Sleep("wait_5_minutes", {createDuration: "5m"}, {
dependsOn: [
saIamAiPlatformUser,
saIamObjectViewer,
saIamViewer,
secretAccess,
secretVersion,
],
});
const bucket = new gcp.storage.Bucket("bucket", {
name: "reasoning-engine",
location: "us-central1",
uniformBucketLevelAccess: true,
forceDestroy: true,
});
const bucketObjRequirementsTxt = new gcp.storage.BucketObject("bucket_obj_requirements_txt", {
name: "requirements.txt",
bucket: bucket.id,
source: new pulumi.asset.FileAsset("./test-fixtures/requirements_adk.txt"),
});
const bucketObjPickle = new gcp.storage.BucketObject("bucket_obj_pickle", {
name: "code.pkl",
bucket: bucket.id,
source: new pulumi.asset.FileAsset("./test-fixtures/pickle_adk.pkl"),
});
const bucketObjDependenciesTarGz = new gcp.storage.BucketObject("bucket_obj_dependencies_tar_gz", {
name: "dependencies.tar.gz",
bucket: bucket.id,
source: new pulumi.asset.FileAsset("./test-fixtures/dependencies_adk.tar.gz"),
});
const reasoningEngine = new gcp.vertex.AiReasoningEngine("reasoning_engine", {
displayName: "reasoning-engine",
description: "A basic reasoning engine",
region: "us-central1",
encryptionSpec: {
kmsKeyName: "example-key",
},
spec: {
agentFramework: "google-adk",
classMethods: JSON.stringify(classMethods),
serviceAccount: serviceAccount.email,
deploymentSpec: {
minInstances: 1,
maxInstances: 3,
containerConcurrency: 5,
resourceLimits: {
cpu: "4",
memory: "4Gi",
},
envs: [
{
name: "var_1",
value: "value_2",
},
{
name: "var_2",
value: "value_2",
},
],
secretEnvs: [
{
name: "secret_var_1",
secretRef: {
secret: secret.secretId,
version: "latest",
},
},
{
name: "secret_var_2",
secretRef: {
secret: secret.secretId,
version: "latest",
},
},
],
},
packageSpec: {
dependencyFilesGcsUri: pulumi.interpolate`${bucket.url}/${bucketObjDependenciesTarGz.name}`,
pickleObjectGcsUri: pulumi.interpolate`${bucket.url}/${bucketObjPickle.name}`,
pythonVersion: "3.11",
requirementsGcsUri: pulumi.interpolate`${bucket.url}/${bucketObjRequirementsTxt.name}`,
},
},
}, {
dependsOn: [wait5Minutes],
});
import pulumi
import json
import pulumi_gcp as gcp
import pulumiverse_time as time
class_methods = [{
"apiMode": "async",
"description": None,
"name": "async_query",
"parameters": {
"type": "object",
"required": [],
"properties": {},
},
}]
secret = gcp.secretmanager.Secret("secret",
secret_id="secret",
replication={
"auto": {},
})
secret_version = gcp.secretmanager.SecretVersion("secret_version",
secret=secret.id,
secret_data="test")
service_account = gcp.serviceaccount.Account("service_account", account_id="sa")
secret_access = gcp.secretmanager.SecretIamMember("secret_access",
secret_id=secret.id,
role="roles/secretmanager.secretAccessor",
member=service_account.member)
project = gcp.organizations.get_project()
sa_iam_object_viewer = gcp.projects.IAMMember("sa_iam_object_viewer",
role="roles/storage.objectViewer",
project=project.id,
member=service_account.member)
sa_iam_ai_platform_user = gcp.projects.IAMMember("sa_iam_ai_platform_user",
role="roles/aiplatform.user",
project=project.id,
member=service_account.member)
sa_iam_viewer = gcp.projects.IAMMember("sa_iam_viewer",
role="roles/viewer",
project=project.id,
member=service_account.member)
# Ensure we wait enough time for IAM permissions to be propagated
wait5_minutes = time.Sleep("wait_5_minutes", create_duration="5m",
opts = pulumi.ResourceOptions(depends_on=[
sa_iam_ai_platform_user,
sa_iam_object_viewer,
sa_iam_viewer,
secret_access,
secret_version,
]))
bucket = gcp.storage.Bucket("bucket",
name="reasoning-engine",
location="us-central1",
uniform_bucket_level_access=True,
force_destroy=True)
bucket_obj_requirements_txt = gcp.storage.BucketObject("bucket_obj_requirements_txt",
name="requirements.txt",
bucket=bucket.id,
source=pulumi.FileAsset("./test-fixtures/requirements_adk.txt"))
bucket_obj_pickle = gcp.storage.BucketObject("bucket_obj_pickle",
name="code.pkl",
bucket=bucket.id,
source=pulumi.FileAsset("./test-fixtures/pickle_adk.pkl"))
bucket_obj_dependencies_tar_gz = gcp.storage.BucketObject("bucket_obj_dependencies_tar_gz",
name="dependencies.tar.gz",
bucket=bucket.id,
source=pulumi.FileAsset("./test-fixtures/dependencies_adk.tar.gz"))
reasoning_engine = gcp.vertex.AiReasoningEngine("reasoning_engine",
display_name="reasoning-engine",
description="A basic reasoning engine",
region="us-central1",
encryption_spec={
"kms_key_name": "example-key",
},
spec={
"agent_framework": "google-adk",
"class_methods": json.dumps(class_methods),
"service_account": service_account.email,
"deployment_spec": {
"min_instances": 1,
"max_instances": 3,
"container_concurrency": 5,
"resource_limits": {
"cpu": "4",
"memory": "4Gi",
},
"envs": [
{
"name": "var_1",
"value": "value_2",
},
{
"name": "var_2",
"value": "value_2",
},
],
"secret_envs": [
{
"name": "secret_var_1",
"secret_ref": {
"secret": secret.secret_id,
"version": "latest",
},
},
{
"name": "secret_var_2",
"secret_ref": {
"secret": secret.secret_id,
"version": "latest",
},
},
],
},
"package_spec": {
"dependency_files_gcs_uri": pulumi.Output.all(
url=bucket.url,
name=bucket_obj_dependencies_tar_gz.name
).apply(lambda resolved_outputs: f"{resolved_outputs['url']}/{resolved_outputs['name']}")
,
"pickle_object_gcs_uri": pulumi.Output.all(
url=bucket.url,
name=bucket_obj_pickle.name
).apply(lambda resolved_outputs: f"{resolved_outputs['url']}/{resolved_outputs['name']}")
,
"python_version": "3.11",
"requirements_gcs_uri": pulumi.Output.all(
url=bucket.url,
name=bucket_obj_requirements_txt.name
).apply(lambda resolved_outputs: f"{resolved_outputs['url']}/{resolved_outputs['name']}")
,
},
},
opts = pulumi.ResourceOptions(depends_on=[wait5_minutes]))
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using Pulumi;
using Gcp = Pulumi.Gcp;
using Time = Pulumiverse.Time;
return await Deployment.RunAsync(() =>
{
var classMethods = new[]
{
{
{ "apiMode", "async" },
{ "description", null },
{ "name", "async_query" },
{ "parameters",
{
{ "type", "object" },
{ "required", new object?[] {} },
{ "properties", null },
} },
},
};
var secret = new Gcp.SecretManager.Secret("secret", new()
{
SecretId = "secret",
Replication = new Gcp.SecretManager.Inputs.SecretReplicationArgs
{
Auto = null,
},
});
var secretVersion = new Gcp.SecretManager.SecretVersion("secret_version", new()
{
Secret = secret.Id,
SecretData = "test",
});
var serviceAccount = new Gcp.ServiceAccount.Account("service_account", new()
{
AccountId = "sa",
});
var secretAccess = new Gcp.SecretManager.SecretIamMember("secret_access", new()
{
SecretId = secret.Id,
Role = "roles/secretmanager.secretAccessor",
Member = serviceAccount.Member,
});
var project = Gcp.Organizations.GetProject.Invoke();
var saIamObjectViewer = new Gcp.Projects.IAMMember("sa_iam_object_viewer", new()
{
Role = "roles/storage.objectViewer",
Project = project.Apply(getProjectResult => getProjectResult.Id),
Member = serviceAccount.Member,
});
var saIamAiPlatformUser = new Gcp.Projects.IAMMember("sa_iam_ai_platform_user", new()
{
Role = "roles/aiplatform.user",
Project = project.Apply(getProjectResult => getProjectResult.Id),
Member = serviceAccount.Member,
});
var saIamViewer = new Gcp.Projects.IAMMember("sa_iam_viewer", new()
{
Role = "roles/viewer",
Project = project.Apply(getProjectResult => getProjectResult.Id),
Member = serviceAccount.Member,
});
// Ensure we wait enough time for IAM permissions to be propagated
var wait5Minutes = new Time.Sleep("wait_5_minutes", new()
{
CreateDuration = "5m",
}, new CustomResourceOptions
{
DependsOn =
{
saIamAiPlatformUser,
saIamObjectViewer,
saIamViewer,
secretAccess,
secretVersion,
},
});
var bucket = new Gcp.Storage.Bucket("bucket", new()
{
Name = "reasoning-engine",
Location = "us-central1",
UniformBucketLevelAccess = true,
ForceDestroy = true,
});
var bucketObjRequirementsTxt = new Gcp.Storage.BucketObject("bucket_obj_requirements_txt", new()
{
Name = "requirements.txt",
Bucket = bucket.Id,
Source = new FileAsset("./test-fixtures/requirements_adk.txt"),
});
var bucketObjPickle = new Gcp.Storage.BucketObject("bucket_obj_pickle", new()
{
Name = "code.pkl",
Bucket = bucket.Id,
Source = new FileAsset("./test-fixtures/pickle_adk.pkl"),
});
var bucketObjDependenciesTarGz = new Gcp.Storage.BucketObject("bucket_obj_dependencies_tar_gz", new()
{
Name = "dependencies.tar.gz",
Bucket = bucket.Id,
Source = new FileAsset("./test-fixtures/dependencies_adk.tar.gz"),
});
var reasoningEngine = new Gcp.Vertex.AiReasoningEngine("reasoning_engine", new()
{
DisplayName = "reasoning-engine",
Description = "A basic reasoning engine",
Region = "us-central1",
EncryptionSpec = new Gcp.Vertex.Inputs.AiReasoningEngineEncryptionSpecArgs
{
KmsKeyName = "example-key",
},
Spec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecArgs
{
AgentFramework = "google-adk",
ClassMethods = JsonSerializer.Serialize(classMethods),
ServiceAccount = serviceAccount.Email,
DeploymentSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecDeploymentSpecArgs
{
MinInstances = 1,
MaxInstances = 3,
ContainerConcurrency = 5,
ResourceLimits =
{
{ "cpu", "4" },
{ "memory", "4Gi" },
},
Envs = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineSpecDeploymentSpecEnvArgs
{
Name = "var_1",
Value = "value_2",
},
new Gcp.Vertex.Inputs.AiReasoningEngineSpecDeploymentSpecEnvArgs
{
Name = "var_2",
Value = "value_2",
},
},
SecretEnvs = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineSpecDeploymentSpecSecretEnvArgs
{
Name = "secret_var_1",
SecretRef = new Gcp.Vertex.Inputs.AiReasoningEngineSpecDeploymentSpecSecretEnvSecretRefArgs
{
Secret = secret.SecretId,
Version = "latest",
},
},
new Gcp.Vertex.Inputs.AiReasoningEngineSpecDeploymentSpecSecretEnvArgs
{
Name = "secret_var_2",
SecretRef = new Gcp.Vertex.Inputs.AiReasoningEngineSpecDeploymentSpecSecretEnvSecretRefArgs
{
Secret = secret.SecretId,
Version = "latest",
},
},
},
},
PackageSpec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecPackageSpecArgs
{
DependencyFilesGcsUri = Output.Tuple(bucket.Url, bucketObjDependenciesTarGz.Name).Apply(values =>
{
var url = values.Item1;
var name = values.Item2;
return $"{url}/{name}";
}),
PickleObjectGcsUri = Output.Tuple(bucket.Url, bucketObjPickle.Name).Apply(values =>
{
var url = values.Item1;
var name = values.Item2;
return $"{url}/{name}";
}),
PythonVersion = "3.11",
RequirementsGcsUri = Output.Tuple(bucket.Url, bucketObjRequirementsTxt.Name).Apply(values =>
{
var url = values.Item1;
var name = values.Item2;
return $"{url}/{name}";
}),
},
},
}, new CustomResourceOptions
{
DependsOn =
{
wait5Minutes,
},
});
});
package main
import (
"encoding/json"
"fmt"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/organizations"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/projects"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/secretmanager"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/serviceaccount"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/storage"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/vertex"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
"github.com/pulumiverse/pulumi-time/sdk/go/time"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
classMethods := []map[string]interface{}{
map[string]interface{}{
"apiMode": "async",
"description": nil,
"name": "async_query",
"parameters": map[string]interface{}{
"type": "object",
"required": []interface{}{},
"properties": map[string]interface{}{},
},
},
}
secret, err := secretmanager.NewSecret(ctx, "secret", &secretmanager.SecretArgs{
SecretId: pulumi.String("secret"),
Replication: &secretmanager.SecretReplicationArgs{
Auto: &secretmanager.SecretReplicationAutoArgs{},
},
})
if err != nil {
return err
}
secretVersion, err := secretmanager.NewSecretVersion(ctx, "secret_version", &secretmanager.SecretVersionArgs{
Secret: secret.ID().ToIDOutput().ToStringOutput(),
SecretData: pulumi.String("test"),
})
if err != nil {
return err
}
serviceAccount, err := serviceaccount.NewAccount(ctx, "service_account", &serviceaccount.AccountArgs{
AccountId: pulumi.String("sa"),
})
if err != nil {
return err
}
secretAccess, err := secretmanager.NewSecretIamMember(ctx, "secret_access", &secretmanager.SecretIamMemberArgs{
SecretId: secret.ID().ToIDOutput().ToStringOutput(),
Role: pulumi.String("roles/secretmanager.secretAccessor"),
Member: serviceAccount.Member,
})
if err != nil {
return err
}
project, err := organizations.LookupProject(ctx, &organizations.LookupProjectArgs{}, nil)
if err != nil {
return err
}
saIamObjectViewer, err := projects.NewIAMMember(ctx, "sa_iam_object_viewer", &projects.IAMMemberArgs{
Role: pulumi.String("roles/storage.objectViewer"),
Project: pulumi.String(project.Id),
Member: serviceAccount.Member,
})
if err != nil {
return err
}
saIamAiPlatformUser, err := projects.NewIAMMember(ctx, "sa_iam_ai_platform_user", &projects.IAMMemberArgs{
Role: pulumi.String("roles/aiplatform.user"),
Project: pulumi.String(project.Id),
Member: serviceAccount.Member,
})
if err != nil {
return err
}
saIamViewer, err := projects.NewIAMMember(ctx, "sa_iam_viewer", &projects.IAMMemberArgs{
Role: pulumi.String("roles/viewer"),
Project: pulumi.String(project.Id),
Member: serviceAccount.Member,
})
if err != nil {
return err
}
// Ensure we wait enough time for IAM permissions to be propagated
wait5Minutes, err := time.NewSleep(ctx, "wait_5_minutes", &time.SleepArgs{
CreateDuration: pulumi.String("5m"),
}, pulumi.DependsOn([]pulumi.Resource{
saIamAiPlatformUser,
saIamObjectViewer,
saIamViewer,
secretAccess,
secretVersion,
}))
if err != nil {
return err
}
bucket, err := storage.NewBucket(ctx, "bucket", &storage.BucketArgs{
Name: pulumi.String("reasoning-engine"),
Location: pulumi.String("us-central1"),
UniformBucketLevelAccess: pulumi.Bool(true),
ForceDestroy: pulumi.Bool(true),
})
if err != nil {
return err
}
bucketObjRequirementsTxt, err := storage.NewBucketObject(ctx, "bucket_obj_requirements_txt", &storage.BucketObjectArgs{
Name: pulumi.String("requirements.txt"),
Bucket: bucket.ID().ToIDOutput().ToStringOutput(),
Source: pulumi.NewFileAsset("./test-fixtures/requirements_adk.txt"),
})
if err != nil {
return err
}
bucketObjPickle, err := storage.NewBucketObject(ctx, "bucket_obj_pickle", &storage.BucketObjectArgs{
Name: pulumi.String("code.pkl"),
Bucket: bucket.ID().ToIDOutput().ToStringOutput(),
Source: pulumi.NewFileAsset("./test-fixtures/pickle_adk.pkl"),
})
if err != nil {
return err
}
bucketObjDependenciesTarGz, err := storage.NewBucketObject(ctx, "bucket_obj_dependencies_tar_gz", &storage.BucketObjectArgs{
Name: pulumi.String("dependencies.tar.gz"),
Bucket: bucket.ID().ToIDOutput().ToStringOutput(),
Source: pulumi.NewFileAsset("./test-fixtures/dependencies_adk.tar.gz"),
})
if err != nil {
return err
}
tmpJSON0, err := json.Marshal(classMethods)
if err != nil {
return err
}
json0 := string(tmpJSON0)
_, err = vertex.NewAiReasoningEngine(ctx, "reasoning_engine", &vertex.AiReasoningEngineArgs{
DisplayName: pulumi.String("reasoning-engine"),
Description: pulumi.String("A basic reasoning engine"),
Region: pulumi.String("us-central1"),
EncryptionSpec: &vertex.AiReasoningEngineEncryptionSpecArgs{
KmsKeyName: pulumi.String("example-key"),
},
Spec: &vertex.AiReasoningEngineSpecArgs{
AgentFramework: pulumi.String("google-adk"),
ClassMethods: pulumi.String(json0),
ServiceAccount: serviceAccount.Email,
DeploymentSpec: &vertex.AiReasoningEngineSpecDeploymentSpecArgs{
MinInstances: pulumi.Int(1),
MaxInstances: pulumi.Int(3),
ContainerConcurrency: pulumi.Int(5),
ResourceLimits: pulumi.StringMap{
"cpu": pulumi.String("4"),
"memory": pulumi.String("4Gi"),
},
Envs: vertex.AiReasoningEngineSpecDeploymentSpecEnvArray{
&vertex.AiReasoningEngineSpecDeploymentSpecEnvArgs{
Name: pulumi.String("var_1"),
Value: pulumi.String("value_2"),
},
&vertex.AiReasoningEngineSpecDeploymentSpecEnvArgs{
Name: pulumi.String("var_2"),
Value: pulumi.String("value_2"),
},
},
SecretEnvs: vertex.AiReasoningEngineSpecDeploymentSpecSecretEnvArray{
&vertex.AiReasoningEngineSpecDeploymentSpecSecretEnvArgs{
Name: pulumi.String("secret_var_1"),
SecretRef: &vertex.AiReasoningEngineSpecDeploymentSpecSecretEnvSecretRefArgs{
Secret: secret.SecretId,
Version: pulumi.String("latest"),
},
},
&vertex.AiReasoningEngineSpecDeploymentSpecSecretEnvArgs{
Name: pulumi.String("secret_var_2"),
SecretRef: &vertex.AiReasoningEngineSpecDeploymentSpecSecretEnvSecretRefArgs{
Secret: secret.SecretId,
Version: pulumi.String("latest"),
},
},
},
},
PackageSpec: &vertex.AiReasoningEngineSpecPackageSpecArgs{
DependencyFilesGcsUri: pulumi.All(bucket.Url, bucketObjDependenciesTarGz.Name).ApplyT(func(_args []interface{}) (string, error) {
url := _args[0].(string)
name := _args[1].(string)
return fmt.Sprintf("%v/%v", url, name), nil
}).(pulumi.StringOutput),
PickleObjectGcsUri: pulumi.All(bucket.Url, bucketObjPickle.Name).ApplyT(func(_args []interface{}) (string, error) {
url := _args[0].(string)
name := _args[1].(string)
return fmt.Sprintf("%v/%v", url, name), nil
}).(pulumi.StringOutput),
PythonVersion: pulumi.String("3.11"),
RequirementsGcsUri: pulumi.All(bucket.Url, bucketObjRequirementsTxt.Name).ApplyT(func(_args []interface{}) (string, error) {
url := _args[0].(string)
name := _args[1].(string)
return fmt.Sprintf("%v/%v", url, name), nil
}).(pulumi.StringOutput),
},
},
}, pulumi.DependsOn([]pulumi.Resource{
wait5Minutes,
}))
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
time = {
source = "pulumi/time"
}
}
}
data "gcp_organizations_getproject" "project" {
}
resource "gcp_vertex_aireasoningengine" "reasoning_engine" {
depends_on = [time_sleep.wait_5_minutes]
display_name = "reasoning-engine"
description = "A basic reasoning engine"
region = "us-central1"
encryption_spec = {
kms_key_name = "example-key"
}
spec = {
agent_framework = "google-adk"
class_methods = jsonencode(local.classMethods)
service_account = gcp_serviceaccount_account.service_account.email
deployment_spec = {
min_instances = 1
max_instances = 3
container_concurrency = 5
resource_limits = {
"cpu" = "4"
"memory" = "4Gi"
}
envs = [{
"name" = "var_1"
"value" = "value_2"
}, {
"name" = "var_2"
"value" = "value_2"
}]
secret_envs = [{
"name" = "secret_var_1"
"secretRef" = {
"secret" = gcp_secretmanager_secret.secret.secret_id
"version" = "latest"
}
}, {
"name" = "secret_var_2"
"secretRef" = {
"secret" = gcp_secretmanager_secret.secret.secret_id
"version" = "latest"
}
}]
}
package_spec = {
dependency_files_gcs_uri ="${gcp_storage_bucket.bucket.url}/${gcp_storage_bucketobject.bucket_obj_dependencies_tar_gz.name}"
pickle_object_gcs_uri ="${gcp_storage_bucket.bucket.url}/${gcp_storage_bucketobject.bucket_obj_pickle.name}"
python_version = "3.11"
requirements_gcs_uri ="${gcp_storage_bucket.bucket.url}/${gcp_storage_bucketobject.bucket_obj_requirements_txt.name}"
}
}
}
# Ensure we wait enough time for IAM permissions to be propagated
resource "time_sleep" "wait_5_minutes" {
depends_on = [gcp_projects_iammember.sa_iam_ai_platform_user, gcp_projects_iammember.sa_iam_object_viewer, gcp_projects_iammember.sa_iam_viewer, gcp_secretmanager_secretiammember.secret_access, gcp_secretmanager_secretversion.secret_version]
create_duration = "5m"
}
resource "gcp_secretmanager_secretversion" "secret_version" {
secret = gcp_secretmanager_secret.secret.id
secret_data = "test"
}
resource "gcp_secretmanager_secret" "secret" {
secret_id = "secret"
replication = {
auto = {}
}
}
resource "gcp_secretmanager_secretiammember" "secret_access" {
secret_id = gcp_secretmanager_secret.secret.id
role = "roles/secretmanager.secretAccessor"
member = gcp_serviceaccount_account.service_account.member
}
resource "gcp_storage_bucket" "bucket" {
name = "reasoning-engine"
location = "us-central1"
uniform_bucket_level_access = true
force_destroy = true
}
resource "gcp_storage_bucketobject" "bucket_obj_requirements_txt" {
name = "requirements.txt"
bucket = gcp_storage_bucket.bucket.id
source = fileAsset("./test-fixtures/requirements_adk.txt")
}
resource "gcp_storage_bucketobject" "bucket_obj_pickle" {
name = "code.pkl"
bucket = gcp_storage_bucket.bucket.id
source = fileAsset("./test-fixtures/pickle_adk.pkl")
}
resource "gcp_storage_bucketobject" "bucket_obj_dependencies_tar_gz" {
name = "dependencies.tar.gz"
bucket = gcp_storage_bucket.bucket.id
source = fileAsset("./test-fixtures/dependencies_adk.tar.gz")
}
resource "gcp_serviceaccount_account" "service_account" {
account_id = "sa"
}
resource "gcp_projects_iammember" "sa_iam_object_viewer" {
role = "roles/storage.objectViewer"
project = data.gcp_organizations_getproject.project.id
member = gcp_serviceaccount_account.service_account.member
}
resource "gcp_projects_iammember" "sa_iam_ai_platform_user" {
role = "roles/aiplatform.user"
project = data.gcp_organizations_getproject.project.id
member = gcp_serviceaccount_account.service_account.member
}
resource "gcp_projects_iammember" "sa_iam_viewer" {
role = "roles/viewer"
project = data.gcp_organizations_getproject.project.id
member = gcp_serviceaccount_account.service_account.member
}
locals {
classMethods = [{
"apiMode" = "async"
"description" = null
"name" = "async_query"
"parameters" = {
"type" = "object"
"required" = []
"properties" = {}
}
}]
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.secretmanager.Secret;
import com.pulumi.gcp.secretmanager.SecretArgs;
import com.pulumi.gcp.secretmanager.inputs.SecretReplicationArgs;
import com.pulumi.gcp.secretmanager.inputs.SecretReplicationAutoArgs;
import com.pulumi.gcp.secretmanager.SecretVersion;
import com.pulumi.gcp.secretmanager.SecretVersionArgs;
import com.pulumi.gcp.serviceaccount.Account;
import com.pulumi.gcp.serviceaccount.AccountArgs;
import com.pulumi.gcp.secretmanager.SecretIamMember;
import com.pulumi.gcp.secretmanager.SecretIamMemberArgs;
import com.pulumi.gcp.organizations.OrganizationsFunctions;
import com.pulumi.gcp.organizations.inputs.GetProjectArgs;
import com.pulumi.gcp.projects.IAMMember;
import com.pulumi.gcp.projects.IAMMemberArgs;
import com.pulumiverse.time.Sleep;
import com.pulumiverse.time.SleepArgs;
import com.pulumi.gcp.storage.Bucket;
import com.pulumi.gcp.storage.BucketArgs;
import com.pulumi.gcp.storage.BucketObject;
import com.pulumi.gcp.storage.BucketObjectArgs;
import com.pulumi.gcp.vertex.AiReasoningEngine;
import com.pulumi.gcp.vertex.AiReasoningEngineArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineEncryptionSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecDeploymentSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecDeploymentSpecEnvArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecDeploymentSpecSecretEnvArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecDeploymentSpecSecretEnvSecretRefArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecPackageSpecArgs;
import com.pulumi.asset.FileAsset;
import static com.pulumi.codegen.internal.Serialization.*;
import com.pulumi.resources.CustomResourceOptions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
final var classMethods = Arrays.asList(Map.ofEntries(
Map.entry("apiMode", "async"),
Map.entry("description", null),
Map.entry("name", "async_query"),
Map.entry("parameters", Map.ofEntries(
Map.entry("type", "object"),
Map.entry("required", Arrays.asList()),
Map.entry("properties", Map.ofEntries(
))
))
));
var secret = new Secret("secret", SecretArgs.builder()
.secretId("secret")
.replication(SecretReplicationArgs.builder()
.auto(SecretReplicationAutoArgs.builder()
.build())
.build())
.build());
var secretVersion = new SecretVersion("secretVersion", SecretVersionArgs.builder()
.secret(secret.id())
.secretData("test")
.build());
var serviceAccount = new Account("serviceAccount", AccountArgs.builder()
.accountId("sa")
.build());
var secretAccess = new SecretIamMember("secretAccess", SecretIamMemberArgs.builder()
.secretId(secret.id())
.role("roles/secretmanager.secretAccessor")
.member(serviceAccount.member())
.build());
final var project = OrganizationsFunctions.getProject(GetProjectArgs.builder()
.build());
var saIamObjectViewer = new IAMMember("saIamObjectViewer", IAMMemberArgs.builder()
.role("roles/storage.objectViewer")
.project(project.id())
.member(serviceAccount.member())
.build());
var saIamAiPlatformUser = new IAMMember("saIamAiPlatformUser", IAMMemberArgs.builder()
.role("roles/aiplatform.user")
.project(project.id())
.member(serviceAccount.member())
.build());
var saIamViewer = new IAMMember("saIamViewer", IAMMemberArgs.builder()
.role("roles/viewer")
.project(project.id())
.member(serviceAccount.member())
.build());
// Ensure we wait enough time for IAM permissions to be propagated
var wait5Minutes = new Sleep("wait5Minutes", SleepArgs.builder()
.createDuration("5m")
.build(), CustomResourceOptions.builder()
.dependsOn(
saIamAiPlatformUser,
saIamObjectViewer,
saIamViewer,
secretAccess,
secretVersion)
.build());
var bucket = new Bucket("bucket", BucketArgs.builder()
.name("reasoning-engine")
.location("us-central1")
.uniformBucketLevelAccess(true)
.forceDestroy(true)
.build());
var bucketObjRequirementsTxt = new BucketObject("bucketObjRequirementsTxt", BucketObjectArgs.builder()
.name("requirements.txt")
.bucket(bucket.id())
.source(new FileAsset("./test-fixtures/requirements_adk.txt"))
.build());
var bucketObjPickle = new BucketObject("bucketObjPickle", BucketObjectArgs.builder()
.name("code.pkl")
.bucket(bucket.id())
.source(new FileAsset("./test-fixtures/pickle_adk.pkl"))
.build());
var bucketObjDependenciesTarGz = new BucketObject("bucketObjDependenciesTarGz", BucketObjectArgs.builder()
.name("dependencies.tar.gz")
.bucket(bucket.id())
.source(new FileAsset("./test-fixtures/dependencies_adk.tar.gz"))
.build());
var reasoningEngine = new AiReasoningEngine("reasoningEngine", AiReasoningEngineArgs.builder()
.displayName("reasoning-engine")
.description("A basic reasoning engine")
.region("us-central1")
.encryptionSpec(AiReasoningEngineEncryptionSpecArgs.builder()
.kmsKeyName("example-key")
.build())
.spec(AiReasoningEngineSpecArgs.builder()
.agentFramework("google-adk")
.classMethods(serializeJson(
classMethods))
.serviceAccount(serviceAccount.email())
.deploymentSpec(AiReasoningEngineSpecDeploymentSpecArgs.builder()
.minInstances(1)
.maxInstances(3)
.containerConcurrency(5)
.resourceLimits(Map.ofEntries(
Map.entry("cpu", "4"),
Map.entry("memory", "4Gi")
))
.envs(
AiReasoningEngineSpecDeploymentSpecEnvArgs.builder()
.name("var_1")
.value("value_2")
.build(),
AiReasoningEngineSpecDeploymentSpecEnvArgs.builder()
.name("var_2")
.value("value_2")
.build())
.secretEnvs(
AiReasoningEngineSpecDeploymentSpecSecretEnvArgs.builder()
.name("secret_var_1")
.secretRef(AiReasoningEngineSpecDeploymentSpecSecretEnvSecretRefArgs.builder()
.secret(secret.secretId())
.version("latest")
.build())
.build(),
AiReasoningEngineSpecDeploymentSpecSecretEnvArgs.builder()
.name("secret_var_2")
.secretRef(AiReasoningEngineSpecDeploymentSpecSecretEnvSecretRefArgs.builder()
.secret(secret.secretId())
.version("latest")
.build())
.build())
.build())
.packageSpec(AiReasoningEngineSpecPackageSpecArgs.builder()
.dependencyFilesGcsUri(Output.tuple(bucket.url(), bucketObjDependenciesTarGz.name()).applyValue(values -> {
var url = values.t1;
var name = values.t2;
return String.format("%s/%s", url,name);
}))
.pickleObjectGcsUri(Output.tuple(bucket.url(), bucketObjPickle.name()).applyValue(values -> {
var url = values.t1;
var name = values.t2;
return String.format("%s/%s", url,name);
}))
.pythonVersion("3.11")
.requirementsGcsUri(Output.tuple(bucket.url(), bucketObjRequirementsTxt.name()).applyValue(values -> {
var url = values.t1;
var name = values.t2;
return String.format("%s/%s", url,name);
}))
.build())
.build())
.build(), CustomResourceOptions.builder()
.dependsOn(wait5Minutes)
.build());
}
}
resources:
reasoningEngine:
type: gcp:vertex:AiReasoningEngine
name: reasoning_engine
properties:
displayName: reasoning-engine
description: A basic reasoning engine
region: us-central1
encryptionSpec:
kmsKeyName: example-key
spec:
agentFramework: google-adk
classMethods:
fn::toJSON: ${classMethods}
serviceAccount: ${serviceAccount.email}
deploymentSpec:
minInstances: 1
maxInstances: 3
containerConcurrency: 5
resourceLimits:
cpu: '4'
memory: 4Gi
envs:
- name: var_1
value: value_2
- name: var_2
value: value_2
secretEnvs:
- name: secret_var_1
secretRef:
secret: ${secret.secretId}
version: latest
- name: secret_var_2
secretRef:
secret: ${secret.secretId}
version: latest
packageSpec:
dependencyFilesGcsUri: ${bucket.url}/${bucketObjDependenciesTarGz.name}
pickleObjectGcsUri: ${bucket.url}/${bucketObjPickle.name}
pythonVersion: '3.11'
requirementsGcsUri: ${bucket.url}/${bucketObjRequirementsTxt.name}
options:
dependsOn:
- ${wait5Minutes}
# Ensure we wait enough time for IAM permissions to be propagated
wait5Minutes:
type: time:Sleep
name: wait_5_minutes
properties:
createDuration: 5m
options:
dependsOn:
- ${saIamAiPlatformUser}
- ${saIamObjectViewer}
- ${saIamViewer}
- ${secretAccess}
- ${secretVersion}
secretVersion:
type: gcp:secretmanager:SecretVersion
name: secret_version
properties:
secret: ${secret.id}
secretData: test
secret:
type: gcp:secretmanager:Secret
properties:
secretId: secret
replication:
auto: {}
secretAccess:
type: gcp:secretmanager:SecretIamMember
name: secret_access
properties:
secretId: ${secret.id}
role: roles/secretmanager.secretAccessor
member: ${serviceAccount.member}
bucket:
type: gcp:storage:Bucket
properties:
name: reasoning-engine
location: us-central1
uniformBucketLevelAccess: true
forceDestroy: true
bucketObjRequirementsTxt:
type: gcp:storage:BucketObject
name: bucket_obj_requirements_txt
properties:
name: requirements.txt
bucket: ${bucket.id}
source:
fn::fileAsset: ./test-fixtures/requirements_adk.txt
bucketObjPickle:
type: gcp:storage:BucketObject
name: bucket_obj_pickle
properties:
name: code.pkl
bucket: ${bucket.id}
source:
fn::fileAsset: ./test-fixtures/pickle_adk.pkl
bucketObjDependenciesTarGz:
type: gcp:storage:BucketObject
name: bucket_obj_dependencies_tar_gz
properties:
name: dependencies.tar.gz
bucket: ${bucket.id}
source:
fn::fileAsset: ./test-fixtures/dependencies_adk.tar.gz
serviceAccount:
type: gcp:serviceaccount:Account
name: service_account
properties:
accountId: sa
saIamObjectViewer:
type: gcp:projects:IAMMember
name: sa_iam_object_viewer
properties:
role: roles/storage.objectViewer
project: ${project.id}
member: ${serviceAccount.member}
saIamAiPlatformUser:
type: gcp:projects:IAMMember
name: sa_iam_ai_platform_user
properties:
role: roles/aiplatform.user
project: ${project.id}
member: ${serviceAccount.member}
saIamViewer:
type: gcp:projects:IAMMember
name: sa_iam_viewer
properties:
role: roles/viewer
project: ${project.id}
member: ${serviceAccount.member}
variables:
classMethods:
- apiMode: async
description: null
name: async_query
parameters:
type: object
required: []
properties: {}
project:
fn::invoke:
function: gcp:organizations:getProject
arguments: {}
Vertex Ai Reasoning Engine Context Spec
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const project = gcp.organizations.getProject({});
const reasoningEngine = new gcp.vertex.AiReasoningEngine("reasoning_engine", {
displayName: "re-ctx-spec",
description: "Reasoning engine with context spec",
region: "us-central1",
trafficConfig: {
trafficSplitAlwaysLatest: {},
},
contextSpec: {
memoryBankConfig: {
generationConfig: {
model: project.then(project => `projects/${project.projectId}/locations/us-central1/publishers/google/models/gemini-2.5-flash`),
generationTriggerConfig: {
generationRule: {
idleDuration: "300s",
overlapEventCount: 1,
},
},
},
similaritySearchConfig: {
embeddingModel: project.then(project => `projects/${project.projectId}/locations/us-central1/publishers/google/models/text-embedding-005`),
},
disableMemoryRevisions: false,
customizationConfigs: [
{
scopeKeys: ["user_id"],
enableThirdPersonMemories: true,
consolidationConfig: {
revisionsPerCandidateCount: 1,
},
memoryTopics: [{
managedMemoryTopic: {
managedTopicEnum: "USER_PREFERENCES",
},
}],
generateMemoriesExamples: [{
conversationSource: {
events: [{
content: {
role: "user",
parts: [
{
text: "I like pepperoni pizza",
},
{
functionCall: {
id: "fn-call-1",
name: "order_pizza",
args: JSON.stringify({
type: "pepperoni",
}),
},
},
{
functionResponse: {
id: "fn-resp-1",
name: "order_pizza",
response: JSON.stringify({
status: "ordered",
}),
},
},
{
executableCode: {
id: "exec-code-1",
language: "PYTHON",
code: "print('pizza')",
},
},
{
codeExecutionResult: {
id: "exec-result-1",
outcome: "OUTCOME_OK",
output: "pizza",
},
},
],
},
}],
},
generatedMemories: [{
fact: "User likes pepperoni pizza.",
topics: [{
managedMemoryTopic: "USER_PREFERENCES",
}],
}],
}],
},
{
scopeKeys: [
"user_id",
"session_id",
],
enableThirdPersonMemories: true,
memoryTopics: [{
customMemoryTopic: {
label: "session_scratchpad",
description: "Active consideration details, recent queries, and temporary workflow state.",
},
}],
},
],
structuredMemoryConfigs: [
{
scopeKeys: ["user_id"],
schemaConfigs: [{
id: "user-profile",
memorySchema: JSON.stringify({
type: "OBJECT",
properties: {
name: {
type: "STRING",
description: "Name of the user.",
},
technical_stack: {
type: "STRING",
description: "Comma-separated list tools or languages used by the user.",
},
primary_goal: {
type: "STRING",
description: "The main objective the user is pursuing.",
},
expertise_level: {
type: "STRING",
description: "Current skill level (e.g., Junior, Senior).",
},
job_status: {
type: "STRING",
description: "The job status of the individual",
"enum": [
"unemployed",
"part_time",
"full_time",
"student",
],
},
},
}),
}],
},
{
scopeKeys: [
"user_id",
"session_id",
],
schemaConfigs: [{
id: "conversation-summary",
memorySchema: JSON.stringify({
type: "OBJECT",
properties: {
main_topic: {
type: "STRING",
description: "The primary topic of this specific chat session.",
},
status: {
type: "STRING",
description: "Current resolution state of the discussion.",
"enum": [
"open",
"in_progress",
"resolved",
],
},
},
}),
}],
},
],
ttlConfig: {
defaultTtl: "86400s",
},
},
},
});
import pulumi
import json
import pulumi_gcp as gcp
project = gcp.organizations.get_project()
reasoning_engine = gcp.vertex.AiReasoningEngine("reasoning_engine",
display_name="re-ctx-spec",
description="Reasoning engine with context spec",
region="us-central1",
traffic_config={
"traffic_split_always_latest": {},
},
context_spec={
"memory_bank_config": {
"generation_config": {
"model": f"projects/{project.project_id}/locations/us-central1/publishers/google/models/gemini-2.5-flash",
"generation_trigger_config": {
"generation_rule": {
"idle_duration": "300s",
"overlap_event_count": 1,
},
},
},
"similarity_search_config": {
"embedding_model": f"projects/{project.project_id}/locations/us-central1/publishers/google/models/text-embedding-005",
},
"disable_memory_revisions": False,
"customization_configs": [
{
"scope_keys": ["user_id"],
"enable_third_person_memories": True,
"consolidation_config": {
"revisions_per_candidate_count": 1,
},
"memory_topics": [{
"managed_memory_topic": {
"managed_topic_enum": "USER_PREFERENCES",
},
}],
"generate_memories_examples": [{
"conversation_source": {
"events": [{
"content": {
"role": "user",
"parts": [
{
"text": "I like pepperoni pizza",
},
{
"function_call": {
"id": "fn-call-1",
"name": "order_pizza",
"args": json.dumps({
"type": "pepperoni",
}),
},
},
{
"function_response": {
"id": "fn-resp-1",
"name": "order_pizza",
"response": json.dumps({
"status": "ordered",
}),
},
},
{
"executable_code": {
"id": "exec-code-1",
"language": "PYTHON",
"code": "print('pizza')",
},
},
{
"code_execution_result": {
"id": "exec-result-1",
"outcome": "OUTCOME_OK",
"output": "pizza",
},
},
],
},
}],
},
"generated_memories": [{
"fact": "User likes pepperoni pizza.",
"topics": [{
"managed_memory_topic": "USER_PREFERENCES",
}],
}],
}],
},
{
"scope_keys": [
"user_id",
"session_id",
],
"enable_third_person_memories": True,
"memory_topics": [{
"custom_memory_topic": {
"label": "session_scratchpad",
"description": "Active consideration details, recent queries, and temporary workflow state.",
},
}],
},
],
"structured_memory_configs": [
{
"scope_keys": ["user_id"],
"schema_configs": [{
"id": "user-profile",
"memory_schema": json.dumps({
"type": "OBJECT",
"properties": {
"name": {
"type": "STRING",
"description": "Name of the user.",
},
"technical_stack": {
"type": "STRING",
"description": "Comma-separated list tools or languages used by the user.",
},
"primary_goal": {
"type": "STRING",
"description": "The main objective the user is pursuing.",
},
"expertise_level": {
"type": "STRING",
"description": "Current skill level (e.g., Junior, Senior).",
},
"job_status": {
"type": "STRING",
"description": "The job status of the individual",
"enum": [
"unemployed",
"part_time",
"full_time",
"student",
],
},
},
}),
}],
},
{
"scope_keys": [
"user_id",
"session_id",
],
"schema_configs": [{
"id": "conversation-summary",
"memory_schema": json.dumps({
"type": "OBJECT",
"properties": {
"main_topic": {
"type": "STRING",
"description": "The primary topic of this specific chat session.",
},
"status": {
"type": "STRING",
"description": "Current resolution state of the discussion.",
"enum": [
"open",
"in_progress",
"resolved",
],
},
},
}),
}],
},
],
"ttl_config": {
"default_ttl": "86400s",
},
},
})
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var project = Gcp.Organizations.GetProject.Invoke();
var reasoningEngine = new Gcp.Vertex.AiReasoningEngine("reasoning_engine", new()
{
DisplayName = "re-ctx-spec",
Description = "Reasoning engine with context spec",
Region = "us-central1",
TrafficConfig = new Gcp.Vertex.Inputs.AiReasoningEngineTrafficConfigArgs
{
TrafficSplitAlwaysLatest = null,
},
ContextSpec = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecArgs
{
MemoryBankConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigArgs
{
GenerationConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigArgs
{
Model = $"projects/{project.Apply(getProjectResult => getProjectResult.ProjectId)}/locations/us-central1/publishers/google/models/gemini-2.5-flash",
GenerationTriggerConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigGenerationTriggerConfigArgs
{
GenerationRule = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigGenerationTriggerConfigGenerationRuleArgs
{
IdleDuration = "300s",
OverlapEventCount = 1,
},
},
},
SimilaritySearchConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfigArgs
{
EmbeddingModel = $"projects/{project.Apply(getProjectResult => getProjectResult.ProjectId)}/locations/us-central1/publishers/google/models/text-embedding-005",
},
DisableMemoryRevisions = false,
CustomizationConfigs = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigArgs
{
ScopeKeys = new[]
{
"user_id",
},
EnableThirdPersonMemories = true,
ConsolidationConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigConsolidationConfigArgs
{
RevisionsPerCandidateCount = 1,
},
MemoryTopics = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicArgs
{
ManagedMemoryTopic = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicManagedMemoryTopicArgs
{
ManagedTopicEnum = "USER_PREFERENCES",
},
},
},
GenerateMemoriesExamples = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleArgs
{
ConversationSource = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceArgs
{
Events = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventArgs
{
Content = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentArgs
{
Role = "user",
Parts = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs
{
Text = "I like pepperoni pizza",
},
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs
{
FunctionCall = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartFunctionCallArgs
{
Id = "fn-call-1",
Name = "order_pizza",
Args = JsonSerializer.Serialize(new Dictionary<string, object?>
{
["type"] = "pepperoni",
}),
},
},
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs
{
FunctionResponse = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartFunctionResponseArgs
{
Id = "fn-resp-1",
Name = "order_pizza",
Response = JsonSerializer.Serialize(new Dictionary<string, object?>
{
["status"] = "ordered",
}),
},
},
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs
{
ExecutableCode = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartExecutableCodeArgs
{
Id = "exec-code-1",
Language = "PYTHON",
Code = "print('pizza')",
},
},
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs
{
CodeExecutionResult = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartCodeExecutionResultArgs
{
Id = "exec-result-1",
Outcome = "OUTCOME_OK",
Output = "pizza",
},
},
},
},
},
},
},
GeneratedMemories = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleGeneratedMemoryArgs
{
Fact = "User likes pepperoni pizza.",
Topics = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleGeneratedMemoryTopicArgs
{
ManagedMemoryTopic = "USER_PREFERENCES",
},
},
},
},
},
},
},
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigArgs
{
ScopeKeys = new[]
{
"user_id",
"session_id",
},
EnableThirdPersonMemories = true,
MemoryTopics = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicArgs
{
CustomMemoryTopic = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicCustomMemoryTopicArgs
{
Label = "session_scratchpad",
Description = "Active consideration details, recent queries, and temporary workflow state.",
},
},
},
},
},
StructuredMemoryConfigs = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigArgs
{
ScopeKeys = new[]
{
"user_id",
},
SchemaConfigs = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigSchemaConfigArgs
{
Id = "user-profile",
MemorySchema = JsonSerializer.Serialize(new Dictionary<string, object?>
{
["type"] = "OBJECT",
["properties"] = new Dictionary<string, object?>
{
["name"] = new Dictionary<string, object?>
{
["type"] = "STRING",
["description"] = "Name of the user.",
},
["technical_stack"] = new Dictionary<string, object?>
{
["type"] = "STRING",
["description"] = "Comma-separated list tools or languages used by the user.",
},
["primary_goal"] = new Dictionary<string, object?>
{
["type"] = "STRING",
["description"] = "The main objective the user is pursuing.",
},
["expertise_level"] = new Dictionary<string, object?>
{
["type"] = "STRING",
["description"] = "Current skill level (e.g., Junior, Senior).",
},
["job_status"] = new Dictionary<string, object?>
{
["type"] = "STRING",
["description"] = "The job status of the individual",
["enum"] = new[]
{
"unemployed",
"part_time",
"full_time",
"student",
},
},
},
}),
},
},
},
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigArgs
{
ScopeKeys = new[]
{
"user_id",
"session_id",
},
SchemaConfigs = new[]
{
new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigSchemaConfigArgs
{
Id = "conversation-summary",
MemorySchema = JsonSerializer.Serialize(new Dictionary<string, object?>
{
["type"] = "OBJECT",
["properties"] = new Dictionary<string, object?>
{
["main_topic"] = new Dictionary<string, object?>
{
["type"] = "STRING",
["description"] = "The primary topic of this specific chat session.",
},
["status"] = new Dictionary<string, object?>
{
["type"] = "STRING",
["description"] = "Current resolution state of the discussion.",
["enum"] = new[]
{
"open",
"in_progress",
"resolved",
},
},
},
}),
},
},
},
},
TtlConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigTtlConfigArgs
{
DefaultTtl = "86400s",
},
},
},
});
});
package main
import (
"encoding/json"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/organizations"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/vertex"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
project, err := organizations.LookupProject(ctx, &organizations.LookupProjectArgs{}, nil)
if err != nil {
return err
}
tmpJSON0, err := json.Marshal(map[string]string{
"type": "pepperoni",
})
if err != nil {
return err
}
json0 := string(tmpJSON0)
tmpJSON1, err := json.Marshal(map[string]string{
"status": "ordered",
})
if err != nil {
return err
}
json1 := string(tmpJSON1)
tmpJSON2, err := json.Marshal(map[string]interface{}{
"type": "OBJECT",
"properties": map[string]interface{}{
"name": map[string]string{
"type": "STRING",
"description": "Name of the user.",
},
"technical_stack": map[string]string{
"type": "STRING",
"description": "Comma-separated list tools or languages used by the user.",
},
"primary_goal": map[string]string{
"type": "STRING",
"description": "The main objective the user is pursuing.",
},
"expertise_level": map[string]string{
"type": "STRING",
"description": "Current skill level (e.g., Junior, Senior).",
},
"job_status": map[string]interface{}{
"type": "STRING",
"description": "The job status of the individual",
"enum": []string{
"unemployed",
"part_time",
"full_time",
"student",
},
},
},
})
if err != nil {
return err
}
json2 := string(tmpJSON2)
tmpJSON3, err := json.Marshal(map[string]interface{}{
"type": "OBJECT",
"properties": map[string]interface{}{
"main_topic": map[string]string{
"type": "STRING",
"description": "The primary topic of this specific chat session.",
},
"status": map[string]interface{}{
"type": "STRING",
"description": "Current resolution state of the discussion.",
"enum": []string{
"open",
"in_progress",
"resolved",
},
},
},
})
if err != nil {
return err
}
json3 := string(tmpJSON3)
_, err = vertex.NewAiReasoningEngine(ctx, "reasoning_engine", &vertex.AiReasoningEngineArgs{
DisplayName: pulumi.String("re-ctx-spec"),
Description: pulumi.String("Reasoning engine with context spec"),
Region: pulumi.String("us-central1"),
TrafficConfig: &vertex.AiReasoningEngineTrafficConfigArgs{
TrafficSplitAlwaysLatest: &vertex.AiReasoningEngineTrafficConfigTrafficSplitAlwaysLatestArgs{},
},
ContextSpec: &vertex.AiReasoningEngineContextSpecArgs{
MemoryBankConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigArgs{
GenerationConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigArgs{
Model: pulumi.Sprintf("projects/%v/locations/us-central1/publishers/google/models/gemini-2.5-flash", project.ProjectId),
GenerationTriggerConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigGenerationTriggerConfigArgs{
GenerationRule: &vertex.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigGenerationTriggerConfigGenerationRuleArgs{
IdleDuration: pulumi.String("300s"),
OverlapEventCount: pulumi.Int(1),
},
},
},
SimilaritySearchConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfigArgs{
EmbeddingModel: pulumi.Sprintf("projects/%v/locations/us-central1/publishers/google/models/text-embedding-005", project.ProjectId),
},
DisableMemoryRevisions: pulumi.Bool(false),
CustomizationConfigs: vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigArgs{
ScopeKeys: pulumi.StringArray{
pulumi.String("user_id"),
},
EnableThirdPersonMemories: pulumi.Bool(true),
ConsolidationConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigConsolidationConfigArgs{
RevisionsPerCandidateCount: pulumi.Int(1),
},
MemoryTopics: vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicArgs{
ManagedMemoryTopic: &vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicManagedMemoryTopicArgs{
ManagedTopicEnum: pulumi.String("USER_PREFERENCES"),
},
},
},
GenerateMemoriesExamples: vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleArgs{
ConversationSource: &vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceArgs{
Events: vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventArgs{
Content: &vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentArgs{
Role: pulumi.String("user"),
Parts: vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs{
Text: pulumi.String("I like pepperoni pizza"),
},
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs{
FunctionCall: &vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartFunctionCallArgs{
Id: pulumi.String("fn-call-1"),
Name: pulumi.String("order_pizza"),
Args: pulumi.String(json0),
},
},
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs{
FunctionResponse: &vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartFunctionResponseArgs{
Id: pulumi.String("fn-resp-1"),
Name: pulumi.String("order_pizza"),
Response: pulumi.String(json1),
},
},
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs{
ExecutableCode: &vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartExecutableCodeArgs{
Id: pulumi.String("exec-code-1"),
Language: pulumi.String("PYTHON"),
Code: pulumi.String("print('pizza')"),
},
},
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs{
CodeExecutionResult: &vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartCodeExecutionResultArgs{
Id: pulumi.String("exec-result-1"),
Outcome: pulumi.String("OUTCOME_OK"),
Output: pulumi.String("pizza"),
},
},
},
},
},
},
},
GeneratedMemories: vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleGeneratedMemoryArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleGeneratedMemoryArgs{
Fact: pulumi.String("User likes pepperoni pizza."),
Topics: vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleGeneratedMemoryTopicArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleGeneratedMemoryTopicArgs{
ManagedMemoryTopic: pulumi.String("USER_PREFERENCES"),
},
},
},
},
},
},
},
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigArgs{
ScopeKeys: pulumi.StringArray{
pulumi.String("user_id"),
pulumi.String("session_id"),
},
EnableThirdPersonMemories: pulumi.Bool(true),
MemoryTopics: vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicArgs{
CustomMemoryTopic: &vertex.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicCustomMemoryTopicArgs{
Label: pulumi.String("session_scratchpad"),
Description: pulumi.String("Active consideration details, recent queries, and temporary workflow state."),
},
},
},
},
},
StructuredMemoryConfigs: vertex.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigArgs{
ScopeKeys: pulumi.StringArray{
pulumi.String("user_id"),
},
SchemaConfigs: vertex.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigSchemaConfigArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigSchemaConfigArgs{
Id: pulumi.String("user-profile"),
MemorySchema: pulumi.String(json2),
},
},
},
&vertex.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigArgs{
ScopeKeys: pulumi.StringArray{
pulumi.String("user_id"),
pulumi.String("session_id"),
},
SchemaConfigs: vertex.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigSchemaConfigArray{
&vertex.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigSchemaConfigArgs{
Id: pulumi.String("conversation-summary"),
MemorySchema: pulumi.String(json3),
},
},
},
},
TtlConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigTtlConfigArgs{
DefaultTtl: pulumi.String("86400s"),
},
},
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
data "gcp_organizations_getproject" "project" {
}
resource "gcp_vertex_aireasoningengine" "reasoning_engine" {
display_name = "re-ctx-spec"
description = "Reasoning engine with context spec"
region = "us-central1"
traffic_config = {
traffic_split_always_latest = {}
}
context_spec = {
memory_bank_config = {
generation_config = {
model ="projects/${data.gcp_organizations_getproject.project.project_id}/locations/us-central1/publishers/google/models/gemini-2.5-flash"
generation_trigger_config = {
generation_rule = {
idle_duration = "300s"
overlap_event_count = 1
}
}
}
similarity_search_config = {
embedding_model ="projects/${data.gcp_organizations_getproject.project.project_id}/locations/us-central1/publishers/google/models/text-embedding-005"
}
disable_memory_revisions = false
customization_configs = [{
"scopeKeys" = ["user_id"]
"enableThirdPersonMemories" = true
"consolidationConfig" = {
"revisionsPerCandidateCount" = 1
}
"memoryTopics" = [{
"managedMemoryTopic" = {
"managedTopicEnum" = "USER_PREFERENCES"
}
}]
"generateMemoriesExamples" = [{
"conversationSource" = {
"events" = [{
"content" = {
"role" = "user"
"parts" = [{
"text" = "I like pepperoni pizza"
}, {
"functionCall" = {
"id" = "fn-call-1"
"name" = "order_pizza"
"args" = jsonencode({
"type" = "pepperoni"
})
}
}, {
"functionResponse" = {
"id" = "fn-resp-1"
"name" = "order_pizza"
"response" = jsonencode({
"status" = "ordered"
})
}
}, {
"executableCode" = {
"id" = "exec-code-1"
"language" = "PYTHON"
"code" = "print('pizza')"
}
}, {
"codeExecutionResult" = {
"id" = "exec-result-1"
"outcome" = "OUTCOME_OK"
"output" = "pizza"
}
}]
}
}]
}
"generatedMemories" = [{
"fact" = "User likes pepperoni pizza."
"topics" = [{
"managedMemoryTopic" = "USER_PREFERENCES"
}]
}]
}]
}, {
"scopeKeys" = ["user_id", "session_id"]
"enableThirdPersonMemories" = true
"memoryTopics" = [{
"customMemoryTopic" = {
"label" = "session_scratchpad"
"description" = "Active consideration details, recent queries, and temporary workflow state."
}
}]
}]
structured_memory_configs = [{
"scopeKeys" = ["user_id"]
"schemaConfigs" = [{
"id" = "user-profile"
"memorySchema" = jsonencode({
"type" = "OBJECT"
"properties" = {
"name" = {
"type" = "STRING"
"description" = "Name of the user."
}
"technical_stack" = {
"type" = "STRING"
"description" = "Comma-separated list tools or languages used by the user."
}
"primary_goal" = {
"type" = "STRING"
"description" = "The main objective the user is pursuing."
}
"expertise_level" = {
"type" = "STRING"
"description" = "Current skill level (e.g., Junior, Senior)."
}
"job_status" = {
"type" = "STRING"
"description" = "The job status of the individual"
"enum" = ["unemployed", "part_time", "full_time", "student"]
}
}
})
}]
}, {
"scopeKeys" = ["user_id", "session_id"]
"schemaConfigs" = [{
"id" = "conversation-summary"
"memorySchema" = jsonencode({
"type" = "OBJECT"
"properties" = {
"main_topic" = {
"type" = "STRING"
"description" = "The primary topic of this specific chat session."
}
"status" = {
"type" = "STRING"
"description" = "Current resolution state of the discussion."
"enum" = ["open", "in_progress", "resolved"]
}
}
})
}]
}]
ttl_config = {
default_ttl = "86400s"
}
}
}
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.organizations.OrganizationsFunctions;
import com.pulumi.gcp.organizations.inputs.GetProjectArgs;
import com.pulumi.gcp.vertex.AiReasoningEngine;
import com.pulumi.gcp.vertex.AiReasoningEngineArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineTrafficConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineTrafficConfigTrafficSplitAlwaysLatestArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigGenerationTriggerConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigGenerationTriggerConfigGenerationRuleArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigConsolidationConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicManagedMemoryTopicArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartFunctionCallArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartFunctionResponseArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartExecutableCodeArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartCodeExecutionResultArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleGeneratedMemoryArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleGeneratedMemoryTopicArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicCustomMemoryTopicArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigSchemaConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigTtlConfigArgs;
import static com.pulumi.codegen.internal.Serialization.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
final var project = OrganizationsFunctions.getProject(GetProjectArgs.builder()
.build());
var reasoningEngine = new AiReasoningEngine("reasoningEngine", AiReasoningEngineArgs.builder()
.displayName("re-ctx-spec")
.description("Reasoning engine with context spec")
.region("us-central1")
.trafficConfig(AiReasoningEngineTrafficConfigArgs.builder()
.trafficSplitAlwaysLatest(AiReasoningEngineTrafficConfigTrafficSplitAlwaysLatestArgs.builder()
.build())
.build())
.contextSpec(AiReasoningEngineContextSpecArgs.builder()
.memoryBankConfig(AiReasoningEngineContextSpecMemoryBankConfigArgs.builder()
.generationConfig(AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigArgs.builder()
.model(String.format("projects/%s/locations/us-central1/publishers/google/models/gemini-2.5-flash", project.projectId()))
.generationTriggerConfig(AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigGenerationTriggerConfigArgs.builder()
.generationRule(AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigGenerationTriggerConfigGenerationRuleArgs.builder()
.idleDuration("300s")
.overlapEventCount(1)
.build())
.build())
.build())
.similaritySearchConfig(AiReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfigArgs.builder()
.embeddingModel(String.format("projects/%s/locations/us-central1/publishers/google/models/text-embedding-005", project.projectId()))
.build())
.disableMemoryRevisions(false)
.customizationConfigs(
AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigArgs.builder()
.scopeKeys("user_id")
.enableThirdPersonMemories(true)
.consolidationConfig(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigConsolidationConfigArgs.builder()
.revisionsPerCandidateCount(1)
.build())
.memoryTopics(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicArgs.builder()
.managedMemoryTopic(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicManagedMemoryTopicArgs.builder()
.managedTopicEnum("USER_PREFERENCES")
.build())
.build())
.generateMemoriesExamples(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleArgs.builder()
.conversationSource(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceArgs.builder()
.events(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventArgs.builder()
.content(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentArgs.builder()
.role("user")
.parts(
AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs.builder()
.text("I like pepperoni pizza")
.build(),
AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs.builder()
.functionCall(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartFunctionCallArgs.builder()
.id("fn-call-1")
.name("order_pizza")
.args(serializeJson(
jsonObject(
jsonProperty("type", "pepperoni")
)))
.build())
.build(),
AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs.builder()
.functionResponse(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartFunctionResponseArgs.builder()
.id("fn-resp-1")
.name("order_pizza")
.response(serializeJson(
jsonObject(
jsonProperty("status", "ordered")
)))
.build())
.build(),
AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs.builder()
.executableCode(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartExecutableCodeArgs.builder()
.id("exec-code-1")
.language("PYTHON")
.code("print('pizza')")
.build())
.build(),
AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartArgs.builder()
.codeExecutionResult(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleConversationSourceEventContentPartCodeExecutionResultArgs.builder()
.id("exec-result-1")
.outcome("OUTCOME_OK")
.output("pizza")
.build())
.build())
.build())
.build())
.build())
.generatedMemories(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleGeneratedMemoryArgs.builder()
.fact("User likes pepperoni pizza.")
.topics(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigGenerateMemoriesExampleGeneratedMemoryTopicArgs.builder()
.managedMemoryTopic("USER_PREFERENCES")
.build())
.build())
.build())
.build(),
AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigArgs.builder()
.scopeKeys(
"user_id",
"session_id")
.enableThirdPersonMemories(true)
.memoryTopics(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicArgs.builder()
.customMemoryTopic(AiReasoningEngineContextSpecMemoryBankConfigCustomizationConfigMemoryTopicCustomMemoryTopicArgs.builder()
.label("session_scratchpad")
.description("Active consideration details, recent queries, and temporary workflow state.")
.build())
.build())
.build())
.structuredMemoryConfigs(
AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigArgs.builder()
.scopeKeys("user_id")
.schemaConfigs(AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigSchemaConfigArgs.builder()
.id("user-profile")
.memorySchema(serializeJson(
jsonObject(
jsonProperty("type", "OBJECT"),
jsonProperty("properties", jsonObject(
jsonProperty("name", jsonObject(
jsonProperty("type", "STRING"),
jsonProperty("description", "Name of the user.")
)),
jsonProperty("technical_stack", jsonObject(
jsonProperty("type", "STRING"),
jsonProperty("description", "Comma-separated list tools or languages used by the user.")
)),
jsonProperty("primary_goal", jsonObject(
jsonProperty("type", "STRING"),
jsonProperty("description", "The main objective the user is pursuing.")
)),
jsonProperty("expertise_level", jsonObject(
jsonProperty("type", "STRING"),
jsonProperty("description", "Current skill level (e.g., Junior, Senior).")
)),
jsonProperty("job_status", jsonObject(
jsonProperty("type", "STRING"),
jsonProperty("description", "The job status of the individual"),
jsonProperty("enum", jsonArray(
"unemployed",
"part_time",
"full_time",
"student"
))
))
))
)))
.build())
.build(),
AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigArgs.builder()
.scopeKeys(
"user_id",
"session_id")
.schemaConfigs(AiReasoningEngineContextSpecMemoryBankConfigStructuredMemoryConfigSchemaConfigArgs.builder()
.id("conversation-summary")
.memorySchema(serializeJson(
jsonObject(
jsonProperty("type", "OBJECT"),
jsonProperty("properties", jsonObject(
jsonProperty("main_topic", jsonObject(
jsonProperty("type", "STRING"),
jsonProperty("description", "The primary topic of this specific chat session.")
)),
jsonProperty("status", jsonObject(
jsonProperty("type", "STRING"),
jsonProperty("description", "Current resolution state of the discussion."),
jsonProperty("enum", jsonArray(
"open",
"in_progress",
"resolved"
))
))
))
)))
.build())
.build())
.ttlConfig(AiReasoningEngineContextSpecMemoryBankConfigTtlConfigArgs.builder()
.defaultTtl("86400s")
.build())
.build())
.build())
.build());
}
}
resources:
reasoningEngine:
type: gcp:vertex:AiReasoningEngine
name: reasoning_engine
properties:
displayName: re-ctx-spec
description: Reasoning engine with context spec
region: us-central1
trafficConfig:
trafficSplitAlwaysLatest: {}
contextSpec:
memoryBankConfig:
generationConfig:
model: projects/${project.projectId}/locations/us-central1/publishers/google/models/gemini-2.5-flash
generationTriggerConfig:
generationRule:
idleDuration: 300s
overlapEventCount: 1
similaritySearchConfig:
embeddingModel: projects/${project.projectId}/locations/us-central1/publishers/google/models/text-embedding-005
disableMemoryRevisions: false
customizationConfigs:
- scopeKeys:
- user_id
enableThirdPersonMemories: true
consolidationConfig:
revisionsPerCandidateCount: 1
memoryTopics:
- managedMemoryTopic:
managedTopicEnum: USER_PREFERENCES
generateMemoriesExamples:
- conversationSource:
events:
- content:
role: user
parts:
- text: I like pepperoni pizza
- functionCall:
id: fn-call-1
name: order_pizza
args:
fn::toJSON:
type: pepperoni
- functionResponse:
id: fn-resp-1
name: order_pizza
response:
fn::toJSON:
status: ordered
- executableCode:
id: exec-code-1
language: PYTHON
code: print('pizza')
- codeExecutionResult:
id: exec-result-1
outcome: OUTCOME_OK
output: pizza
generatedMemories:
- fact: User likes pepperoni pizza.
topics:
- managedMemoryTopic: USER_PREFERENCES
- scopeKeys:
- user_id
- session_id
enableThirdPersonMemories: true
memoryTopics:
- customMemoryTopic:
label: session_scratchpad
description: Active consideration details, recent queries, and temporary workflow state.
structuredMemoryConfigs:
- scopeKeys:
- user_id
schemaConfigs:
- id: user-profile
memorySchema:
fn::toJSON:
type: OBJECT
properties:
name:
type: STRING
description: Name of the user.
technical_stack:
type: STRING
description: Comma-separated list tools or languages used by the user.
primary_goal:
type: STRING
description: The main objective the user is pursuing.
expertise_level:
type: STRING
description: Current skill level (e.g., Junior, Senior).
job_status:
type: STRING
description: The job status of the individual
enum:
- unemployed
- part_time
- full_time
- student
- scopeKeys:
- user_id
- session_id
schemaConfigs:
- id: conversation-summary
memorySchema:
fn::toJSON:
type: OBJECT
properties:
main_topic:
type: STRING
description: The primary topic of this specific chat session.
status:
type: STRING
description: Current resolution state of the discussion.
enum:
- open
- in_progress
- resolved
ttlConfig:
defaultTtl: 86400s
variables:
project:
fn::invoke:
function: gcp:organizations:getProject
arguments: {}
Vertex Ai Reasoning Engine Granular Ttl
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const project = gcp.organizations.getProject({});
const reasoningEngine = new gcp.vertex.AiReasoningEngine("reasoning_engine", {
displayName: "re-gran-ttl",
description: "Reasoning engine with granular ttl",
region: "us-central1",
contextSpec: {
memoryBankConfig: {
generationConfig: {
model: project.then(project => `projects/${project.projectId}/locations/us-central1/publishers/google/models/gemini-2.5-flash`),
},
similaritySearchConfig: {
embeddingModel: project.then(project => `projects/${project.projectId}/locations/us-central1/publishers/google/models/text-embedding-005`),
},
disableMemoryRevisions: false,
ttlConfig: {
memoryRevisionDefaultTtl: "86400s",
granularTtlConfig: {
createTtl: "86400s",
generateCreatedTtl: "86400s",
generateUpdatedTtl: "86400s",
},
},
},
},
});
import pulumi
import pulumi_gcp as gcp
project = gcp.organizations.get_project()
reasoning_engine = gcp.vertex.AiReasoningEngine("reasoning_engine",
display_name="re-gran-ttl",
description="Reasoning engine with granular ttl",
region="us-central1",
context_spec={
"memory_bank_config": {
"generation_config": {
"model": f"projects/{project.project_id}/locations/us-central1/publishers/google/models/gemini-2.5-flash",
},
"similarity_search_config": {
"embedding_model": f"projects/{project.project_id}/locations/us-central1/publishers/google/models/text-embedding-005",
},
"disable_memory_revisions": False,
"ttl_config": {
"memory_revision_default_ttl": "86400s",
"granular_ttl_config": {
"create_ttl": "86400s",
"generate_created_ttl": "86400s",
"generate_updated_ttl": "86400s",
},
},
},
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var project = Gcp.Organizations.GetProject.Invoke();
var reasoningEngine = new Gcp.Vertex.AiReasoningEngine("reasoning_engine", new()
{
DisplayName = "re-gran-ttl",
Description = "Reasoning engine with granular ttl",
Region = "us-central1",
ContextSpec = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecArgs
{
MemoryBankConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigArgs
{
GenerationConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigArgs
{
Model = $"projects/{project.Apply(getProjectResult => getProjectResult.ProjectId)}/locations/us-central1/publishers/google/models/gemini-2.5-flash",
},
SimilaritySearchConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfigArgs
{
EmbeddingModel = $"projects/{project.Apply(getProjectResult => getProjectResult.ProjectId)}/locations/us-central1/publishers/google/models/text-embedding-005",
},
DisableMemoryRevisions = false,
TtlConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigTtlConfigArgs
{
MemoryRevisionDefaultTtl = "86400s",
GranularTtlConfig = new Gcp.Vertex.Inputs.AiReasoningEngineContextSpecMemoryBankConfigTtlConfigGranularTtlConfigArgs
{
CreateTtl = "86400s",
GenerateCreatedTtl = "86400s",
GenerateUpdatedTtl = "86400s",
},
},
},
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/organizations"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/vertex"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
project, err := organizations.LookupProject(ctx, &organizations.LookupProjectArgs{}, nil)
if err != nil {
return err
}
_, err = vertex.NewAiReasoningEngine(ctx, "reasoning_engine", &vertex.AiReasoningEngineArgs{
DisplayName: pulumi.String("re-gran-ttl"),
Description: pulumi.String("Reasoning engine with granular ttl"),
Region: pulumi.String("us-central1"),
ContextSpec: &vertex.AiReasoningEngineContextSpecArgs{
MemoryBankConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigArgs{
GenerationConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigArgs{
Model: pulumi.Sprintf("projects/%v/locations/us-central1/publishers/google/models/gemini-2.5-flash", project.ProjectId),
},
SimilaritySearchConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfigArgs{
EmbeddingModel: pulumi.Sprintf("projects/%v/locations/us-central1/publishers/google/models/text-embedding-005", project.ProjectId),
},
DisableMemoryRevisions: pulumi.Bool(false),
TtlConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigTtlConfigArgs{
MemoryRevisionDefaultTtl: pulumi.String("86400s"),
GranularTtlConfig: &vertex.AiReasoningEngineContextSpecMemoryBankConfigTtlConfigGranularTtlConfigArgs{
CreateTtl: pulumi.String("86400s"),
GenerateCreatedTtl: pulumi.String("86400s"),
GenerateUpdatedTtl: pulumi.String("86400s"),
},
},
},
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
data "gcp_organizations_getproject" "project" {
}
resource "gcp_vertex_aireasoningengine" "reasoning_engine" {
display_name = "re-gran-ttl"
description = "Reasoning engine with granular ttl"
region = "us-central1"
context_spec = {
memory_bank_config = {
generation_config = {
model ="projects/${data.gcp_organizations_getproject.project.project_id}/locations/us-central1/publishers/google/models/gemini-2.5-flash"
}
similarity_search_config = {
embedding_model ="projects/${data.gcp_organizations_getproject.project.project_id}/locations/us-central1/publishers/google/models/text-embedding-005"
}
disable_memory_revisions = false
ttl_config = {
memory_revision_default_ttl = "86400s"
granular_ttl_config = {
create_ttl = "86400s"
generate_created_ttl = "86400s"
generate_updated_ttl = "86400s"
}
}
}
}
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.organizations.OrganizationsFunctions;
import com.pulumi.gcp.organizations.inputs.GetProjectArgs;
import com.pulumi.gcp.vertex.AiReasoningEngine;
import com.pulumi.gcp.vertex.AiReasoningEngineArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigTtlConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineContextSpecMemoryBankConfigTtlConfigGranularTtlConfigArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
final var project = OrganizationsFunctions.getProject(GetProjectArgs.builder()
.build());
var reasoningEngine = new AiReasoningEngine("reasoningEngine", AiReasoningEngineArgs.builder()
.displayName("re-gran-ttl")
.description("Reasoning engine with granular ttl")
.region("us-central1")
.contextSpec(AiReasoningEngineContextSpecArgs.builder()
.memoryBankConfig(AiReasoningEngineContextSpecMemoryBankConfigArgs.builder()
.generationConfig(AiReasoningEngineContextSpecMemoryBankConfigGenerationConfigArgs.builder()
.model(String.format("projects/%s/locations/us-central1/publishers/google/models/gemini-2.5-flash", project.projectId()))
.build())
.similaritySearchConfig(AiReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfigArgs.builder()
.embeddingModel(String.format("projects/%s/locations/us-central1/publishers/google/models/text-embedding-005", project.projectId()))
.build())
.disableMemoryRevisions(false)
.ttlConfig(AiReasoningEngineContextSpecMemoryBankConfigTtlConfigArgs.builder()
.memoryRevisionDefaultTtl("86400s")
.granularTtlConfig(AiReasoningEngineContextSpecMemoryBankConfigTtlConfigGranularTtlConfigArgs.builder()
.createTtl("86400s")
.generateCreatedTtl("86400s")
.generateUpdatedTtl("86400s")
.build())
.build())
.build())
.build())
.build());
}
}
resources:
reasoningEngine:
type: gcp:vertex:AiReasoningEngine
name: reasoning_engine
properties:
displayName: re-gran-ttl
description: Reasoning engine with granular ttl
region: us-central1
contextSpec:
memoryBankConfig:
generationConfig:
model: projects/${project.projectId}/locations/us-central1/publishers/google/models/gemini-2.5-flash
similaritySearchConfig:
embeddingModel: projects/${project.projectId}/locations/us-central1/publishers/google/models/text-embedding-005
disableMemoryRevisions: false
ttlConfig:
memoryRevisionDefaultTtl: 86400s
granularTtlConfig:
createTtl: 86400s
generateCreatedTtl: 86400s
generateUpdatedTtl: 86400s
variables:
project:
fn::invoke:
function: gcp:organizations:getProject
arguments: {}
Vertex Ai Reasoning Engine Traffic Config
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const reasoningEngine = new gcp.vertex.AiReasoningEngine("reasoning_engine", {
displayName: "re-traffic-cfg",
description: "Reasoning engine with traffic config",
region: "us-central1",
spec: {
agentFramework: "langchain",
},
trafficConfig: {
trafficSplitAlwaysLatest: {},
},
});
import pulumi
import pulumi_gcp as gcp
reasoning_engine = gcp.vertex.AiReasoningEngine("reasoning_engine",
display_name="re-traffic-cfg",
description="Reasoning engine with traffic config",
region="us-central1",
spec={
"agent_framework": "langchain",
},
traffic_config={
"traffic_split_always_latest": {},
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var reasoningEngine = new Gcp.Vertex.AiReasoningEngine("reasoning_engine", new()
{
DisplayName = "re-traffic-cfg",
Description = "Reasoning engine with traffic config",
Region = "us-central1",
Spec = new Gcp.Vertex.Inputs.AiReasoningEngineSpecArgs
{
AgentFramework = "langchain",
},
TrafficConfig = new Gcp.Vertex.Inputs.AiReasoningEngineTrafficConfigArgs
{
TrafficSplitAlwaysLatest = null,
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/vertex"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := vertex.NewAiReasoningEngine(ctx, "reasoning_engine", &vertex.AiReasoningEngineArgs{
DisplayName: pulumi.String("re-traffic-cfg"),
Description: pulumi.String("Reasoning engine with traffic config"),
Region: pulumi.String("us-central1"),
Spec: &vertex.AiReasoningEngineSpecArgs{
AgentFramework: pulumi.String("langchain"),
},
TrafficConfig: &vertex.AiReasoningEngineTrafficConfigArgs{
TrafficSplitAlwaysLatest: &vertex.AiReasoningEngineTrafficConfigTrafficSplitAlwaysLatestArgs{},
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_vertex_aireasoningengine" "reasoning_engine" {
display_name = "re-traffic-cfg"
description = "Reasoning engine with traffic config"
region = "us-central1"
spec = {
agent_framework = "langchain"
}
traffic_config = {
traffic_split_always_latest = {}
}
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.vertex.AiReasoningEngine;
import com.pulumi.gcp.vertex.AiReasoningEngineArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineSpecArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineTrafficConfigArgs;
import com.pulumi.gcp.vertex.inputs.AiReasoningEngineTrafficConfigTrafficSplitAlwaysLatestArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var reasoningEngine = new AiReasoningEngine("reasoningEngine", AiReasoningEngineArgs.builder()
.displayName("re-traffic-cfg")
.description("Reasoning engine with traffic config")
.region("us-central1")
.spec(AiReasoningEngineSpecArgs.builder()
.agentFramework("langchain")
.build())
.trafficConfig(AiReasoningEngineTrafficConfigArgs.builder()
.trafficSplitAlwaysLatest(AiReasoningEngineTrafficConfigTrafficSplitAlwaysLatestArgs.builder()
.build())
.build())
.build());
}
}
resources:
reasoningEngine:
type: gcp:vertex:AiReasoningEngine
name: reasoning_engine
properties:
displayName: re-traffic-cfg
description: Reasoning engine with traffic config
region: us-central1
spec:
agentFramework: langchain
trafficConfig:
trafficSplitAlwaysLatest: {}
Import
ReasoningEngine can be imported using any of these accepted formats:
projects/{{project}}/locations/{{region}}/reasoningEngines/{{name}}{{project}}/{{region}}/{{name}}{{region}}/{{name}}{{name}}
When using the pulumi import command, ReasoningEngine can be imported using one of the formats above. For example:
$ pulumi import gcp:vertex/aiReasoningEngine:AiReasoningEngine default projects/{{project}}/locations/{{region}}/reasoningEngines/{{name}}
$ pulumi import gcp:vertex/aiReasoningEngine:AiReasoningEngine default {{project}}/{{region}}/{{name}}
$ pulumi import gcp:vertex/aiReasoningEngine:AiReasoningEngine default {{region}}/{{name}}
$ pulumi import gcp:vertex/aiReasoningEngine:AiReasoningEngine default {{name}}
Constructors
- AiReasoningEngine(String name, {AiReasoningEngineArgs? args, CustomResourceOptions? options})
-
Creates a new AiReasoningEngine.
nameThe Pulumi resource name.argsArguments used to configure this AiReasoningEngine. The set of arguments for AiReasoningEngine.optionsResource options controlling this resource's behavior. - AiReasoningEngine.reference(String urn)
- Creates a typed reference to an existing AiReasoningEngine resource.
Properties
-
childResources
→ Set<
Resource> -
finalinherited
-
completionSources
↔ Map<
String, IOutputCompletionSource> -
latefinalinherited
-
contextSpec
↔ Output<
AiReasoningEngineContextSpec> -
(Optional, Beta)
Optional. Configuration for how Agent Engine sub-resources should manage context.
Structure is documented below.
latefinal
-
createTime
↔ Output<
String> -
The timestamp of when the Index was created in RFC3339 UTC "Zulu" format,
with nanosecond resolution and up to nine fractional digits.
latefinal
-
deletionPolicy
↔ Output<
String> -
Optional. The deletion policy for the reasoning engine.
Setting this to FORCE allows the reasoning engine to be deleted regardless of child undeleted resources.
latefinal
-
description
↔ Output<
String?> -
The description of the ReasoningEngine.
latefinal
-
displayName
↔ Output<
String> -
The display name of the ReasoningEngine.
latefinal
-
effectiveLabels
↔ Output<
Map< String, String> > -
All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Pulumi, other clients and services.
latefinal
-
encryptionSpec
↔ Output<
AiReasoningEngineEncryptionSpec?> -
Optional. Customer-managed encryption key spec for a ReasoningEngine.
If set, this ReasoningEngine and all sub-resources of this ReasoningEngine
will be secured by this key.
Structure is documented below.
latefinal
- hashCode → int
-
The hash code for this object.
no setterinherited
-
id
↔ Output<
String> -
getter/setter pairinherited
- isCustom → bool
-
Returns whether this resource is provider-managed.
no setterinherited
- isProtected → bool
-
Returns whether this resource is protected from deletion.
no setterinherited
- isRemote → bool
-
Whether this resource is registered as remote.
no setterinherited
- isResourceReference → bool
-
Whether this instance represents a resource value returned over RPC.
finalinherited
-
labels
↔ Output<
Map< String, String> ?> -
The labels associated with this ReasoningEngine. You can use these to
organize and group your ReasoningEngines.
latefinal
-
name
↔ Output<
String> -
The generated name of the ReasoningEngine, in the format
projects/{project}/locations/{location}/reasoningEngines/{reasoningEngine}
latefinal
-
project
↔ Output<
String> -
The ID of the project in which the resource belongs.
If it is not provided, the provider project is used.
latefinal
-
pulumiLabels
↔ Output<
Map< String, String> > -
The combination of labels configured directly on the resource
and default labels configured on the provider.
latefinal
-
region
↔ Output<
String?> -
The region of the reasoning engine. eg us-central1
latefinal
-
resourceTransforms
→ List<
ResourceTransform> -
Inherited/explicit async transforms.
no setterinherited
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
-
spec
↔ Output<
AiReasoningEngineSpec> -
Optional. Configurations of the ReasoningEngine.
Structure is documented below.
latefinal
-
trafficConfig
↔ Output<
AiReasoningEngineTrafficConfig> -
(Optional, Beta)
Optional. Traffic distribution configuration for the Reasoning Engine.
> Note: Because revision IDs do not exist before the resource is created, the best practice for initial deployment is to set
trafficSplitAlwaysLatest {}. Once the resource is created, you can update the configuration to a manual split using newly generated revision IDs, short names (e.g.rev-1), or keywords such asLATESTandPREVIOUS. Structure is documented below.latefinal -
transformations
→ List<
ResourceTransformation> -
Inherited/explicit legacy transformations.
no setterinherited
-
updateTime
↔ Output<
String> -
The timestamp of when the Index was last updated in RFC3339 UTC "Zulu"
format, with nanosecond resolution and up to nine fractional digits.
latefinal
-
url
↔ Output<
String> -
(Beta)
Output only. The URL of the reasoning engine.
latefinal
-
urn
↔ Output<
String> -
latefinalinherited
Methods
-
failId(
Object error) → void -
Completes this resource ID with an error when registration fails.
inherited
-
failOutputs(
Object error) → void -
Completes all output properties with
error.inherited -
failUrn(
Object error) → void -
Completes this resource URN with an error when registration fails.
inherited
-
getProvider(
String moduleMember) → ProviderResource? -
Returns provider for
moduleMember's package, if configured.inherited -
getResourceName(
) → String -
Returns this resource's logical name.
inherited
-
getResourceType(
) → String -
Returns this resource's Pulumi type token.
inherited
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
registerOutput<
T> (String propertyName, {Object? decoder(Object?)?, bool isSecret = false}) → Output< T> -
Registers a dynamic output property for this resource.
inherited
-
resolveId(
String? value, {required bool isKnown}) → void -
Resolves the provider-assigned ID for this resource.
inherited
-
resolveOutputs(
Struct outputs) → void -
Resolves all output properties from a monitor response payload.
inherited
-
resolveUrn(
String value) → void -
Resolves this resource's URN once assigned by the engine.
inherited
-
serializeProperties(
Map< String, dynamic> properties) → Future<Struct> -
Serializes resource properties for RPC transmission.
inherited
-
toString(
) → String -
A string representation of this object.
inherited
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited
Static Methods
-
get(
String name, Input< String> id, {AiReasoningEngineState? state, CustomResourceOptions? options}) → AiReasoningEngine -
Gets an existing AiReasoningEngine resource's state with the given
nameandid.