Configure GCP Contact Center Insights Analysis Rules

The gcp:contactcenterinsights/analysisRule:AnalysisRule resource, part of the Pulumi GCP provider, defines project-wide analysis rules that automatically run annotators on conversations matching specified filters. This guide focuses on three capabilities: basic rule creation, conversation filtering with annotator selection, and summarization configuration.

Analysis rules reference existing issue models, phrase matchers, QA scorecards, and optionally conversation profiles. The examples are intentionally small. Combine them with your own Contact Center Insights resources and filtering logic.

Create a minimal analysis rule with location and name

Teams starting with Contact Center Insights often create a basic rule that applies to all conversations in a location.

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

const analysisRuleBasic = new gcp.contactcenterinsights.AnalysisRule("analysis_rule_basic", {
    location: "us-central1",
    displayName: "analysis-rule-display-name",
});
import pulumi
import pulumi_gcp as gcp

analysis_rule_basic = gcp.contactcenterinsights.AnalysisRule("analysis_rule_basic",
    location="us-central1",
    display_name="analysis-rule-display-name")
package main

import (
	"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/contactcenterinsights"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := contactcenterinsights.NewAnalysisRule(ctx, "analysis_rule_basic", &contactcenterinsights.AnalysisRuleArgs{
			Location:    pulumi.String("us-central1"),
			DisplayName: pulumi.String("analysis-rule-display-name"),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;

return await Deployment.RunAsync(() => 
{
    var analysisRuleBasic = new Gcp.ContactCenterInsights.AnalysisRule("analysis_rule_basic", new()
    {
        Location = "us-central1",
        DisplayName = "analysis-rule-display-name",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.contactcenterinsights.AnalysisRule;
import com.pulumi.gcp.contactcenterinsights.AnalysisRuleArgs;
import java.util.List;
import java.util.ArrayList;
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 analysisRuleBasic = new AnalysisRule("analysisRuleBasic", AnalysisRuleArgs.builder()
            .location("us-central1")
            .displayName("analysis-rule-display-name")
            .build());

    }
}
resources:
  analysisRuleBasic:
    type: gcp:contactcenterinsights:AnalysisRule
    name: analysis_rule_basic
    properties:
      location: us-central1
      displayName: analysis-rule-display-name

The location property specifies the GCP region where the rule operates. The displayName provides a human-readable identifier. Without a conversationFilter, this rule applies to all conversations; without an annotatorSelector, it uses the project’s default annotators.

Filter conversations and configure specific annotators

Production deployments typically target specific conversation subsets and control which analysis features run, reducing processing costs.

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

const analysisRuleFull = new gcp.contactcenterinsights.AnalysisRule("analysis_rule_full", {
    location: "us-central1",
    displayName: "analysis-rule-display-name",
    conversationFilter: "agent_id = \"1\"",
    annotatorSelector: {
        runInterruptionAnnotator: false,
        issueModels: ["projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id"],
        phraseMatchers: ["projects/1111111111111/locations/us-central1/phraseMatchers/123"],
        qaConfig: {
            scorecardList: {
                qaScorecardRevisions: ["projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id"],
            },
        },
        runEntityAnnotator: false,
        runIntentAnnotator: false,
        runIssueModelAnnotator: false,
        runPhraseMatcherAnnotator: false,
        runQaAnnotator: false,
        runSentimentAnnotator: false,
        runSilenceAnnotator: true,
        runSummarizationAnnotator: false,
        summarizationConfig: {
            summarizationModel: "BASELINE_MODEL",
        },
    },
    analysisPercentage: 0.5,
    active: true,
});
import pulumi
import pulumi_gcp as gcp

analysis_rule_full = gcp.contactcenterinsights.AnalysisRule("analysis_rule_full",
    location="us-central1",
    display_name="analysis-rule-display-name",
    conversation_filter="agent_id = \"1\"",
    annotator_selector={
        "run_interruption_annotator": False,
        "issue_models": ["projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id"],
        "phrase_matchers": ["projects/1111111111111/locations/us-central1/phraseMatchers/123"],
        "qa_config": {
            "scorecard_list": {
                "qa_scorecard_revisions": ["projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id"],
            },
        },
        "run_entity_annotator": False,
        "run_intent_annotator": False,
        "run_issue_model_annotator": False,
        "run_phrase_matcher_annotator": False,
        "run_qa_annotator": False,
        "run_sentiment_annotator": False,
        "run_silence_annotator": True,
        "run_summarization_annotator": False,
        "summarization_config": {
            "summarization_model": "BASELINE_MODEL",
        },
    },
    analysis_percentage=0.5,
    active=True)
package main

import (
	"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/contactcenterinsights"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := contactcenterinsights.NewAnalysisRule(ctx, "analysis_rule_full", &contactcenterinsights.AnalysisRuleArgs{
			Location:           pulumi.String("us-central1"),
			DisplayName:        pulumi.String("analysis-rule-display-name"),
			ConversationFilter: pulumi.String("agent_id = \"1\""),
			AnnotatorSelector: &contactcenterinsights.AnalysisRuleAnnotatorSelectorArgs{
				RunInterruptionAnnotator: pulumi.Bool(false),
				IssueModels: pulumi.StringArray{
					pulumi.String("projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id"),
				},
				PhraseMatchers: pulumi.StringArray{
					pulumi.String("projects/1111111111111/locations/us-central1/phraseMatchers/123"),
				},
				QaConfig: &contactcenterinsights.AnalysisRuleAnnotatorSelectorQaConfigArgs{
					ScorecardList: &contactcenterinsights.AnalysisRuleAnnotatorSelectorQaConfigScorecardListArgs{
						QaScorecardRevisions: pulumi.StringArray{
							pulumi.String("projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id"),
						},
					},
				},
				RunEntityAnnotator:        pulumi.Bool(false),
				RunIntentAnnotator:        pulumi.Bool(false),
				RunIssueModelAnnotator:    pulumi.Bool(false),
				RunPhraseMatcherAnnotator: pulumi.Bool(false),
				RunQaAnnotator:            pulumi.Bool(false),
				RunSentimentAnnotator:     pulumi.Bool(false),
				RunSilenceAnnotator:       pulumi.Bool(true),
				RunSummarizationAnnotator: pulumi.Bool(false),
				SummarizationConfig: &contactcenterinsights.AnalysisRuleAnnotatorSelectorSummarizationConfigArgs{
					SummarizationModel: pulumi.String("BASELINE_MODEL"),
				},
			},
			AnalysisPercentage: pulumi.Float64(0.5),
			Active:             pulumi.Bool(true),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;

return await Deployment.RunAsync(() => 
{
    var analysisRuleFull = new Gcp.ContactCenterInsights.AnalysisRule("analysis_rule_full", new()
    {
        Location = "us-central1",
        DisplayName = "analysis-rule-display-name",
        ConversationFilter = "agent_id = \"1\"",
        AnnotatorSelector = new Gcp.ContactCenterInsights.Inputs.AnalysisRuleAnnotatorSelectorArgs
        {
            RunInterruptionAnnotator = false,
            IssueModels = new[]
            {
                "projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id",
            },
            PhraseMatchers = new[]
            {
                "projects/1111111111111/locations/us-central1/phraseMatchers/123",
            },
            QaConfig = new Gcp.ContactCenterInsights.Inputs.AnalysisRuleAnnotatorSelectorQaConfigArgs
            {
                ScorecardList = new Gcp.ContactCenterInsights.Inputs.AnalysisRuleAnnotatorSelectorQaConfigScorecardListArgs
                {
                    QaScorecardRevisions = new[]
                    {
                        "projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id",
                    },
                },
            },
            RunEntityAnnotator = false,
            RunIntentAnnotator = false,
            RunIssueModelAnnotator = false,
            RunPhraseMatcherAnnotator = false,
            RunQaAnnotator = false,
            RunSentimentAnnotator = false,
            RunSilenceAnnotator = true,
            RunSummarizationAnnotator = false,
            SummarizationConfig = new Gcp.ContactCenterInsights.Inputs.AnalysisRuleAnnotatorSelectorSummarizationConfigArgs
            {
                SummarizationModel = "BASELINE_MODEL",
            },
        },
        AnalysisPercentage = 0.5,
        Active = true,
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.contactcenterinsights.AnalysisRule;
import com.pulumi.gcp.contactcenterinsights.AnalysisRuleArgs;
import com.pulumi.gcp.contactcenterinsights.inputs.AnalysisRuleAnnotatorSelectorArgs;
import com.pulumi.gcp.contactcenterinsights.inputs.AnalysisRuleAnnotatorSelectorQaConfigArgs;
import com.pulumi.gcp.contactcenterinsights.inputs.AnalysisRuleAnnotatorSelectorQaConfigScorecardListArgs;
import com.pulumi.gcp.contactcenterinsights.inputs.AnalysisRuleAnnotatorSelectorSummarizationConfigArgs;
import java.util.List;
import java.util.ArrayList;
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 analysisRuleFull = new AnalysisRule("analysisRuleFull", AnalysisRuleArgs.builder()
            .location("us-central1")
            .displayName("analysis-rule-display-name")
            .conversationFilter("agent_id = \"1\"")
            .annotatorSelector(AnalysisRuleAnnotatorSelectorArgs.builder()
                .runInterruptionAnnotator(false)
                .issueModels("projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id")
                .phraseMatchers("projects/1111111111111/locations/us-central1/phraseMatchers/123")
                .qaConfig(AnalysisRuleAnnotatorSelectorQaConfigArgs.builder()
                    .scorecardList(AnalysisRuleAnnotatorSelectorQaConfigScorecardListArgs.builder()
                        .qaScorecardRevisions("projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id")
                        .build())
                    .build())
                .runEntityAnnotator(false)
                .runIntentAnnotator(false)
                .runIssueModelAnnotator(false)
                .runPhraseMatcherAnnotator(false)
                .runQaAnnotator(false)
                .runSentimentAnnotator(false)
                .runSilenceAnnotator(true)
                .runSummarizationAnnotator(false)
                .summarizationConfig(AnalysisRuleAnnotatorSelectorSummarizationConfigArgs.builder()
                    .summarizationModel("BASELINE_MODEL")
                    .build())
                .build())
            .analysisPercentage(0.5)
            .active(true)
            .build());

    }
}
resources:
  analysisRuleFull:
    type: gcp:contactcenterinsights:AnalysisRule
    name: analysis_rule_full
    properties:
      location: us-central1
      displayName: analysis-rule-display-name
      conversationFilter: agent_id = "1"
      annotatorSelector:
        runInterruptionAnnotator: false
        issueModels:
          - projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id
        phraseMatchers:
          - projects/1111111111111/locations/us-central1/phraseMatchers/123
        qaConfig:
          scorecardList:
            qaScorecardRevisions:
              - projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id
        runEntityAnnotator: false
        runIntentAnnotator: false
        runIssueModelAnnotator: false
        runPhraseMatcherAnnotator: false
        runQaAnnotator: false
        runSentimentAnnotator: false
        runSilenceAnnotator: true
        runSummarizationAnnotator: false
        summarizationConfig:
          summarizationModel: BASELINE_MODEL
      analysisPercentage: 0.5
      active: true

The conversationFilter uses a query syntax to select conversations (here, filtering by agent_id). The annotatorSelector block controls which analysis features run: issueModels detect conversation topics, phraseMatchers find specific phrases, and qaConfig applies quality scorecards. The analysisPercentage samples 50% of matching conversations. Setting active to true enables the rule immediately.

Use conversation profiles for summarization

Organizations with custom summarization behavior can reference conversation profiles instead of baseline models.

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

const analysisRuleProfile = new gcp.contactcenterinsights.AnalysisRule("analysis_rule_profile", {
    location: "us-central1",
    displayName: "analysis-rule-display-name",
    conversationFilter: "agent_id = \"1\"",
    annotatorSelector: {
        runInterruptionAnnotator: false,
        issueModels: ["projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id"],
        phraseMatchers: ["projects/1111111111111/locations/us-central1/phraseMatchers/123"],
        qaConfig: {
            scorecardList: {
                qaScorecardRevisions: ["projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id"],
            },
        },
        runEntityAnnotator: false,
        runIntentAnnotator: false,
        runIssueModelAnnotator: false,
        runPhraseMatcherAnnotator: false,
        runQaAnnotator: false,
        runSentimentAnnotator: false,
        runSilenceAnnotator: true,
        runSummarizationAnnotator: false,
        summarizationConfig: {
            conversationProfile: "projects/1111111111111/locations/us-central1/conversationProfiles/some_conversation_profile",
        },
    },
    analysisPercentage: 0.5,
    active: true,
});
import pulumi
import pulumi_gcp as gcp

analysis_rule_profile = gcp.contactcenterinsights.AnalysisRule("analysis_rule_profile",
    location="us-central1",
    display_name="analysis-rule-display-name",
    conversation_filter="agent_id = \"1\"",
    annotator_selector={
        "run_interruption_annotator": False,
        "issue_models": ["projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id"],
        "phrase_matchers": ["projects/1111111111111/locations/us-central1/phraseMatchers/123"],
        "qa_config": {
            "scorecard_list": {
                "qa_scorecard_revisions": ["projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id"],
            },
        },
        "run_entity_annotator": False,
        "run_intent_annotator": False,
        "run_issue_model_annotator": False,
        "run_phrase_matcher_annotator": False,
        "run_qa_annotator": False,
        "run_sentiment_annotator": False,
        "run_silence_annotator": True,
        "run_summarization_annotator": False,
        "summarization_config": {
            "conversation_profile": "projects/1111111111111/locations/us-central1/conversationProfiles/some_conversation_profile",
        },
    },
    analysis_percentage=0.5,
    active=True)
package main

import (
	"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/contactcenterinsights"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := contactcenterinsights.NewAnalysisRule(ctx, "analysis_rule_profile", &contactcenterinsights.AnalysisRuleArgs{
			Location:           pulumi.String("us-central1"),
			DisplayName:        pulumi.String("analysis-rule-display-name"),
			ConversationFilter: pulumi.String("agent_id = \"1\""),
			AnnotatorSelector: &contactcenterinsights.AnalysisRuleAnnotatorSelectorArgs{
				RunInterruptionAnnotator: pulumi.Bool(false),
				IssueModels: pulumi.StringArray{
					pulumi.String("projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id"),
				},
				PhraseMatchers: pulumi.StringArray{
					pulumi.String("projects/1111111111111/locations/us-central1/phraseMatchers/123"),
				},
				QaConfig: &contactcenterinsights.AnalysisRuleAnnotatorSelectorQaConfigArgs{
					ScorecardList: &contactcenterinsights.AnalysisRuleAnnotatorSelectorQaConfigScorecardListArgs{
						QaScorecardRevisions: pulumi.StringArray{
							pulumi.String("projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id"),
						},
					},
				},
				RunEntityAnnotator:        pulumi.Bool(false),
				RunIntentAnnotator:        pulumi.Bool(false),
				RunIssueModelAnnotator:    pulumi.Bool(false),
				RunPhraseMatcherAnnotator: pulumi.Bool(false),
				RunQaAnnotator:            pulumi.Bool(false),
				RunSentimentAnnotator:     pulumi.Bool(false),
				RunSilenceAnnotator:       pulumi.Bool(true),
				RunSummarizationAnnotator: pulumi.Bool(false),
				SummarizationConfig: &contactcenterinsights.AnalysisRuleAnnotatorSelectorSummarizationConfigArgs{
					ConversationProfile: pulumi.String("projects/1111111111111/locations/us-central1/conversationProfiles/some_conversation_profile"),
				},
			},
			AnalysisPercentage: pulumi.Float64(0.5),
			Active:             pulumi.Bool(true),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;

return await Deployment.RunAsync(() => 
{
    var analysisRuleProfile = new Gcp.ContactCenterInsights.AnalysisRule("analysis_rule_profile", new()
    {
        Location = "us-central1",
        DisplayName = "analysis-rule-display-name",
        ConversationFilter = "agent_id = \"1\"",
        AnnotatorSelector = new Gcp.ContactCenterInsights.Inputs.AnalysisRuleAnnotatorSelectorArgs
        {
            RunInterruptionAnnotator = false,
            IssueModels = new[]
            {
                "projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id",
            },
            PhraseMatchers = new[]
            {
                "projects/1111111111111/locations/us-central1/phraseMatchers/123",
            },
            QaConfig = new Gcp.ContactCenterInsights.Inputs.AnalysisRuleAnnotatorSelectorQaConfigArgs
            {
                ScorecardList = new Gcp.ContactCenterInsights.Inputs.AnalysisRuleAnnotatorSelectorQaConfigScorecardListArgs
                {
                    QaScorecardRevisions = new[]
                    {
                        "projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id",
                    },
                },
            },
            RunEntityAnnotator = false,
            RunIntentAnnotator = false,
            RunIssueModelAnnotator = false,
            RunPhraseMatcherAnnotator = false,
            RunQaAnnotator = false,
            RunSentimentAnnotator = false,
            RunSilenceAnnotator = true,
            RunSummarizationAnnotator = false,
            SummarizationConfig = new Gcp.ContactCenterInsights.Inputs.AnalysisRuleAnnotatorSelectorSummarizationConfigArgs
            {
                ConversationProfile = "projects/1111111111111/locations/us-central1/conversationProfiles/some_conversation_profile",
            },
        },
        AnalysisPercentage = 0.5,
        Active = true,
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.contactcenterinsights.AnalysisRule;
import com.pulumi.gcp.contactcenterinsights.AnalysisRuleArgs;
import com.pulumi.gcp.contactcenterinsights.inputs.AnalysisRuleAnnotatorSelectorArgs;
import com.pulumi.gcp.contactcenterinsights.inputs.AnalysisRuleAnnotatorSelectorQaConfigArgs;
import com.pulumi.gcp.contactcenterinsights.inputs.AnalysisRuleAnnotatorSelectorQaConfigScorecardListArgs;
import com.pulumi.gcp.contactcenterinsights.inputs.AnalysisRuleAnnotatorSelectorSummarizationConfigArgs;
import java.util.List;
import java.util.ArrayList;
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 analysisRuleProfile = new AnalysisRule("analysisRuleProfile", AnalysisRuleArgs.builder()
            .location("us-central1")
            .displayName("analysis-rule-display-name")
            .conversationFilter("agent_id = \"1\"")
            .annotatorSelector(AnalysisRuleAnnotatorSelectorArgs.builder()
                .runInterruptionAnnotator(false)
                .issueModels("projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id")
                .phraseMatchers("projects/1111111111111/locations/us-central1/phraseMatchers/123")
                .qaConfig(AnalysisRuleAnnotatorSelectorQaConfigArgs.builder()
                    .scorecardList(AnalysisRuleAnnotatorSelectorQaConfigScorecardListArgs.builder()
                        .qaScorecardRevisions("projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id")
                        .build())
                    .build())
                .runEntityAnnotator(false)
                .runIntentAnnotator(false)
                .runIssueModelAnnotator(false)
                .runPhraseMatcherAnnotator(false)
                .runQaAnnotator(false)
                .runSentimentAnnotator(false)
                .runSilenceAnnotator(true)
                .runSummarizationAnnotator(false)
                .summarizationConfig(AnalysisRuleAnnotatorSelectorSummarizationConfigArgs.builder()
                    .conversationProfile("projects/1111111111111/locations/us-central1/conversationProfiles/some_conversation_profile")
                    .build())
                .build())
            .analysisPercentage(0.5)
            .active(true)
            .build());

    }
}
resources:
  analysisRuleProfile:
    type: gcp:contactcenterinsights:AnalysisRule
    name: analysis_rule_profile
    properties:
      location: us-central1
      displayName: analysis-rule-display-name
      conversationFilter: agent_id = "1"
      annotatorSelector:
        runInterruptionAnnotator: false
        issueModels:
          - projects/1111111111111/locations/us-central1/issueModels/some_issue_model_id
        phraseMatchers:
          - projects/1111111111111/locations/us-central1/phraseMatchers/123
        qaConfig:
          scorecardList:
            qaScorecardRevisions:
              - projects/1111111111111/locations/us-central1/qaScorecards/*/revisions/some_scorecard_revision_id
        runEntityAnnotator: false
        runIntentAnnotator: false
        runIssueModelAnnotator: false
        runPhraseMatcherAnnotator: false
        runQaAnnotator: false
        runSentimentAnnotator: false
        runSilenceAnnotator: true
        runSummarizationAnnotator: false
        summarizationConfig:
          conversationProfile: projects/1111111111111/locations/us-central1/conversationProfiles/some_conversation_profile
      analysisPercentage: 0.5
      active: true

The summarizationConfig block accepts either a summarizationModel (like “BASELINE_MODEL”) or a conversationProfile reference. Using conversationProfile applies custom summarization logic defined in that profile. This provides an alternative to the baseline model shown in the previous example.

Beyond these examples

These snippets focus on specific analysis rule features: conversation filtering and annotator selection, sampling and activation control, and summarization configuration. They’re intentionally minimal rather than full conversation analysis pipelines.

The examples reference pre-existing infrastructure such as issue models, phrase matchers, QA scorecards, and conversation profiles (for profile-based summarization). They focus on configuring the rule rather than provisioning the underlying analysis resources.

To keep things focused, common rule patterns are omitted, including:

  • Individual annotator toggles (runEntityAnnotator, runIntentAnnotator, etc.)
  • Multiple issue models or phrase matchers in a single rule
  • Complex conversation filter expressions
  • Runtime percentage vs analysis percentage tradeoffs

These omissions are intentional: the goal is to illustrate how each rule feature is wired, not provide drop-in analysis configurations. See the Contact Center Insights AnalysisRule resource reference for all available configuration options.

Let's configure GCP Contact Center Insights Analysis Rules

Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.

Try Pulumi Cloud for FREE

Frequently Asked Questions

Rule Behavior & Filtering
What happens when a conversation matches multiple analysis rules?
A union of all annotators from all matching rules will run on the conversation.
What does an empty conversationFilter mean?
An empty conversationFilter applies the analysis rule to all conversations in the project.
How do I save a rule without applying it to conversations?
Set active to false to save the rule as a draft without applying it.
What does analysisPercentage control?
It controls the sampling rate for automatic analysis, between 0 and 1 (e.g., 0.1 means 10% of matching conversations). This replaces the original runtime and upload percentages.
How do I filter which conversations a rule applies to?
Use conversationFilter with filter expressions like agent_id = "1". Refer to the GCP filtering documentation for syntax details.
Annotator Configuration
How do I control which annotators run on conversations?
Configure annotatorSelector with boolean flags (like runInterruptionAnnotator, runSentimentAnnotator) and resource references (issueModels, phraseMatchers, qaConfig).
What's the difference between summarizationModel and conversationProfile?
Both configure summarization in summarizationConfig. Use summarizationModel for predefined models (like BASELINE_MODEL) or conversationProfile for custom conversation profile resource paths.
Resource Management
Can I change the location or project after creating a rule?
No, both location and project are immutable after creation.
How are analysis rule names generated?
Names are randomly generated by Insights and cannot be specified during creation.

Using a different cloud?

Explore analytics guides for other cloud providers: