« Back to Universal Edition Training Forum

Re: Where can I go for answers to CVPD questions????????????

Combination View Flat View Tree View
Threads [ Previous | Next ]
I seem to be floundering when it comes to finding someone who can answer CVPD questions that come up in class. I know you don't want me to post questions regarding CVPD here, but where else should I go?

PLEASE tell me what the appropriate forum/email to use is. The more I can understand, the better job I can do disseminating the information to my students.

For example,

ReqIcmLabel element - student wants to know whether it's possible to use this element to send data to ICM in a Comprehensive CVP Solution. I know this element is meant for systems where ICM didn't preroute the call to Studio app, but that's not the question. The question is, whether it's POSSIBLE to use this element to communicate with ICM in the middle of a Studio app if ICM DID route the call into Studio app? And if someone could explain in some detail what's going on in ICM when the ReqIcmLabel element is used, that would be GREAT.

I also have a question on this element. Does a specific script need to be configured to run on ICM that the ReqIcmLabel invokes when it runs?

Thanks! Janine

I would be very interested in knowing if there was an answer to this given... I can't seem to find any useful information on the usage of the ReqICMLabel element...

So far, I haven't found anyone who has used or tried this element -- but I'm "sure" someone at Cisco must have tried it out before "releasing" it. So, there must be someone out there with some knowledge...

I actually found some information in the CAG (Config and Admin Guide for CVP).

The ReqIcmLabel element is for use in a CVP Standalone environment but where you want to request a route from ICM.

So it's different than the comprehensive environment. Here, ICM doesn't send the call in to the Studio application and doesn't route the call after the Studio app finishes.

Instead, the call comes into the Voice Gateway and then into the Studio app. If the app needs to transfer, it can use the ReqICMLabel element and pass all kinds of data to an ICM script (call peripheral vars 1-10, fromExtVxml 0-4, and caller_input). This starts an ICM script which will return the route information (a label) into Element Data for the Studio ReqIcmLabel {Data.Element.ReqIcmLabel.result}.

Then it's up to the Studio app to perform the transfer using a Transfer element and the information returned from the ICM script.

The CAG is not incredibly clear when it describes all the data that can be returned from ICM into the Studio element. The 'result' (label) itself is returned into element data {Data.Element.ReqIcmLabel.result}.

ICM can return more data using ToExtVxml [ J ] as "varName=varValue" pairs (the array can be up to size 5, J=0,1,2,3,4), in which case it becomes Session Data named varName with the value varValue.

ICM can also return data using by setting the Call Variables 1-10, then the data comes in as Element Data for the ReqIcmLabel element. The element data is named callVar1 callVarReturn1 (not sure of the exact case, and it IS case sensitive). Here's where the CAG is unclear.

I believe that if ICM returns call variable 1 = "varValue" then you'll end up with element data {Data.Element.ReqIcmLabel.callReturnVar1}=varValue

But that if ICM returns a name/value pair: call variable 1 = "varName = varValue" then you'll end up with element data {Data.Element.ReqIcmLabel.callVar1}=varName
and {Data.Element.ReqIcmLabel.callReturnVar1}=varValue

But, I haven't been able to test the element and the doc'n is a little unclear on the return values.

Anyway, the CAG ref manual tells you about the script to create on ICM to interface with this element, and you need to configure the Call Server also.

Hope this helps!
Janine

I did find that information as well, but the key information that is missing is where/how to configure what Dialed Number the ReqICMLabel element passes in the route request to ICM.

Apparently there was a thread on the NetPro forums on this topic also. If that lead pans out to a real answer, I will be sure to cross-post to this forum.

- Bill

Here's an 'educated'(?) guess:

I bet that you can pass it in the FromExtVxml 0 (or1,2,3) setting in
Studio ReqIcmLabel element, and it'll then be available in ICM's
FromExtVxml[0] array element.

Or you could pass it in the caller_input setting in Studio ReqIcmLabel
element and it'll be available in ICM's ECC variable
user.microapp.caller_input.

And the ICM script writer just needs to know which of these variables
will contain the information.

That's how most Studio to ICM interaction works.

Please DO let me know if you find out.

Janine

I just looked at the 7.0 Element Spec Guide, which has some info that I don't know that the 4.1 and 4.0 Guides had...

It does seem to indicate that the "caller_input" is what is passed to ICM as the route request, but I swear I had tried this already. I was trying to use "TEST1234", but the field in the element is a String, and the DialedNumberString field in ICM can certainly handle alphanumeric Dialed Numbers.

As a flow, here is how an ICM script is called:

1. Route Request is recieved from a Routing Client. In this case, I would assume the Routing Client would be the CVP Call Server.

