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 multiple annotators, and profile-based summarization.

Analysis rules reference existing issue models, phrase matchers, QA scorecards, and optionally conversation profiles. The examples are intentionally small. Combine them with your own filters and annotator configurations.

Create a minimal analysis rule with location and name

Most deployments start by creating a basic rule that applies to all conversations in a location, establishing the foundation before adding filters or annotators.

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 where the rule operates. The displayName provides a human-readable identifier. Without conversationFilter or annotatorSelector, the rule uses default behavior and applies to all conversations.

Filter conversations and configure multiple annotators

Production rules typically target specific conversations and run multiple analysis types like issue detection, phrase matching, and quality scoring.

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 property uses a query syntax to select conversations (here, filtering by agent_id). The annotatorSelector block enables specific analysis types: issueModels for issue detection, phraseMatchers for phrase matching, and qaConfig for quality assurance scoring. The analysisPercentage property controls sampling (0.5 means 50% of matching conversations). The active property determines whether the rule runs immediately or stays in draft mode.

Use conversation profiles for summarization

Some workflows use conversation profiles to configure summarization instead of selecting a baseline model directly, allowing centralized configuration across multiple rules.

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 references a conversationProfile instead of specifying a summarizationModel. This delegates summarization behavior to the profile’s configuration. The rest of the annotatorSelector configuration works identically to the previous example.

Beyond these examples

These snippets focus on specific analysis rule features: conversation filtering and annotator selection, issue detection and phrase matching, and QA scoring and summarization. They’re intentionally minimal rather than full 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.)
  • Analysis sampling strategies (analysisPercentage tuning)
  • Rule activation lifecycle (active property management)
  • Filter syntax for complex conversation queries

These omissions are intentional: the goal is to illustrate how each rule feature is wired, not provide drop-in analysis modules. 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 & Scope
What happens when a conversation matches multiple analysis rules?
All annotators from all matching rules will run. The system applies a union of annotators from every rule that matches the conversation.
How do I target specific conversations for analysis?
Use conversationFilter with filter expressions like agent_id = "1". An empty filter applies the rule to all conversations.
What does the analysisPercentage property control?
It determines what percentage of matching conversations get analyzed, between 0 and 1 (e.g., 0.1 means 10%). Conversations are sampled deterministically.
Configuration & Lifecycle
How do I control whether a rule is active or saved as a draft?
Set active to true to apply the rule to conversations, or false to save it as an inactive draft.
What properties are immutable after creating an analysis rule?
Both location and project cannot be changed after creation.
What's the minimum configuration needed to create an analysis rule?
You only need location and displayName, as shown in the basic example.
Annotators & Analysis
What types of annotators can I configure in a rule?
You can configure interruption, entity, intent, issue model, phrase matcher, QA, sentiment, silence, and summarization annotators. Each has a corresponding run*Annotator flag in annotatorSelector.
What's the difference between using summarizationModel and conversationProfile?
Both configure summarization in summarizationConfig. Use summarizationModel (e.g., BASELINE_MODEL) for model-based summarization, or conversationProfile to reference an existing conversation profile.

Using a different cloud?

Explore analytics guides for other cloud providers: