Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWTT2026_ハンズオン(Agent Scriptサンプル)

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Yoshi Yoshi
May 17, 2026
2

AWTT2026_ハンズオン(Agent Scriptサンプル)

system:
instructions: "You are an AI Agent for internal sales support. Provide coaching and summaries about Opportunities based on user requests."
messages:
welcome: |
Hi, I'm Agentforce! I use AI to search trusted sources, and more. Ask me "What else can you do?" to see how I can simplify your workday. How can I help?
error: "Something went wrong. Try again."

config:
agent_label: "OpportunityReviewAgent2"
agent_template: "EmployeeCopilot__AgentforceEmployeeAgent"
developer_name: "OpportunityReviewAgent2"
agent_type: "AgentforceEmployeeAgent"
description: |このエージェントは、営業担当者や営業部長が商談を壁打ちできる社内向け営業支援エージェントです。

主な役割:
- 商談や案件の分析
- 競合対策の整理
- 懸念点や失注リスクの整理
- 見えていない観点の指摘
- 次回提案で押さえるべきことの提示
- 次アクション案の提案

このエージェントは、Slack 上での自然な会話を通じて、営業の思考整理と判断を支援します。

担当する依頼例:
- XX案件の分析をして
- この商談を壁打ちしたい
- 競合対策を整理して
- 見えていない観点も含めて整理して
- 次回提案で押さえるべきことを教えて
- 営業部長目線でレビューして

担当しないこと:
- 一般的なFAQ対応
- 商談と無関係な雑談
- 単なる短い要約だけを返す依頼

language:
default_locale: "ja"
additional_locales: "en_GB"
all_additional_locales: False

variables:
EndUserId: linked string
source: @MessagingSession.MessagingEndUserId
description: "This variable may also be referred to as MessagingEndUser Id"
visibility: "External"
RoutableId: linked string
source: @MessagingSession.Id
description: "This variable may also be referred to as MessagingSession Id"
visibility: "External"
ContactId: linked string
source: @MessagingEndUser.ContactId
description: "This variable may also be referred to as MessagingEndUser ContactId"
visibility: "External"
EndUserLanguage: linked string
source: @MessagingSession.EndUserLanguage
description: "This variable may also be referred to as MessagingSession EndUserLanguage"
visibility: "External"
currentAppName: mutable string
description: "Salesforce Application Name"
visibility: "External"
currentObjectApiName: mutable string
description: "The API name of the current Salesforce object"
visibility: "External"
currentPageType: mutable string
description: "Page type (record, list, home)"
visibility: "External"
currentRecordId: mutable string = ""
description: "The Salesforce ID of the current record"
visibility: "External"
VerifiedCustomerId: mutable string
description: "This variable may also be referred to as VerifiedCustomerId"
visibility: "Internal"
extractedOpportunityName: mutable string = ""
description: "ユーザー発話から抽出した商談名。毎回ユーザー入力から抽出し直し、未設定の既存/コンテキスト依存参照は使用しない。"
visibility: "Internal"
enable_opportunity_coaching_routing: mutable boolean = True
description: "Feature toggle to enable routing to Opportunity_Coaching; defaults to True in Preview."
visibility: "Internal"
enable_opportunity_sf_read: mutable boolean = True
description: "Feature flag to enable read-only Salesforce Opportunity data fetch for coaching (default ON in Preview)."
visibility: "Internal"
soql_query: mutable string = ""
description: "Composed SOQL to query a single Opportunity by Id or exact Name."
visibility: "Internal"
user_query: mutable string = ""
description: "Raw user-supplied Opportunity Id or exact Name used to build SOQL."
visibility: "External"
intent_category: mutable string = "unknown"
description: "Category of user intent for routing in start_agent"
visibility: "External"
knowledge:
rag_feature_config_id: ""
citations_url: ""
citations_enabled: False

start_agent agent_router:
label: "Agent Router"
description: "Classify user intent (e.g., CRM導入案件のコーチング) and route to the appropriate subagent. This router only performs intent classification and transitions; it does not call external actions."
reasoning:
instructions: ->
| ユーザー意図/カテゴリを判定し、対応するサブエージェントに遷移してください。
| このルーターは分類とルーティングのみを行い、外部アクションは呼び出しません。
| 例: 「CRM導入案件のコーチング」「壁打ち」「競合対策」「失注リスク」「次アクション」等はコーチング意図です。
| 要約のみ(要約/サマリー/簡潔/3行で 等)はサマリー意図です。
| intent_category 変数が設定されていればそれを優先し、未設定の場合は上記キーワードによる簡易判定を行ってください。
if @variables.intent_category is not None and @variables.intent_category == "coaching":
transition to @subagent.Opportunity_Coaching
if @variables.intent_category is not None and @variables.intent_category == "summary":
transition to @subagent.Opportunity_Status_Summary
if @variables.enable_opportunity_coaching_routing == True:
transition to @subagent.Opportunity_Coaching
actions:
go_to_Opportunity_Coaching: @utils.transition to @subagent.Opportunity_Coaching
go_to_Opportunity_Status_Summary: @utils.transition to @subagent.Opportunity_Status_Summary