2. ICM takes request and looks for Dialed Number String match.

3. If match is found, ICM checks for Call Type association for that Dialed Number.

4. ICM takes Call Type and looks for scheduled Routing Script.

But even as I write that, I think that the ReqICMLabel element is designed for use with CVP Standalone mode, which typically doesn't have an ICM PG connected, so there would be no Routing Client to associate with the request... I'm so confused!! ;-)

Hi Janine,

Today the ReqICMLabel functionality is supported in the standaone model only. Based on tests that I have done, it won't work in the comprehensive model today since the call server does not pass the ANI/DNIS up to the VXML Server as part of the VXML generated via the GS VXML template when starting the VXML Server sub-dialog(i.e. send call to VXML Server to run an app)

One could pass the DNIS/ANI today using the ToExtVXML vars array but then would somehow need to override the ANI/DNIS in CallData of the VXML app since that's the one that's used when the ReqICMLabel from VXML Server is sent to CVP Call Server. As far as I know, it's not possible to override the call data with session data.

Even if the change is made where this data is passed up to the VXML Server, the current implementation would not easily fit in the comprehensive call flow for the following reason.

Comprehensive call flow is as follows:

  • Call comes into CVP call server (SIP or H.323) with DNIS 1111
  • Switch leg dialog is setup with ICM and NEW_CALL request is sent to ICM
  • ICM responds with a VRU label on the switch leg
  • SIP or H.323 sub-system will send an outbound call to the VXML GW to setup the VRU leg of the call
  • VRU leg dialog is setup with ICM and a REQUEST_INSTRUCTIOn is sent to ICM
  • ICM sends back a RUN_SCRIPT_REQ on the VRU leg dialog (i.e. GS microapp)
  • Call server sends this VXML up to IOS GW which sends the call to VXML Server

At this point, since the VRU leg dialog from CVP Call Server to ICM is already setup and a RUN_SCRIPT_REQ is sent from ICM to CVP Call Server to start the VXML Server sub-dialog(e.g. GS microapp), we can do nothing but send back a RUN_SCRIPT_RESULT on this dialog.

Hence, the call from VXML Server has to be a new dialog with ICM(e.g. another NEW_CALL). But what DNIS should this request use? If the same DNIS(1111) is used, the same script that started with the call from Call Server will execute again.

So again, there are multiple solutions here:

  • If the original DNIS is used to send the ReqICMLabel NEW_CALL, the ICM script could be written with an IF block differentiating the NEW_CALL request from the call server vs. the request from VXML Server with some flag in the call/ECC vars.

  • Instead of passing up the original DNIS, we allow the script writer to configure a dnis on the request ICM label node which may be different from the original dnis in which case there's no need to pass up the original DNIS.

  • Now the user could run the same script with an IF node or another script in ICM based on this DNIS

Again, all of the above proposed solution is speculative as none of this is implemented today.

In terms of what's going on with the ReqICMLabel today in the standalone model, basically when a stand alone call in VXML Server today hits the ReqICMLabel node, a NEW_CALL request is sent to ICM via the CVP Call server with the DNIS/ANI of the standalone call. The script that's scheduled in ICM based on this DNIS will be executed. The RUN_SCRIPT_REQ nodes are not supported with the ReqICMLabel functionality. One can do other operations in the script such as DB lookup etc.. but in the end, only a CONNECT message from ICM is what's supported which includes the call context (call vars/ecc vars).

One of the key reasons behind the development of this element was so that a Self Service application can transfer its call to a separate full-blown Unified CVP system for agent selection and queuing. Full call context is preserved throughout.

For example, think of the CVP Standalone VoiceXML Server as just another routing client in ICM.  ICM can send any label to it including, for example, a translation route to VRU label.  Unfortunately you can't use Type 10 and SendToVRU here, because the correlationId won't be handled correctly inside the VXML Subsystem.

So the ICM routing script would do a TranslationRouteToVRU to the full CVP (which is Type 10), and because it is Type 10 it would do its automatic second transfer to the VRU leg.

The configuration from ICM's perspective is identical to doing a transfer into CVP from a 3rd party TDM VRU or ACD.

Hope this clarifies some of the questions!

-Harun

Harun -

Thank you very much for this detailed explanation - it clarifies many things for me, personally.

I'd like to suggest that some additions/enhancements be made like you suggest, unless you know of another method to accomplish the following (this is all from the frame of reference of Comprehensive with Call Services, which is our most common deployment):

