I'm just seeing two of project two of project. I don't know if it's just that my end or something. I'll leave it rejoined. Yeah, I actually joined the medical device. So that's why. Okay. Today is August 5th. We are in our third session for orbited training or orbited best practices. I know that we had some questions come over this morning. I saw them trying to find email. Andrew Morola. I'm not sure if you had a chance to look up those questions or if you looked at the email. I'm sorry. I'm reviewing on it. Okay. The first question was previously we used a function of store data before the flow manager node. I'd like to understand the current best approach for storing data in a modular way. How should we handle the data storage now within a modular project structure. I'll let you take it away. Yeah, and really for that situation, you'd want to use custom flux for that. There's no real needs. You necessarily have to have that logic happen in line in experience designer for the flow manager. So it would be and actually just can be a moment of the test project again here so I can. Visual as a talk, but. And I did not have a chance to look at the idea of an environment to see why the J new project is not deploying. So I'm just going to continue using sandbox 19 or 18 this week. Can everyone see my screen. Okay, now I forget if we created a test schema. Yeah, let's just go ahead and go through. The full example. So was there particular kind of data we want to store. Yeah, let's just call it on. Use your feedback. I'll just keep it very simple. I'll just say that the field is comment that we are recording. I'm a user. I'm a user feedback. Record schema. It's project specific. I don't know if I went over this. Last time, but there are there's a distinction of schemas at the project level and at the global level. So I went to the schemas page through the menu here on the left for the project. I created that schema that way. You can see it's not tagged with global like the others. So I click into one of these. You'll see that I can see the schema. I could trigger re index. I can't edit the schema. So there's separate menu to get into the schema section over here and sort of the global instance level menu. I can go in through here. Here you'll see that I won't see that one I just created for the project, but I'm seeing what are considered the global schemas. So they are shared amongst all projects. This is typically what we use for when creating schemas for our module system. But just something to keep in mind since I don't think it's really necessarily made clear. So I'm going to interface what is happening in those two, which should really probably indicate here that you know these are global schemas that is listings opposed to project specific ones. Okay. So let's go in. Actually, I guess let's fully flash this out. So I'm going to. We'll never do that customer like previously. Bring in input node. We have it. I'll just be multi-line. Text box field. I'm going to create a single input. The directive, you know, is where you can tell it what sort of input. You're looking for. So in this case, we should get a text box multi-line. I forgot to hand with the default is so we'll see if you can just that necessary. It could be single line. There are you can get input field presented with some validation tied to them for things that you know a number. The dates like there that sort of thing. You can also do a hidden input, which is essentially you just want to treat sort of the next open utterance from the user as the input for for this field. And that can be very useful in a lot of lot of situations. So. You do that open up our chat that again. Interesting. So. I'm sorry. So I checked off the. I had. I had thought that that was for hiding the message. But I guess that is actually hiding message. Well, together. I'm not sure your utilization option exactly, but. That's why I'm showing. I actually want to. I had it checked off. So let's go back to multi-line. So here we have a little text box for comments. I'm. I'm. Here to see example of looking for. So this I'm going to sort of give an example of taking sort of the last user utterance and storing that because the feedback comment. So. So with that. It's coming in. We'll see that it triggered as the free text intents. And it's here in the free text slot. So let's go back to our custom box. I'm getting rid of that. And I'm just going to have it spit out the payload. So I know exactly what sort of structure will be for. So. And. That's all to forget. So that can see our. And we can see that. You custom mode using the exact sort of name we gave the hook. So. Just this again. Okay. So. Now we see what I'm going to start feedback hook. Here's a spinning out of the payload. So let's see the exact text. From sort of the last user utterance in a few different positions. So we saw it's in. So. It is here in this query result field as query text. It's also here in the request field, which I think is the dialet flow generated one. So it's a bit deeper down under the intense slots free text value for the sake of simplicity. I'll just go with query result query text. And it's a higher level up. So yeah, we'll just say that our comment. It was message. So. I'm going to build a data object on the payload. So this is something that isn't necessary. Actually, I can't remember. Maybe it is covered while one documentation. And if I recall correctly. Yeah, Mark, did we have engineering looking to. Why the help isn't displaying on the nodes. I know it'd been brought up, but I forget if we found any information out about that. Yes. That was hosted. On a website. And when they move the website hosting provider to a new provider, someone may have forgot to also move the help. So I know that they were looking into that, but I don't know when that's going to get resolved. So yeah, I'm not sure whether or not it would have displayed here, but essentially so I'm going to build a data object on the payload that when this gets passed into a dynamic data node, this will be. The data that is used to actually try to build the record. So going back to our schema are one field here. The key is comment. So we will just have our. Data, the R1 little comment string here. And then we'll send it onward to any dynamic data node. I'm going to select feedback. As our schema here, I'm going to have it do create. I will clear out this. So essentially at this point, it's going to be reading from message.pale.data. I'm not trying to utilize anything here in the node. I'll just put a little debug node here for so we can take a look. And verify record is being created. And then pass it on to sort of end the response here. So this is one of these examples of a hook that is now extending the logic of the hook is extending over a few different nodes. So go ahead, say that. Try it again here. So it's calling the sort feedback hook. Here is our debug on the other side of the creation. So we should see here, we're seeing data. I'm seeing. Actually. Speed up the complete message for a moment. So I'm just going to show you where you can sort of look for the confirmation of the created record. And then do another one. So here in message.data, you will get back information from the dynamic data node. And this is giving you in this case, and so it was created. It's giving you the information about the record that was created. And then you can see that the record I could hear and other things and what data. It was in it. Now we go back over experience manager for a moment. We're going to see that. We're going to see records have started getting created. Another good thing to point out here is you'll see that these records are being recorded as global records. And then necessarily impact your ability to pull that data. But technically. We're being proper. What I should have done here is we have the reference to the project context. One thing that is stored in that context is the ID as part of my data. And then we're going to add in project ID as stored as an array. It's not something that. It's not something that commonly comes up technically content and could be associated with multiple projects. Or at least that was the intention earlier on the product. But yes, the project ID is an array of project IDs. So I'm just going to initialize this here with one entry, which is going to be the current project ID that I'm grabbing from this project context object. So I'll go ahead and save that. Do this one more thing. Refresh review here. And now you can see that so this item does not have that global flag. This is specifically tied to this project. And yeah, so in each of these are comment has been getting stored. You know, same principle applies to any sort of complex data that you would want to create. You just need to build your schema for it. Build your data object. For the record pass it through a dynamic data node. Sort of the basic of how you create records through. And then you can find the data nodes. This. In flow executions. This should be your primary sort of pattern for that creating hooks to do that. You know, I have created hooks before that. You know, we'll do this or something similar in a more generic. Like say you're doing a series of. You know, series of inputs from the user. And you all want to store into the same record. You know, you might do a hook that's more something like, you know, store form response with a parameter indicating like, you know, what the field is, right? And just sort of stick this after every input and have a hook that then goes. And you know, perhaps is building an object in session with each of those values that then, you know, stores it in a record at the end, or I mean, you could go and, you know, do an update on a record after each. Answer, you know, the other options in the dynamic data now. There are updates there inserts. So you have flexibility with how you actually want to store that data. But yeah, that's that would be the basic approach I would suggest for that. Any any questions around that. So, Andrea, I just want to, I just want to make clear for some, is no type questions see or search choose many or choose one options. What happens is what we do what we have done in initial what in our project is as soon as user responds, we directly collect their data. Before we get directly we collect their data instead of using custom MOOC by using the control name. Is it possible that we can do it in this too? I mean, you could still use the control name. Yeah, so were you going through like the flow info objects to get that. What we were doing is before flow manager, we were adding one function and in that function. We were by using control name, we were fetching data. We were using the user selected or user have selected. Yeah, so I mean, there's there's no reason that it needs to happen in a function before the flow manager. So your two options for sort of tying into this modular approach are either you create a custom hook. Or there is a handler available here that sort of fires after the response comes back from flow manager. So you can see the points at which you, you know, you could also tie in and do something similar. And yeah, so all that information you might have been tying into previously is still available. You can see here in this debug it's going to be under the orbida session flow information. And you'll see, you know, the current control ID, you will see in this array of. So that's all accessible if you still want to sort of use the more raw data. But yeah, as very like cooking into the module system for that, it would either be custom hooks or the. After flow response handlers that are available here. Okay, then we can collect that data in this handler hook in this handler function. Yeah, yeah, you could do that. And we can store it in our orbit. Session. Yeah, you can store whatever you want in the session object. Okay. And yeah, that doesn't change you would, you know, still just set whatever you want to message that orbida session and that will still persist between requests. Okay. Any other questions around this piece. So I think I'm going to jump to question four and then we'll come back to the other two because they kind of go together. This is about how adaptive cards are created and handled within experiences on. Let me. Let me see if I can find a good example to start with for head to active card is opposed to building one from entirely from scratch. Here we call any projects that are using the title many of the top of your head. Said. So would. Again, Let's have screen and just grabbing some sort of starting example. surgeon. Okay. So adaptive cards, I think they came up before has, you know, they are potential mechanism for. Sort of more custom input forms, for example, and other things. So. I'm going to check the menu. I'm just going to save this. And so what I'm going to do here is I grabbed an example. Another project there is an import export feature here. So this is Jason that I grabbed from existing. Existing adaptive card example elsewhere. So we're going to bring in here. So the basics of the adaptive cards are. And this is a, am I saying this is a framework that comes from Microsoft. I believe so. Yeah, it's been a long time. I'm not a framework that I believe Microsoft developed for sort of, you know, an informing universal sort of. UI elements building for. I don't know if it was some particular product of theirs that it was originally derived from. But. You're going to see. You have your elements over here. You are elements, you know, you can drag in. You can see here this structure here is an adaptive card with a series of. There is a column set that has two columns here. For some reason for each row. It's interesting, but the episode this here is a column set of two columns within that there are the two columns within each column. There is an image. There is a text block. And each of the images here. So sorry, I'm sorry, I'm sorry. Make sure it. Okay. So the way this one is structured is. And there's the column. The column contains the image and the text and tied to that column to sort of encompass both of those is an action. And this is action dot submit, which is the action for clicking on something. And it's then. Figures a submission of this data here into orbit. That is sort of the most common action that we typically just utilize this for like a said custom form data. So I can't really speak that much to the other actions. So typically if it's an element that you want something to happen when it's clicked on, you're going to be using the action dot submit action. And the data here, let me just get this out into a clearer view since it's welcome press there. Yeah. So the data here that's going to be submitted is in the form of message and event name. And so the event name is important because that is what will tell orbit. You know what intent to fire. If we go back to the intent library for a moment. On any intents in here. You can specify event names. And then, you know, by submitting a message to orbit of with that event name, you could fire that event. So that is the mechanism that you'll see is most commonly used for. For adaptive cards to sort of tie the interactions here into specific intents back in orbit. So yeah, that's sort of the basic structure and how the interactivity is specified. You'll see here that there is sort of the JSON definition for all of this that we built up here with the UI itself. You can see there's the breakdown here of here is the body of the adaptive card. Here is that column set. The first one we took refer to here within it are columns within sort of this first column here. Here's the definition for the image and a text block and the action associated with them all of that. The other mechanism you'll see in here is that there's a lot of templated references to. This dollar sign root dot labels dot doctor's appointments. So this is referencing over here. To this what we have a sample data here, including labels that were pulling up. And links that were pulling up. So you can have one adaptive card and apply different data to it. So for example, if this was like a multilingual situation, you would have like the set of English labels and you would have the set of Spanish or other language labels. I'm the guy applied. So I'm going to go and save this. So as for how these get utilized. With an orbit. And we'll go and so over in flow studio, we have the adaptive card. Node. And. Just. Let's put this in place. So this one is certainly be that functional without having sort of set up intents to tie the. Tie the actual actions to be let's just take a look at what gets presented here. Okay. So you can see here. It has displayed it. It also has moved right on. So the adaptive card is not necessarily explicitly considered an input. So it will just move on to node after it. You would typically probably want to do something like have a single input node here. And this is why I mentioned earlier with the hidden input type. So we are going to call this hidden. So now there is input node waiting. So we are going to do something with the adaptive card. So if I refresh. And you can. So. So. With these sort of things, it's hidden single input nodes. It does require some text to be filled in. So in this case, I'm just saying an a and I'm going to hide the message bubble. So this is what that option is for. It is for hiding. The message bubble in a case like this with the sort of hidden input node. So now we have our main menu and there's that sort of hidden input that's just kind of holding things up until the user does something like this. And if I click on one of these, you're going to see something submitted. The project doesn't know what to do with it because we haven't built it all in terms. But yeah, so this is what gets presented. You'll see here it's using the text. We sort of put in place for the sample data. For the adaptive card down here with the doctors and appointments. So this is essentially it's labeled here as sample data editor and it's good for testing purposes, but it also is your default data for that adaptive card. So if we wanted to get into applying different data. That's not an option from the flow studio node. So here is just you select your adaptive card. It gets displayed. If I wanted to, I could create a custom hook. You know, you could just create a custom hook. We call it mean menu. I'm sorry, fully build this out. But within experience designer, there is an adaptive card node. And so here. Similar to the flow studio known we're going. We are selecting an adaptive card. It gives you your nice. So you can see the application here as to what it. You have the adaptive card. And you see the template data down here. So in let's say that multi-lingible example for. You know, by proposed. You would go in here. You would pull up your adaptive card. In the next node. You would have a function node after this. You would have to write this template data. With your language specific template data. As I was taking you know this property from the payload is going to be created by this. Replace it with say your Spanish labels. And then just haven't moved on and return that is the response. So the adaptive card node in flow studio is sufficient for, you know. where that template data doesn't need to change. If you do need to swap that out dynamically, you're going to need to create a hook on the backend using the experienced designer version of the adaptive card node and then do your manipulation of the template data. Yeah, those are the basics, really, of adaptive cards. Yeah, let's see if there's anything else worth mentioning. Yeah, like I said, our primary use of this is, you know, I think our most common use has been custom sort of navigation menus. Like this for customers, but then there's also the occasional sort of form input. You have your additional like inputs, you know, form inputs tax date time, et cetera. So we needed to, you know, gather a few different pieces of data all of us, as opposed to multiple input steps. That's another potentially use case for this. Any any questions around adaptive cards? Yeah, if we have a forming adaptive card, let's say, input, single input field or multiple input fields. How can we catch that data in the code? That's a good question. I'm trying to recall off the top of my head. I believe. I would need to look at the exact mechanism, but I believe what you would do is. Within here, you have your action, you have your message, you're building. You would still want to have sort of custom intent to capture input from this adaptive card. And the message you would just form a JSON object here pulling the value from a different inputs. Using the JSON. I guess the phrase for this is maybe it's JSON, it's not JSON paths, it's. But whatever this on dot syntax is to access the input, I just need to. I would need to review what the actual property syntax there is. It's not dollar signing fruit. It is there's something else to access the field values there. Let me see if I can. Yeah, it doesn't necessarily give. Yeah, I would need to look into that a bit further to. Give you specific examples to how to do that. Good question, which well maybe what we can do before the next session is to send Andrew like an specific example from one of the projects. So you know, he can look at that. Yes, that. Thank you. And I also want to ask about the card payload editor that Jason. I just want to. Detailing permission over the JSON, how does how did Jason came in how is it aligned. Or by selecting the card element, what Jason comes and how it errors over here, how can I modify it. I mean, this Jason gets built automatically as you drag elements over here. Like you can see I just drag this input over here. And now at the bottom of the array here, there's my input for that. If I were to remove this, that will go away. So yeah, this is being built automatically. You can, you know, you can edit it down here. Right, I could go and say for, you know, this text box, I could just change this to some, you know, hard coded test value. And you're going to see it updates up here. Obviously, the caveat is that, you know, there is a very particular structure here. So if you're editing, you know, down here, you don't necessarily want to deviate from the structure that has been generated. But yeah, you can sort of edit in both places. I trying to think, I mean, the, you know, the ordering here in this array does matter. If I were to go in here and, you know, let's say, take this second column object here. Well, one I removed it so you can see it's temporarily, you know, gone up there. But if I were to move it into the first position, now there's all places. So yeah, a reordering does matter. You know, the, so the column sets are in a particular order in the array of one, two, three within the each column set. There is the particular order in the array of column one and column two. But yeah, you can, you can edit it down here and you can expect sort of real time updates. Each time a change is made. But you are tied to. I mean, I think if you were to, I guess an interesting question I'm having here is if I was to add some new data on here. It won't block at that. I don't know whether or not it would carry that through. Let me see if that persists. Yeah, it does. So you could potentially add additional properties to the objects that looks like and they don't necessarily get stripped out. They're obviously ignored for presentation purposes, but you know, there are some potential interesting things you could do there. You know, this would really only be applicable. It's not going to be applicable if you're using the flow studio. Adaptive card node, but if you were to use the experience designer one and then do some manipulations some afterwards, you know, that leads to some interesting possibilities. But yeah, that's like I said, this is I'm sure there must be sort of us back for the language definition somewhere. This is. I know, let me just do a quick search. Okay, so there is this whole website here. Dedicated to this, like I said, is Microsoft initiative. There's this whole schema explorer here for this version 1.3, which appears to be the latest version that we support. And I would think anything here would be applicable in our adaptive card framework. Can't say that 100% for certain, but I don't think we necessarily made any changes to it. So yeah, you can utilize this as a resource and. Any Json that you come up with for it or you know, perhaps if you find I'm sure maybe there are libraries out there of adaptive cards that people have built. You should be able to utilize it in here. And I'll. Link to this. Anything else on adaptive cards. How can I store it in my message object. If you, sorry store what specific in the message object. If I have selected some data or. I want to keep a note of that in my message object that user has selected data some data or whatever. So in this job, where I can get it. Just take a look quickly here. So when I click on one of these. The message is just coming through. Well, in this case, it's. So in this case is coming through as input on now, we do we haven't set up an intent specifically to catch it. But you can see the whole Json event message is available here. So you could have a function node in place to sort of grab that from the message.polo.quest. Obviously this will sort of change depending on what you're sending in. None is. That's interesting. So that actually I guess isn't the appropriate. Yeah, so that's on to me that that is coming through as root dot label. It's coming through as the template is opposed to the actual value. Let me just take a look at something here. So. Yeah, that sort of template in place might not actually be valid. In the data field itself. Yeah, like I said with the sort of form inputs, I'll need to do a bit more digging. But to answer your question at a high level, whatever data is submitted. From the message object is available as part of the request object here in orbida. So I'm just checking on how to actually sort of properly manipulate that message object. And not to include input fields, for example. But once that is settled of yeah, it'll be it'll be available here like any other sort of intent request. So we have about 10 minutes. I would like to move on from adaptive cards to just kind of talk about setting up a base project. And as well as the migration of using the check end and migrating of projects from dev to production. So setting up a new project. I don't know if anything has changed recently, but you know, it's not it's not something that can be done by customers completely independently. So you know, if I so in orbida in experience manager in this main view here. There is the new project field on the head and create one. And sort of a simple is that my project is created. You'll have access in here to everything we've been looking at the person experience manager. An experience designer, you can see like a new experience designer setup has been created here with all these sort of default example tabs. So you can certainly create the new projects and start developing units on your own like that. The two key pieces are sort of these modules you've been showing. We would need to sort of set up with our internal tooling, the deployment of those modules. Is not exposed through experience manager here. And once you actually want to start testing this project, the deployment we would need to assist with the creation of a Google dialogue flow agent. And get this connected to that. So kind of very basic level. It's as simple as you know, your project, the element call whenever you want and then you have your project to go and develop in once it comes to actually getting it fully functional and getting those modules in place. That's where you would need to sort of submit a request to us for that. So really, when we create a new project, we get a very basic experience designer. Now we have to convert it in a way a modular way as a new approach as we are going to follow. And how can we implement it? What are the things we need to keep in our mind while converting it from basic to a modular way that was actually my question. Yeah, I mean, these tabs are going. These tabs would have no real relevance in the modular system. So. Essentially, the system should be you create the project. You would request that we sort of deploy out the modules that you are looking to utilize with the understanding that obviously we can update that later. And then these. So at that point, you would get your sort of CS modules tab with all these other module tabs. In place. And then you would just get rid of these and then start building out things like your custom hooks custom handlers tabs. But that first step is going to sort of require intervention from us. If I want to do that changes, would I be able to do it? I mean, I, yeah, like I said, the modules are. The tools around the modules are not exposed in experience manager. So I mean, you could copy over modules from a new project that you have into your new project. If you are careful about that. So we can go to another project here. So yeah, if you were to go into your experiences, I know another project where the modules are established. And if you copied over the CS modules tab as well as the individual module tabs that you know. Cut all of them and we're careful about that. Yeah, you could copy them over manually into a new project. But ideally that initial setup should be done by us. Yeah, I was going to say the easiest thing to do is just to be. To set up a submit a support request will then go ahead and deploy it won't take very long to do that. And then you should be able to rock and roll to continue after that. But just let us deploy that base, the base modules. To your to your new project. Okay. And then Andrew from a version control standpoint, what would be the process for them there? So I mean the version control is going to be we would need to have a hand in the initial setup just with regards to. You know what repository what back in repository you want to use. But if you had like a you know bit bucket or get hub repository, you could point us to. We could do the initial configuration. And then once that is in place. You know we can put a module in place for you not sure if this will work as it is. Let me take a look. Okay, it's not configured currently, but. Once once we've gotten the sort of it pointed at whatever back in your repository you want to use. Then we will put in place the module like this for version control. That let me just go else where to show you a working example of what you would expect to see there. So it'll be something similar similar to this where you will have options to. These are actually okay. You'll have options to sort of do a commit preview. And this will. Take all of your current project code. Do this sort of deconstruction process that we've created. And give you a comparison for what has changed. Some of it will inevitably be sort of noise and irrelevant like you know here the chat box settings were touched without changes. So it's just the modified update. God updated, but ideally you know it should be for the important stuff like if we. See if I can find an example in here. It will break down all of your function nodes in the experiences. I know for example, I sort of show you what has changed. In there, so like you can see here like this. You know, each function node experiences I know through this deconstruction process gets broken out into its own JavaScript file. So you can see changes hopefully pretty clearly. Anyway, once this is all configured, you'll get an interface like that. That will be accessible to you sort of within the project utilities. You can go you can review. You know, if you are happy with. The changes it is showing you can then submit a snapshot where you indicate. And this is there's a geraticket field is just sort of a carryover because initially all this tooling was just internal for our purposes and we use Jera for issue tracking. You can just ignore that field. You can do your commit message. And then within your repository, it will create different branches for your let's say dev stage and prod. And you will get options to deploy. Say you know check in something to the dev branch. And then you can either have a process where like you internally do a, you know, pull request and merge stuff over into your main branch and deploy from there. But you can also just sort of deploy directly from let's say you know the development branch up to whatever your other configured stage or production environments are. So yeah, if we, if you can, you know, want to set up your repository on your end for test purposes, we can get that configured and give you a more sort of concrete demonstration of that. Okay. So, so any other sort of last questions here looks at most other time. Yeah, we kind of a time. I think what we'll do for the next meeting prepare again, you know, additional questions, but also will maybe stand in advance some examples. Yeah, like if you can send that example, you had mentioned of like what you would want to try to build out as an adaptive card. That would be great. So the thing is, is if you have a, if you're going to set up a new project for converting one of the chat bots or doing some prototyping, just let us know. But you don't have to wait till next Tuesday, if you put it, if you want to get the modules assigned to that new project, actually got everything set up and let us know and I can just put a sport ticket and we can go ahead and deploy that. So you can play with it this week before next week in case you have any questions. So I think we need to do that just when starting development or when moving from development into production. Because we do have a new project that you know development has has begun. And I don't know if that, you know, if it's necessary to do that set up right now with the modules or wait until you have a layer point of time. Which wall if you have a point of view as well. Sorry, I can just put it. Well, with the new Gilead project, I don't know like this, this kind of module set up that that orbit needs to do if it makes sense to do this now or if we should wait until. So we're further into the process. We can wait till next two days. So it if I'll kind of based on this discussion. So my interpretation and you guys confirm whether that's correct or not. So we'll need to have this modular, you know, set up done even during development. So it's, you know, we'll be too late to wait until we're ready to move it in production. Is that correct? Yes. Okay. You'll you'll want to do it before while you're in development, because that's it does make it because it just saves you so much time and then all your testing is done and then what you might and once you validate that everything's working the way you want. And the migration of everything up is pretty easy and you're done doing it after your development is like restarting the project in a way, right. So if you've got a new project that you're getting ready to get started on or you just started on, I think it would make sense to apply those modules and then just sort of adjust what you've done to incorporate that. And then move forward from that so that everything is in place per going forward. That's my recommendation. Okay. So team, let's discuss tomorrow at our DevOps, you know, what's needed to prepare for that. I apologize, I have to jump on another meeting. Thank you. Thanks everybody. Thank you. Bye. Bye.