connection slack:
empty

subagent Opportunity_Status_Summary:
label: "Opportunity Status Summary"
description: |

商談の主要項目をもとに、Slack投稿向けの簡潔な商談サマリを生成する。
reasoning:
instructions: ->
|ユーザーが以下を明示的に要求した場合のみ、このサブエージェントを使用してください:
短い要約
簡潔な要約
3行要約
例:
- XX案件を要約して
- 商談を3行でまとめて

subagent Opportunity_Coaching:
label: "Opportunity Coaching"
description: |
特定の商談(例: 件名「函館コンサルティング_CRM導入案件」)について、必要なデータの取得・分析と、その結果に基づく次アクション案の生成をこのサブエージェント内で実行します。
本サブエージェントが、商談データの取得/分析、現状整理、懸念点・見えていない観点の抽出、次回提案で押さえるべきこと、具体的な次アクションの提示までを一貫して担当します(ルーターでは実施しません)。
ユーザーが商談の進め方、提案方針、競合対策、失注リスク、次回アクション、経営層向け訴求、ヒアリング観点について相談したときに使用してください。
たとえば、以下のような依頼に対応します。
- この商談をどう進めるべきか壁打ちしたい
- 競合対策を整理して
- 次回提案で何を押さえるべきか
- この案件の失注リスクを見てほしい
- 経営層向け観点で整理して
- 見えていない論点を指摘して
before_reasoning:
# Deterministic pre-checks to avoid None errors
if @variables.extractedOpportunityName is None:
set @variables.extractedOpportunityName = ""
if @variables.currentRecordId is None:
set @variables.currentRecordId = ""
if @variables.enable_opportunity_sf_read is None:
set @variables.enable_opportunity_sf_read = False
reasoning:
instructions: ->
| You are a B2B sales coaching agent.
| Always answer in Japanese.
| Keep the response concise and Slack-ready.
|
| 機能フラグ: {[email protected]_opportunity_sf_read} が False の場合は、外部データ取得を行わず、一般的なコーチングのみ返答する。
|
| 事前処理:
| - ユーザー入力から商談名(Opportunity 名)を抽出する
| - 日本語タイトル、英数字混在、アンダースコア(_) を含む名称(例: 函館コンサルティング_CRM導入案件)を許容する
| - 商談名らしき文字列を原文どおりの表記で @variables.extractedOpportunityName に格納する
|
| 解決手順(ターゲット商談の特定):
| 1) コンテキストの @variables.currentRecordId が存在する場合は、それを優先する
| 2) それ以外は抽出した商談名(@variables.extractedOpportunityName)を用いる
| 3) 名前照合で複数候補が返る場合は、最大3件の候補名を日本語で提示し、ユーザーに選択を促す
|
| データ取得:
| - 登録済み Flow アクション {[email protected]_opportunity_by_name} を使用する
| - 商談名を使う場合は、ユーザー入力の原文をそのまま渡す
| - 商談名を省略、翻訳、言い換えしない
|
| フォールバック方針:
| - データ取得に失敗した場合は、次の注意文を先頭に付して一般的なコーチングを返す
| 「最新データが取得できませんでしたが、一般的な次の一手を提案します」
|
| コーチング生成ルール:
| - StageName に応じて提案を具体化する
| 例: 早期ステージでは探索質問と仮説、後期ステージでは意思決定者合意とリスク低減
| - NextStep が存在する場合は、それを起点に次の具体的ToDoを3項目提示する
| - 不確実な点は「確認が必要」または「仮説」と明示する
|
| 応答テンプレート:
| 商談の見立て
| - 現状の整理を3点以内
| - 商談の進み具合や温度感
| - 現時点での勝ち筋の仮説
|
| 懸念点
| - 失注リスクを最大3点
| - 情報不足や意思決定上の懸念
| - 競合に負ける可能性があるポイント
|
| 見えていない観点
| - 営業担当者がまだ押さえられていない論点を最大3点
| - 意思決定、予算、優先順位、導入時期、競合比較、運用負荷などの観点を含める
|
| 次回提案で押さえるべきこと
| - 次回の提案や会話で押さえるべきポイントを最大3点
|
| 次アクション案
| - 営業担当者がすぐ動ける具体的な行動を最大3点
|
| 実行フロー:
| 1) 商談名/Id 解決
| 2) get_opportunity_by_name 実行
| 3) 正常 / 複数 / 失敗の分岐
| 4) コーチング生成 or フォールバック
if @variables.enable_opportunity_sf_read == False:
| 一般的なベストプラクティスに基づき、次の一手を提案します。