In my mind, one of the key disadvantages/challenges with either CVP or IP-IVR is that the "Run External Script" is a synchronous and completely isolated process. In other words, a script running in either IP-IVR or CVP has no access to any ICM real-time data, and I think that is a significant limitation. Yes, you can break out of the script to get data, set variables, etc. and then run another script, and the caller experience can be quite seamless...but it makes the ICM scripts more complex, and it is a great deal of additional overhead in messaging and commands, since you are processing Run External Scripts and responses every minute or so. When you have even 50 or 100 calls in "queue" doing this - that's a lot of unnecessary overhead when we should be able to use the GED-125 interface or some other message set directly between CVP/Call Services and ICM to pull real-time data, rather than increasing the number of commands that the IOS gateways must process.

We know from SRND data that the number and frequency of Run External Script nodes is actually a performance/scalability factor in deployments. If we had a mechanism that would avoid the necessity for this in order to provide pretty common and simple functions like expected wait time or position in queue, etc. to the caller, then we could make our applications much more efficient.

Your thoughts?

Thanks in advance,

- Bill

Edited by: WILLIAM WEBB on Sep 30, 2008 9:36 AM

Harun,
Thank you for that very nice explanation of using the ReqICMLabel
element in Studio. I'll pass it along to my students.
Janine

Hi Bill,
 
Coming back to this thread after a while but it was such a good thread that I still haven't forgotten about it!
 
I think if the issue with ReqICMLabel in comprehensive mode is resolved, I believe it would give you what you're looking for since it would give the ability to query the ICM for a piece of data like what you mention and pass it back via call/ecc vars to the VXML server to be used in presentation to caller without any RUN_SCRIPT_REQ/RESP calls, right?
 
The question I have is if a ReqICMLabel is used, which sends another NEW_CALL to ICM, is one still able to accurately extract the data you mentioned from ICM(expected wait time or position in queue) for the existing caller?
 
Thx.
 
-Harun

Hi Harun -
 
You are correct in that with the ReqICMLabel creating a new call object, there is not much call-specific information that could be gathered, so its use would be limited.
 
It could, however, still be used to check environmental conditions in real-time, for example:
 
1. Are there Agents still logged into the Skill Group that this call is queued to?
2. Is there an emergency flag set (Global Variables, etc.)?
3. Are there any Agents available in an overflow group?  Maybe we only want to queue to that group if there are Agents showing available, etc.
 
It would be ideal if we could simply have access to the same real-time data from ICM in a Studio app as we do from an ICM Routing Script, but I think even in the absence of this, if the ReqICMLabel could be made to work for some basic data capture and exchange to/from a *running* Call Services app, it could open up some nice application possibilities that wouldn't require a separate "real-time" DB connection or other API into ICM.
 
Thanks again for the great follow-up on this!!
 
 - Bill

I was able to get ReqICMLabel to run a route script and return in a Comprehensive deployment.
 
