feat(contact-center): Implementing get suggested response feature within CC SDK#4952
feat(contact-center): Implementing get suggested response feature within CC SDK#4952Kesari3008 wants to merge 4 commits into
Conversation
…responses feature
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f171b6631e
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| const eventName = context | ||
| ? AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT | ||
| : AIAssistantEventName.GET_SUGGESTIONS; |
There was a problem hiding this comment.
Derive suggestion event from trimmed context
getSuggestedResponse() chooses ADD_SUGGESTIONS_EXTRA_CONTEXT based on the raw context value, but sends context?.trim() to the backend. If callers pass whitespace-only input (common from text fields), this emits the “add extra context” event with an empty context payload, which can be rejected or ignored by the AI service instead of issuing a normal GET_SUGGESTIONS request.
Useful? React with 👍 / 👎.
| case CC_EVENTS.POST_CALL_SUMMARY: | ||
| case CC_EVENTS.MID_CALL_SUMMARY: | ||
| break; |
There was a problem hiding this comment.
Emit summary RTD events instead of dropping them
This switch now explicitly swallows POST_CALL_SUMMARY and MID_CALL_SUMMARY RTD messages. Before this change, RTD payload types were re-emitted to the task, so these events would reach SDK consumers; after this commit they are silently discarded, which prevents any listener from receiving summary payloads even though these event constants were added to CC_EVENTS in the same change.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 48f08b217c
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| case CC_EVENTS.SUGGESTED_RESPONSE_ACKNOWLEDGE: | ||
| // TODO: Handling this event | ||
| break; |
There was a problem hiding this comment.
Emit suggested-response acknowledge events to tasks
CC_EVENTS.SUGGESTED_RESPONSE_ACKNOWLEDGE was added as a task event, but this switch currently swallows it instead of re-emitting on the task. In environments where clients wait for an acknowledge before updating UI/request state, those listeners will never fire, so consumers cannot observe the backend acknowledgment despite the event being part of the exported event surface.
Useful? React with 👍 / 👎.
Shreyas281299
left a comment
There was a problem hiding this comment.
Mostly looks good. Just 1 think that might be a privacy issue.
There was a problem hiding this comment.
Do we need this ai-docs? These 4 files dont seem to fit with our ai-docs structure,
| break; | ||
| case CC_EVENTS.POST_CALL_SUMMARY: | ||
| case CC_EVENTS.MID_CALL_SUMMARY: | ||
| break; |
There was a problem hiding this comment.
Are these todos? If yes can we put some jiras for these todos
There was a problem hiding this comment.
There are no JIRAs for these I think, I just added them because they will be implemented in future so I just added their case. I will remove the TODO comment
|
|
||
| return 'en'; | ||
| } | ||
|
|
There was a problem hiding this comment.
I dont think we should be accessing global like this. Ideally we should have a default and then we can ask customers to set a language using a public method, rather than accessing their browser window. Might get flagged as a privacy issue
There was a problem hiding this comment.
Also, this can be moved out to a util file. We should keep the core logic in this file
There was a problem hiding this comment.
Agreed. I missed it's implementation, fixed it now
There was a problem hiding this comment.
- Based on the data processing complexity handled in the samples app, should we consider handling that inside the core sdk logic itself and provide a processed data to the end application for easy consumption ?
- Please see if need to clean up the newly added ai-docs files
- Also, the JIRA link is missing, please update the PR description
| const transcriptEntries = []; | ||
| const MAX_TRANSCRIPT_LINES = 200; | ||
| const MAX_AI_ASSISTANT_ENTRIES = 50; | ||
| const registeredTaskListeners = new WeakSet(); |
There was a problem hiding this comment.
Q. Why are we using WeakSet and not regular Set ?
|
|
||
| const transcriptEntries = []; | ||
| const MAX_TRANSCRIPT_LINES = 200; | ||
| const MAX_AI_ASSISTANT_ENTRIES = 50; |
There was a problem hiding this comment.
Q. Is this value set only for the samples page or this is the recommended value ?
|
|
||
| function trimAiAssistantEntries(state) { | ||
| if (state.entries.length > MAX_AI_ASSISTANT_ENTRIES) { | ||
| state.entries.splice(0, state.entries.length - MAX_AI_ASSISTANT_ENTRIES); |
There was a problem hiding this comment.
Are we not keeping this data paginated ? Or is this because this info has to be short lived and agent does not have to scroll through to get the whole transcript at any time
| } | ||
| } | ||
|
|
||
| function getAdaptiveCardTextLines(node, lines = []) { |
There was a problem hiding this comment.
Should we add js-doc with info on the structure of data it receives for node and lines ? It will be easy to understand the implementation with that since it's a recursive function
| appendRealtimeTranscript(payload); | ||
| }); | ||
|
|
||
| task.on('SUGGESTED_RESPONSE', (payload) => { |
There was a problem hiding this comment.
Should we keep the event name consistent with other casing ?
There was a problem hiding this comment.
For AI assistant features, they are independent features so they are realy tied 1:1 with task. All the task related event are received in terms of AgentContact or similar but these events are handled in different manner and their payload also differs quite a bit. These events are also received on different channels. Due to these differences, we are keeping different naming convention for these events
| task.emit(payload.type, payload.data); | ||
| break; | ||
| case CC_EVENTS.SUGGESTED_RESPONSE_ACKNOWLEDGE: | ||
| // TODO: Handling this event |
There was a problem hiding this comment.
Do we have to address this in this PR itself or planning for future? We can add JIRA ticket link if needed to be handled later. We should add a log for the cases where it's silent
There was a problem hiding this comment.
There is no Jira link for this. I added listening for this event just because this gets used to indicate whether AI assistant is in thinking or listening mode. But that's somehting we can keep internal to SDK hence in terms of implementation of this event, at present nothign is needed from the payload of this event but m not sure about future so just added the case for future refernce
There was a problem hiding this comment.
Removed these events for now
|
|
||
| return 'en'; | ||
| } | ||
|
|
There was a problem hiding this comment.
Also, this can be moved out to a util file. We should keep the core logic in this file
| LoggerProxy.info('Requesting suggested response', { | ||
| module: CC_FILE, | ||
| method: METHODS.GET_SUGGESTED_RESPONSE, | ||
| interactionId, | ||
| }); |
There was a problem hiding this comment.
We can also add debug log for success and error log in the catch block. loggerContext can be reused as separate variable
| { | ||
| agentId, | ||
| orgId, | ||
| interactionId, | ||
| eventName, | ||
| trackingId, | ||
| context, | ||
| }, |
There was a problem hiding this comment.
This info is repeated in success and failed cases. We can create a const with common fields
| if ( | ||
| this.agentConfig.aiFeature?.realtimeTranscripts?.enable || | ||
| this.agentConfig.aiFeature?.suggestedResponses?.enable | ||
| ) { |
There was a problem hiding this comment.
Should we update the associated TODO comment ?
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5efa0fc964
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| * @public | ||
| */ | ||
| public async getSuggestedResponse(params: SuggestedResponseParams): Promise<any> { | ||
| const {agentId, interactionId, context, languageCode} = params; |
There was a problem hiding this comment.
Default suggested-response language to English
getSuggestedResponse() forwards languageCode as-is, so when callers omit it the payload sends languageCode: undefined instead of the documented default ('en'). This changes behavior for the common path (no explicit language) and can cause backend routing/locale selection to be inconsistent or rejected if the service expects a concrete code. Add a local default (for example during destructuring) before calling sendEvent.
Useful? React with 👍 / 👎.
COMPLETES #< INSERT LINK TO ISSUE >
This pull request addresses
Implementation for Get Suggestions feature
by making the following changes
Change Type
The following scenarios were tested
https://app.vidcast.io/share/dc286450-408f-49d8-99b8-cf8b983db293?playerMode=vidcast
The GAI Coding Policy And Copyright Annotation Best Practices
I certified that
Make sure to have followed the contributing guidelines before submitting.