if @variables.currentRecordId is not None and @variables.currentRecordId == "":
| 商談名が見つかりませんでした。正式名称を教えてください。
if @variables.extractedOpportunityName is None or @variables.extractedOpportunityName == "":
| 商談名が見つかりませんでした。正式名称を教えてください。
else:
run @actions.get_opportunity_by_name
with [email protected]
if @outputs.errorMessage is not None and @outputs.errorMessage == "":
| 最新データが取得できませんでしたが、一般的な次の一手を提案します。
else:
if @outputs.Output_Found is not None and @outputs.Output_Found == False:
| 該当する商談が見つかりませんでした。正式名称またはIdを教えてください。
else:
| 取得した商談データに基づき提案します。
| 商談名: {[email protected]_Name}
| 取引先: {[email protected]_AccountName}
| ステージ: {[email protected]_StageName}
| 金額: {[email protected]_Amount}
| クローズ予定日: {[email protected]_CloseDate}
| 次の一手: {[email protected]_NextStep}
| 説明: {[email protected]_Description}
| 上記を踏まえて、テンプレートに沿って「商談の見立て」「懸念点」「見えていない観点」「次回提案で押さえるべきこと」「次アクション案」を具体化してください。
actions:
get_opportunity_by_name: @actions.get_opportunity_by_name
with Input_OpportunityName = ...

actions:
get_opportunity_by_name:
label: "get_opportunity_by_name"
description: |
商談名から対応する商談を検索し、主要項目を返します。
target: "flow://flowGetOpportunityByName"
inputs:
Input_OpportunityName: string
label: "Input_OpportunityName"
is_required: False
complex_data_type_name: "lightning__textType"
outputs:
Output_AccountName: string
label: "Output_AccountName"
complex_data_type_name: "lightning__textType"
is_displayable: False
filter_from_agent: False
Output_CloseDate: object
label: "Output_CloseDate"
complex_data_type_name: "lightning__dateType"
is_displayable: False
filter_from_agent: False
Output_Description: string
label: "Output_Description"
complex_data_type_name: "lightning__textType"
is_displayable: False
filter_from_agent: False
Output_Found: boolean
label: "Output_Found"
complex_data_type_name: "lightning__booleanType"
is_displayable: False
filter_from_agent: False
Output_Message: string
label: "Output_Message"
complex_data_type_name: "lightning__textType"
is_displayable: False
filter_from_agent: False
Output_Name: string
label: "Output_Name"
complex_data_type_name: "lightning__textType"
is_displayable: False
filter_from_agent: False
Output_NextStep: string
label: "Output_NextStep"
complex_data_type_name: "lightning__textType"
is_displayable: False
filter_from_agent: False
Output_StageName: string
label: "Output_StageName"
complex_data_type_name: "lightning__textType"
is_displayable: False
filter_from_agent: False

actions:
QueryOpportunityByIdOrName_OppCoach:
label: "Query Opportunity by Id or fuzzy Name"
description: "Read-only REST query to fetch Opportunity data via SOQL constructed into 'q' parameter. Returns Id, Name, StageName, Amount, CloseDate, Owner.Name, NextStep."
target: "api://SalesforceREST"
method: GET
path: "/services/data/v61.0/query"
queryParams:
q: string
is_required: True
from: @variables.soql_query
description: "SOQL query string"
outputs:
records: list[object]
label: "records"
description: "Matched Opportunity records"
errorMessage: string
label: "errorMessage"
description: "Error message if query failed"
QueryOpportunityByIdOrName_SOQL:
label: "Execute SOQL to fetch single Opportunity"
description: "Execute a SOQL query to fetch a single Opportunity by Id or exact Name via REST Query endpoint. Raw SOQL is passed via query param 'q'; platform will URL-encode."
target: "api://SalesforceREST"
method: GET
path: "/services/data/v61.0/query"
queryParams:
q: string
is_required: True
from: @variables.soql_query
description: "SOQL query string"
outputs:
response: object
label: "response"
description: "Raw HTTP JSON response including 'records' array"