In our configuration, when CVP gets the call (I have not yet tested all scenarios, so this may not hold true for all inbound call paths), the CallData.ANI and CallData.DNIS values in the CVP application are both "NA".  (you can also find what these values are by looking in the CVP application activitylog for the Subdialog Start element.  The value you care about is whatever DNIS is set to.
 
In the CVP app, I drop in a ReqICMLabel, passing whatever data via the settings (example caller_input="fromcvp") as desired.
In ICM -
- create a call-type for the script to run.
- create a dialed-number with value of "NA" for all your CVP routing clients.
- associate these dialed numbers with the calltype you just created.
- create a script and schedule it against the newly created calltype, returning a label.  I use dynamic configuration of the label to be able to set any value I wanted, I used a value of "TESTING".
 
run your CVP app.  It will breeze right through the ReqICMLabel step.  ICM monitoring confirms that the caller_input data came through (I put an if test in there to make sure).
 
Look in the activity logs, you will see ReqICMLabel_01,data,result,TESTING showing the data returning to your CVP app.
 
What do I want to use this for?  To set CallTypes from my CVP application when the appropriate points in the call flow happen, rather than try to send some sort of aggregate of all the call-types to set at the end of the CVP app, and then try to parse that data using just the ICM string manipulation functions.  I certainly assume this could be used to return the ICM statistics.
 
Note that this way, you can only have 1 ICM script for ALL ReqICMLabel calls.
 

Great post Brian!
 
It's almost frustrating that it was that easy!  I almost hate to admit that I probably spent 2 hours or more at a customer site trying to get this to work a couple months back!!
 
Anyway - thank you for this information!!  And you hit it right on - it would seem like this is sort of a "so what?" feature, but there's a lot that can be done with it.  It is actually, in some ways, more powerful than the standard interface of ICM/CVP with Call Services, since that is limited to ONLY the ToExtVXML ECC array with 5 elements.  With the ReqICMLabel, you can send all of that AND 10 Call Variables AND the "caller_input" ECC.
 
Cisco needs to figure out an interface more like this for the ICM-to-Call Services direction...!
 
 - Bill

I have a question in the way this correlates with CVP Reporting. I'm trying to get the CallICMInfo table populated, which contains RouterCallKey, RouterCallKeyDay, and RouterCallKeySequence number.

Would I use the ReqICMLabel step to pull this data into CVP for this table? I inserted the data into the ToExtVXML array. I received the below result; however, I never did see it populate in the DB table.
 
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,newcall,
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,ani,NA
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,areacode,NA
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,exchange,NA
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,dnis,NA
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,uui,NA
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,iidigits,NA
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,parameter,RouterCallKey=10756
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,parameter,RouterCallKeySequnceNumber=0
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,parameter,region=USA
10.1.91.31.1239059250740.1033386.DSiProgramming,04/06/2009 16:07:30.740,,start,parameter,RouterCallDay=149114
When I insert a ReqICMLabel node, I receive an error branch. This is probably because of my ignorance towards the step...
 
Any help would be greatly appreciated, as this is a very undocumented territory.

Unfortunately, this is not possible - it is the limitation with the ReqICMLabel step.  It is not necessarily intended to be used with UCCE/ICM and CVP in Comprehensive mode.  When you execute this step, it creates a new "call object" and record in the ICM system, so there will be no correlation between the RCK of the ReqICMLabel call and the original call that invoked the Studio application that contains it.  (Hope that makes sense).
 
Basically, the ReqICMLabel call has no relation to any other call.  It's usefulness, in my humble opinion, is largely in the ability to gather real-time and environmental information from the ICM without having to do the standard back-and-forth between ICM and CVP/Call Services.
 
 - Bill

I have some experience now with using ReqICMLabel in comprehensive mode to set calltypes, lookup current statistics on queues and to manipulate ICM global variables.  There are some gotchas to worry about, but there is a workaround.
 
First, in case some people are not aware of this, it is importnat to know how execution of your studio app really works.  When the gateway receives instruction to play media (Audio step) it immediately returns control to the VXML application rather than at the end of playing the media file.  This is to mitigate the gaps the caller may here inbetween audio steps if the gateway is delayed in retrieving the file to play from the media server.  So you can think of audio steps as "gateway, put this audio file in your play queue and then return".  This means that creating a studio application for queuing treatment can go haywire.  Lets say you have a simple studio application that plays an announcement followed by a few music files and then loops back to the announcement.  In ICM you queue the call and then run this CVP script.  The caller will hear the expected result, however the VXML server is madly processing the play audio directives and the gateway audio queue will fill up in a few minutes.  As far as I can tell there are only two things which block the CVP application from continuing execution until the caller hears all of the audio that is queued: a step that requests imput from the caller like Digits or Menu, or CVP Subdialog Return (basically the end of your script - and even then I am not completely certain that the RunExtScript node does not exit to the next node until the last audio file is played).
 
Ok, back to ReqICMLabel.  As it turns out, ReqICMLabel in comprehensive mode works just fine if the flow of your application is such that only one of these steps is encountered in any given CVP application.  If you put 2 of them back-to-back then the application will hang-up, the log's will freeze until your session timeout expires and the logs will say (in error) that there are bad-fetch errors in whatever media steps are after the second ReqICMLabel.
 
Turns out, you can use ReqICMLabel more than once if something blocks execution for a moment with say, a Digits or Menu step.  I have a 250ms recording of silence (use something like Goldwave to create it) and use a Digis step with noinput 1ms, max noinput/nomatch 1 and min/max digits 1 to put between the first and second ReqICMLabel if there isn't a way in the business flow to put a menu between them.  I use this same step in my queue applications to keep the execution of the program in time with the audio the caller hears.
 

Brian,
 
I am working on a similar situation where I need to get data passed to ICM in a Comprehensive deployment. I've got everything set up as describe in your post. But unfortunately I continue to get an error on the ReqICMLabel piece. 
 
I get:
ReqICMLabel_01,custom,doDecision,- The callGuid or DNIS is null.
 
From what I've read in these post and others it sounds like it should be taking the DNIS of the CallData shown in the start of the activity logs. As in your case I am getting "NA" as the DNIS, the log shows "start,dnis,NA".
 

start,newcall,
start,ani,NA
start,areacode,NA
start,exchange,NA
start,dnis,NA
start,uui,NA
start,iidigits,NA

 
Was there another step that need to be done to assign the DNIS to "NA" for the ReqICMLabel? Or is the dnis used for the ReqICMLabel automatically populated with the start dnis?
 
Thanks,
Nick