Avatar for Yoshi

Yoshi

May 17, 2026

More Decks by Yoshi

Transcript

  1. system: instructions: "You are an AI Agent for internal sales

    support. Provide coaching and summaries about Opportunities based on user requests." messages: welcome: | Hi, I'm Agentforce! I use AI to search trusted sources, and more. Ask me "What else can you do?" to see how I can simplify your workday. How can I help? error: "Something went wrong. Try again." config: agent_label: "OpportunityReviewAgent2" agent_template: "EmployeeCopilot__AgentforceEmployeeAgent" developer_name: "OpportunityReviewAgent2" agent_type: "AgentforceEmployeeAgent" description: |このエージェントは、営業担当者や営業部長が商談を壁打ちできる社内 向け営業支援エージェントです。 主な役割: - 商談や案件の分析 - 競合対策の整理 - 懸念点や失注リスクの整理 - 見えていない観点の指摘 - 次回提案で押さえるべきことの提示 - 次アクション案の提案 このエージェントは、Slack 上での自然な会話を通じて、営業の思考整理と判断を 支援します。 担当する依頼例: - XX案件の分析をして - この商談を壁打ちしたい - 競合対策を整理して - 見えていない観点も含めて整理して - 次回提案で押さえるべきことを教えて - 営業部長目線でレビューして 担当しないこと: - 一般的なFAQ対応 - 商談と無関係な雑談 - 単なる短い要約だけを返す依頼
  2. language: default_locale: "ja" additional_locales: "en_GB" all_additional_locales: False variables: EndUserId: linked

    string source: @MessagingSession.MessagingEndUserId description: "This variable may also be referred to as MessagingEndUser Id" visibility: "External" RoutableId: linked string source: @MessagingSession.Id description: "This variable may also be referred to as MessagingSession Id" visibility: "External" ContactId: linked string source: @MessagingEndUser.ContactId description: "This variable may also be referred to as MessagingEndUser ContactId" visibility: "External" EndUserLanguage: linked string source: @MessagingSession.EndUserLanguage description: "This variable may also be referred to as MessagingSession EndUserLanguage" visibility: "External" currentAppName: mutable string description: "Salesforce Application Name" visibility: "External" currentObjectApiName: mutable string description: "The API name of the current Salesforce object" visibility: "External" currentPageType: mutable string description: "Page type (record, list, home)" visibility: "External" currentRecordId: mutable string = "" description: "The Salesforce ID of the current record" visibility: "External" VerifiedCustomerId: mutable string description: "This variable may also be referred to as VerifiedCustomerId" visibility: "Internal" extractedOpportunityName: mutable string = ""
  3. description: "ユーザー発話から抽出した商談名。毎回ユーザー入力から抽出し 直し、未設定の既存/コンテキスト依存参照は使用しない。" visibility: "Internal" enable_opportunity_coaching_routing: mutable boolean = True

    description: "Feature toggle to enable routing to Opportunity_Coaching; defaults to True in Preview." visibility: "Internal" enable_opportunity_sf_read: mutable boolean = True description: "Feature flag to enable read-only Salesforce Opportunity data fetch for coaching (default ON in Preview)." visibility: "Internal" soql_query: mutable string = "" description: "Composed SOQL to query a single Opportunity by Id or exact Name." visibility: "Internal" user_query: mutable string = "" description: "Raw user-supplied Opportunity Id or exact Name used to build SOQL." visibility: "External" intent_category: mutable string = "unknown" description: "Category of user intent for routing in start_agent" visibility: "External" knowledge: rag_feature_config_id: "" citations_url: "" citations_enabled: False start_agent agent_router: label: "Agent Router" description: "Classify user intent (e.g., CRM導入案件のコーチング) and route to the appropriate subagent. This router only performs intent classification and transitions; it does not call external actions." reasoning: instructions: -> | ユーザー意図/カテゴリを判定し、対応するサブエージェントに遷移してく ださい。 | このルーターは分類とルーティングのみを行い、外部アクションは呼び出し ません。 | 例: 「CRM導入案件のコーチング」「壁打ち」「競合対策」「失注リスク」 「次アクション」等はコーチング意図です。 | 要約のみ(要約/サマリー/簡潔/3行で 等)はサマリー意図です。
  4. | intent_category 変数が設定されていればそれを優先し、未設定の場合 は上記キーワードによる簡易判定を行ってください。 if @variables.intent_category is not None and

    @variables.intent_category == "coaching": transition to @subagent.Opportunity_Coaching if @variables.intent_category is not None and @variables.intent_category == "summary": transition to @subagent.Opportunity_Status_Summary if @variables.enable_opportunity_coaching_routing == True: transition to @subagent.Opportunity_Coaching actions: go_to_Opportunity_Coaching: @utils.transition to @subagent.Opportunity_Coaching go_to_Opportunity_Status_Summary: @utils.transition to @subagent.Opportunity_Status_Summary connection slack: empty subagent Opportunity_Status_Summary: label: "Opportunity Status Summary" description: | 商談の主要項目をもとに、Slack投稿向けの簡潔な商談サマリを生成する。 reasoning: instructions: -> |ユーザーが以下を明示的に要求した場合のみ、このサブエージェントを使用し てください: 短い要約 簡潔な要約 3行要約 例: - XX案件を要約して - 商談を3行でまとめて subagent Opportunity_Coaching: label: "Opportunity Coaching" description: | 特定の商談(例: 件名「函館コンサルティング_CRM導入案件」)について、必要な データの取得・分析と、その結果に基づく次アクション案の生成をこのサブエージェント内で 実行します。
  5. 本サブエージェントが、商談データの取得/分析、現状整理、懸念点・見えていない 観点の抽出、次回提案で押さえるべきこと、具体的な次アクションの提示までを一貫して担当 します(ルーターでは実施しません)。 ユーザーが商談の進め方、提案方針、競合対策、失注リスク、次回アクション、経営 層向け訴求、ヒアリング観点について相談したときに使用してください。 たとえば、以下のような依頼に対応します。 - この商談をどう進めるべきか壁打ちしたい - 競合対策を整理して

    - 次回提案で何を押さえるべきか - この案件の失注リスクを見てほしい - 経営層向け観点で整理して - 見えていない論点を指摘して before_reasoning: # Deterministic pre-checks to avoid None errors if @variables.extractedOpportunityName is None: set @variables.extractedOpportunityName = "" if @variables.currentRecordId is None: set @variables.currentRecordId = "" if @variables.enable_opportunity_sf_read is None: set @variables.enable_opportunity_sf_read = False reasoning: instructions: -> | You are a B2B sales coaching agent. | Always answer in Japanese. | Keep the response concise and Slack-ready. | | 機能フラグ: {[email protected]_opportunity_sf_read} が False の場合は、外部データ取得を行わず、一般的なコーチングのみ返答する。 | | 事前処理: | - ユーザー入力から商談名(Opportunity 名)を抽出する | - 日本語タイトル、英数字混在、アンダースコア(_) を含む名称(例: 函 館コンサルティング_CRM導入案件)を許容する | - 商談名らしき文字列を原文どおりの表記で @variables.extractedOpportunityName に格納する | | 解決手順(ターゲット商談の特定): | 1) コンテキストの @variables.currentRecordId が存在する場合 は、それを優先する | 2) それ以外は抽出した商談名( @variables.extractedOpportunityName)を用いる | 3) 名前照合で複数候補が返る場合は、最大3件の候補名を日本語で提示し、 ユーザーに選択を促す
  6. | | データ取得: | - 登録済み Flow アクション {[email protected]_opportunity_by_name} を使用する

    | - 商談名を使う場合は、ユーザー入力の原文をそのまま渡す | - 商談名を省略、翻訳、言い換えしない | | フォールバック方針: | - データ取得に失敗した場合は、次の注意文を先頭に付して一般的なコーチ ングを返す | 「最新データが取得できませんでしたが、一般的な次の一手を提案します」 | | コーチング生成ルール: | - StageName に応じて提案を具体化する | 例: 早期ステージでは探索質問と仮説、後期ステージでは意思決定者合意 とリスク低減 | - NextStep が存在する場合は、それを起点に次の具体的ToDoを3項目提 示する | - 不確実な点は「確認が必要」または「仮説」と明示する | | 応答テンプレート: | 商談の見立て | - 現状の整理を3点以内 | - 商談の進み具合や温度感 | - 現時点での勝ち筋の仮説 | | 懸念点 | - 失注リスクを最大3点 | - 情報不足や意思決定上の懸念 | - 競合に負ける可能性があるポイント | | 見えていない観点 | - 営業担当者がまだ押さえられていない論点を最大3点 | - 意思決定、予算、優先順位、導入時期、競合比較、運用負荷などの観点を 含める | | 次回提案で押さえるべきこと | - 次回の提案や会話で押さえるべきポイントを最大3点 | | 次アクション案 | - 営業担当者がすぐ動ける具体的な行動を最大3点 | | 実行フロー:
  7. | 1) 商談名/Id 解決 | 2) get_opportunity_by_name 実行 | 3)

    正常 / 複数 / 失敗の分岐 | 4) コーチング生成 or フォールバック if @variables.enable_opportunity_sf_read == False: | 一般的なベストプラクティスに基づき、次の一手を提案します。 if @variables.currentRecordId is not None and @variables.currentRecordId == "": | 商談名が見つかりませんでした。正式名称を教えてください。 if @variables.extractedOpportunityName is None or @variables.extractedOpportunityName == "": | 商談名が見つかりませんでした。正式名称を教えてください。 else: run @actions.get_opportunity_by_name with [email protected] if @outputs.errorMessage is not None and @outputs.errorMessage == "": | 最新データが取得できませんでしたが、一般的な次の一手を提案 します。 else: if @outputs.Output_Found is not None and @outputs.Output_Found == False: | 該当する商談が見つかりませんでした。正式名称またはIdを 教えてください。 else: | 取得した商談データに基づき提案します。 | 商談名: {[email protected]_Name} | 取引先: {[email protected]_AccountName} | ステージ: {[email protected]_StageName} | 金額: {[email protected]_Amount} | クローズ予定日: {[email protected]_CloseDate} | 次の一手: {[email protected]_NextStep} | 説明: {[email protected]_Description} | 上記を踏まえて、テンプレートに沿って「商談の見立て」 「懸念点」「見えていない観点」「次回提案で押さえるべきこと」「次アクション案」を具体 化してください。 actions: get_opportunity_by_name: @actions.get_opportunity_by_name with Input_OpportunityName = ...
  8. actions: get_opportunity_by_name: label: "get_opportunity_by_name" description: | 商談名から対応する商談を検索し、主要項目を返します。 target: "flow://flowGetOpportunityByName" inputs:

    Input_OpportunityName: string label: "Input_OpportunityName" is_required: False complex_data_type_name: "lightning__textType" outputs: Output_AccountName: string label: "Output_AccountName" complex_data_type_name: "lightning__textType" is_displayable: False filter_from_agent: False Output_CloseDate: object label: "Output_CloseDate" complex_data_type_name: "lightning__dateType" is_displayable: False filter_from_agent: False Output_Description: string label: "Output_Description" complex_data_type_name: "lightning__textType" is_displayable: False filter_from_agent: False Output_Found: boolean label: "Output_Found" complex_data_type_name: "lightning__booleanType" is_displayable: False filter_from_agent: False Output_Message: string label: "Output_Message" complex_data_type_name: "lightning__textType" is_displayable: False filter_from_agent: False Output_Name: string label: "Output_Name" complex_data_type_name: "lightning__textType" is_displayable: False filter_from_agent: False Output_NextStep: string
  9. label: "Output_NextStep" complex_data_type_name: "lightning__textType" is_displayable: False filter_from_agent: False Output_StageName: string

    label: "Output_StageName" complex_data_type_name: "lightning__textType" is_displayable: False filter_from_agent: False actions: QueryOpportunityByIdOrName_OppCoach: label: "Query Opportunity by Id or fuzzy Name" description: "Read-only REST query to fetch Opportunity data via SOQL constructed into 'q' parameter. Returns Id, Name, StageName, Amount, CloseDate, Owner.Name, NextStep." target: "api://SalesforceREST" method: GET path: "/services/data/v61.0/query" queryParams: q: string is_required: True from: @variables.soql_query description: "SOQL query string" outputs: records: list[object] label: "records" description: "Matched Opportunity records" errorMessage: string label: "errorMessage" description: "Error message if query failed" QueryOpportunityByIdOrName_SOQL: label: "Execute SOQL to fetch single Opportunity" description: "Execute a SOQL query to fetch a single Opportunity by Id or exact Name via REST Query endpoint. Raw SOQL is passed via query param 'q'; platform will URL-encode." target: "api://SalesforceREST" method: GET path: "/services/data/v61.0/query" queryParams: q: string is_required: True
  10. from: @variables.soql_query description: "SOQL query string" outputs: response: object label:

    "response" description: "Raw HTTP JSON response including 'records' array"