We are recording now. So I finished studying up the demo project yesterday with the framework. So, and I was wanted us to see if you've had a chance to look at it, walk through it, ask any questions on how you might want to implement something and just kind of use this as that's for that session. So, I didn't see any specific questions ahead of time. Again, Andrew is going to be out of town the rest of this month, our vacation next week and the week after that. So we won't be able to be able for a cause. So I wanted to give this one last session before he goes on vacation. So, if you had a chance to review the projects. Hello, I have some questions regarding the new model way. My first question is the could you provide a summarized explanation of how the new modular experience designer works. So, was the question explaining how experienced designer works. I'm sorry, I didn't quite catch all that. Yeah, I think the question was how the modular does it experience design works. Is that right, Pratik? Yeah, you see, is that I. I feel like we've gone through this a couple times, but Andrew, can you bring up that project and just walk through the few tabs that we have there. Yeah, which I'm sorry, which environment was it? Sandbox 75. Okay, just give me a moment to give in there. This title, I think orbit a framework project. Thank you. Thank you. Thank you. Thank you. Thank you. Thank you. Okay, sorry about that. Let me share my screen here. Okay, you can see. Yeah, we can see it. So this is a fresh project market looks like we have like the chatbot module. That's pretty much the main dependency here. Chatbot flows and answers. Those are the base ones. And then the very beginning, I just put some of the. And then we have the custom hooks and custom handler tabs in there. These were some examples from their New York State project. This is just a boilerplate on the handler side just to have it in there. I normally included in our projects was to have it. This was from the hooks. I think was from there. Some of the New York state stuff just to show how that would be set up in there. And how we would do assets. Okay. So yeah, I think we've covered some of this previously. So feel free to stop me when going over stuff that you already know. Basically, the module system we sort of developed it to bring repeatability into our projects to sort of separate out all these individual common components that we were using project to project in a way that we could easily deploy them. And update them if we did make changes to sort of our common core and update them independent of other modules. The sort of core of the module system is the project context module. This is establishing. One second. So this is establishing this sort of project object that contains project information as well as the different module different modules and most importantly, sort of this ability for modules to await other dependencies. Startup in the project context code. It's establishing promises that essentially for the dependencies that other modules can await. And ensures that essentially none of this code is going to actually initialize until everything it requires has been initialized. And it's just an improvement over sort of a prior approach that was sort of sequenced timed inject nodes to establish all of the initialize all the code for a project that just had some drawbacks. So not something that you'll really need to dig into it all, but just the aware of why that's there and why every every other module references it. Each module you'll see it sort of goes through the process of taking the project context establishing its own particular dependencies and then getting into the code to establish the actual module and this method and everything. You really shouldn't edit any of these modules. We don't really have a way to block them from editing. That's why pretty much all you'll see is just a sort of reminder at the top not to edit this. If you do find that there is something in there that is not working for you, you should bring it up with us. And we can either sort of advise you how to accomplish what you are trying to accomplish or potentially, you know, take the feedback and make some changes to the modules. But yeah, so project context is the core of everything sort of your base most common modules that pretty much everything depends on are the settings module. Settings module establishes settings content. And it looks like we already have some settings in here by default. Each sort of module has its own little sort of indication of what its default settings are and the settings module serves up this endpoint that will sort of tell you or give you an example of what your settings content might look like based on the modules that you have in place. If you edit this, let me just verify that here let's change you know debug true to false for a moment. I'm going to comment. Ideally, you should see an indication in here that the settings are updated automatically as a result of that sort of change. It does depend on a enable post data hooks feature in orbita, which can be a little iffy as to whether or not it wants to cooperate. So if you are making changes to the settings and you are not seeing them reflected in your settings here in the project context, you can just go and make a quick adjustment one of your other tabs and deploy experience designer. And then you should see it reflected in there to no deep service false. I will just give back to true just because it's helpful to have in development situations. So the settings establishes that content, it makes those settings that you define in there available in the project context to utilize. It can be a combination of sort of settings prescribed by the modules as well as sort of custom settings. I said it ideally takes care of automatically updating that, but they're here to have been some issues recently with that. That post data hook feature working as expected. There is error handling the error handling module establishes. Two schemas for error types and actual error instances. The error type records if we have. Okay, so we don't actually have one yet. Let me just do a quick example. What that one looked like. I am just introducing an arbitrary error here. Going to go. Slowed up the project. And so. You see I've gotten this message and I'm sorry now I expect there is a current please try again later. So that's sort of our default error message for a lot of the modules. So what happened here is an error happened in this node. You'll see a catch all on all the modules. So this error happened here. It was caught by this node. It was funneled into the error handling module here. One thing that it did it was log the error. So we're now going to see that an error type entry has been created. So one of these per error type in this case since there wasn't already an error type matching this name. The name being the name of the tab. It went ahead and created one was the default values. Such as you know, let's you know to send out an email to my email as a default value here. Anytime five of these errors happen in a particular day. So we recorded the error itself. So we can see here and give the session ID when it happened. What the type was the message and the node source which can be helpful. So if you are looking at this error, you see that the node had happened in was this right here. You can copy that ID back into experience designer. You can use these search flows here. You can enter a node ID and it will take you to that particular node. So this is a node that are happened with. I'll go ahead and remove that now before I forget. So the other thing that handle error here does. So it will be error and then it also called a method for unhandled handling of unhandled error response. So by default. If you know, let's say you had. See had this error node it went in here. I didn't really do anything with it. You know by default of a flow and experiences and it just kind of hits a dead end. You're not really going to get a response here, which can lead to sort of confusing experience for the user. So unhandled error response goes through. It makes some determination. So one it grabs sort of the default error message from that settings content that you're looking at earlier. If one is specified in there, if not, it's going to go to this default. And then it'll try to make some determinations about the context. So it's determining whether or not we're looking at a voice skill. So it would say voice skill that the platform is currently serving. It'll respond in a different way than if it detects that we're in a chatbot. It will also this is not really as relevant now, but sort of back in the days when we were straddling version two in version three of the chatpot with version two being. And fourth HTTP requests and responses as opposed to be three using the web socket. It would make up for your determination as to sort of the best way to respond. But either way at the end of the day, this is just sort of making sure that what an unhandled error happens. The user gets some sort of error message back as opposed to being left with no response. So the other other course that pretty much every most other modules are going to reference. Let's see. So we have settings error handling. Utilities it, you know, just sort of carries a bunch of common utility functions that modules might use. Some stuff that you might see from, you know, say load as is available like in the global context. There's just sort of extra apps away some of that. Some methods in here for sort of grabbing a session ID from a message. Some that are used. I guess something that randomized multi agent is actually kind of specific with one manager, but to get moved out here. But yeah, so some, you know, various sort of common utility functions that it might be worth looking through to see if they would be a particular use to you. There's one for interacting and storing data in redis. So. In the global context, you will see whenever you're storing something as like global dot set and a key it's going to be stored in here and you'll see it listed as memory only. There is sort of an alternative mechanism there that could store data in the redis instance that every environment should have. So you can probably get a lot of data around redis is make sure it actually is enabled. There is the setting here in the organization settings that you know could get flipped off theoretically. So you would want to make sure it's not able to be demot utilize that for. You know any sort of I would say you know the use case for the redis instance is if you find yourself storing sort of a starting store larger amount of. You wouldn't want to use do too much of that in the memory. In the memory storage for the context because you know you could start running them against the memory limitations of the orbit instance, which would not be great. I would cause the instance to recycle. There are a few other items in here. There's just sort of generic wrapper around making HTTP requests. It's not really any different than you using the HTTP request node yourself, but. You know it provides a sort of handy wrapper we just want to do it in mine in the function node. And there are some wrappers around some of the orbit API and points for stuff like authentication point content. So you might find something in there that could be useful. But again, you don't want to necessarily edit this. Or you are sort of breaking your upgrade path for automatic upgrades. And let's see. Okay, so. I guess the other one might describe as sort of well, they're all sort of a lot of them are core, but. Next important one, base intense. This is covering things like your launch intent and you're not intent. So you would not want to have a launch intent elsewhere in your project. You want to sort of defer to this one. If you do need to customize the behavior that happens after launch, you would implement a custom after launch handler. I think there's an example of that over here. And what Mark pulled over. So here in this example, there's the custom after a lot of that is going in some, you know, pulling some. Values from custom data. Trying to pull particular launch flow ID, that sort of thing. And there is also the none intent covered in here with custom behavior. I'm being able to be defined there as a fallback handler. I guess even outside of the cup, after the custom after launch handler, there is sort of a default expectation here that you can just go ahead and within that settings content. You can define without really any other coding necessary. What the launch flow ID would be. So in this case, it is set to that particular flow ID. And we look over in flow studio. Do a search on that ID. So is this finding that this workflow, welcome flow is the launch flow. And that's why you can see here when I left the chatbot. That is the studio flow that has been invoked. Going quickly through some of the other ones here. Data hooks is just sort of a common module. To enable that post data of functionality to be utilized. By the modules, like I said, there appear to be some issues with the functioning as expected at the moment. But ideally, what would happen is if you did have any post data hooks set to true on a schema, whenever a record of that schema is updated, a call would come into this end point. And then in the case of the modules, things like settings would utilize that to sort of recognize the things content change make its update. That's pretty much all that is happening in there. Translation is just sort of we have sort of a default translation option that taps into. Google's translate API and I guess now that I'm saying that I'll mark the issue any issues there were resolved recently. That's a sort of. Yeah, so default tap into sort of machine translations or do I have to do Google translate API. The only other module here that sort of uses a bite of fault is the chatbot module or it sort of has built in capability where you know if you have specified. The language code in session it will switch over to that language and it will. Then introduces mechanism of taking any input from the user translating it from the sort of target language into English feeding that into our English interaction model, taking the response that comes back and then translating that into the target language. So it's sort of a quick and easy first. First way to introduce multilingual into your chatbot. You know, sometimes the machine translation is not necessarily sufficient for a customer and they want sort of you know actual human translate the content and that that would be sort of another matter to get in place. So if you have seen if machine translation is sufficient, this is a good option. Okay, let's see going through here. So then getting into some of the higher level modules. So the answers module is not as button play some of the other modules is really sort of in there as a demo for how orbit answers works. So we're unfamiliar with orbit answers. I don't know if that would be a knowledge base in here. Okay, there is. It is a system for sort of building a knowledge base of questions and answers for you know if you're implementing some sort of Q and a or I think you functionality in your chatbot. That can then be served up and answered through this answers node. So you know, when the knowledge base is in place, you can go you can select it from this node for the sort of answers group intent node. And any incoming utterances that orbit of things are relevant to this particular knowledge base would then be fed in here and you know pull up the appropriate answer and served back as a response. But so this module here is actually just sort of a basic example of how that is the nodes required to wire up. The chatbot module here is a basic implementation of a chatbot page. So we can see what's establishing here when this template is this page that we are seeing here. You know, typically you're going to be hosting the chatbot and actual customer page, but this can be very useful for you know, testing purposes. There are some quick shortcuts here where you know the endpoint is just a API slash the project name slash chatbot. If you were to introduce additional chatbot settings. So looks like we have our one chatbot settings here you can see the key is one to setting. And there's already coming up here because Mark set that as the default in the settings here. If it was not set there in the settings it would be defaulting to the default chatbot settings which is certainly out of the box ones that we specify. There's a shortcut here that you can append on you know whatever the chatbot settings key is that you want to pull up. And so you can see her I've types of default and I'm getting me for the default chatbot. There is a cross domain testing page that could be made available. It's not really that useful unless you are doing sort of more complex things with like say you were introducing an HTML 5 directive with an i frame and you want to make sure that everything was sort of functioning as expected when you know not using the orbda domain for hosting to make sure all your core settings are OK and that sort of thing. It's an option there that we could help you could make your. Yeah so not not much to that just sort of a default chatbot page and then the sort of basic wiring required to process chatbot requests like I said with that extra sort of wrapping to enable translation. And then we have the flow manager module it covers the basic wiring for the flow manager node which is the means of you know integrating flow studio flows with your project. That's sort of the common intents that you would want to pipe into that. This similar to sort of the base intents module has handlers that you can tap into to have integrate whatever custom code you might want in a few situations. It has. It has a built in mechanism for randomizing responses which you know maybe of interest a lot of our sort of conversational design will have. You know three or four different variations of content at particular points to you know I guess make the experience feel with all well. I'm going to say more human but just very interesting. And I don't know if there's an example any here. And I'm actually getting little to be syntax mark was it a double horizontal rule for randomize responses yes. So for example I'm going to go into here welcome flow. So go into these so there's. A few contrived variations here. So yeah this convention here is I have separated my variations with the double horizontal rule I'll go ahead and save that. And reload the project so you can see here that variation for reloaded again variation for again. This time variation one. So yeah that mechanism of sort of separating out and randomizing responses when it detects that sort of structure is handled in there in the flow manager node by this node with the help of this randomized multi agent function and utilities. So something you know that could be helpful some situations if you did want randomized content sort of the older road to that would have been something much more annoying where you like generate a random integer and then have an evaluate node where you know if whatever your random integer is one go this way to go that way so it cuts down on the. The velocity in your flow studio flows if you did want to achieve that sort of thing. So yeah handles that you know the other big piece here is obviously the custom hooks. That are accessible through this custom node so the mechanism there as a reminder is you go you declare your hooks somewhere in a way. Somewhere in a custom hooks tab for each one of them you call out to the flow manager module you call register hook you register you know your hook code and what the name is. And then once that is registered I can go over here in a flow studio flow and through a custom node I can name it with the same name as the hook. And we'll get invoked and handled and you know passed back to flow manager all through means of this code here. I think that's pretty much everything of interest here there's a mechanism over here for. If it detects that you have specified some button options at particular path and session it won't inject those so there's another option there if you found a situation where you needed to sort of inject some custom buttons as opposed to just using the default options custom buttons. I think we probably documentation on it but you know if you needed to say attach some JavaScript to a button I think there's an option for that or have a button that would be a link somewhere although I do think we have introduced some of those options into. Mark do we not have like an option to specify link button in the inflow studio itself. Don't know if we had introduced that at some point but I guess not think there's a way to do it I just don't recall I think you have to put something in the in the button source. I don't remember exactly what it is. So if you had some complex button needs there is a directive and yeah we could give you some examples for that if that need comes up. But yeah that's that's pretty much that's pretty much it so when modules are deployed the CS modules tab gets created and sort of tells you what your sort of core dependencies are I think of this as like the equivalent of your dependencies in the package. So you can just get a JSON file and then you can sort of think of this as your package lock file where it's sort of talking you what specific version of those core dependencies and if they're child dependencies are. So this is what would get used if we sort of invoke our system to update your modules if we have made fixes or enhancements to it. So similar to the module tabs you do not want to remove or really edit this information in any way. So this is all you know stuff that you do not want to be touching and on the other side is where you would have your your custom project code. I think that covers most of it from the experienced designer side in experience manager things that you will see related to the modules are. I'm just going to call on what's the entry just one second. A practical journey and any other questions about the experiences I know was that was that clear or is there anything else. What was anything that you wanted to you know explain further any questions you had. No other question some other other question are covered in this question so no other question. All right, Andrew, please proceed. Okay, yeah, so you will see global schemas created for you know associated with these modules. I think I went into this a little bit previously, but there is a concept in orbit of sort of global schemas versus project specific schemas. We tried to sort of keep any of the module schemas as global ones to support. Being able to deploy the same module to multiple projects on the same environment. I don't know if I think any of the examples pulled in here. Would have it, but sometimes you will see flow studio flows that are pulled in as part of a module and you'll see sort of the module information in the description. And similarly sometimes intense can be introduced as part of a module. But yeah, so the modules are sort of similar to what we looked at with like the version control. The other day each module is sort of a nicely packaged little contents of a particular chunk of functionality that then gets deployed out in sort of a similar manner to where your control deployments. And yeah, I think I think that pretty much covers the covers at the high level. Hello, yes. So I just want to clear one thing regarding explainer. So all the settings regarding chatbot, which we are initially in some jail project and some near project which we have done which we were using in template in template. We were using script where or beta chatbot dot in it and inside that in it we were giving all the settings right now we are now just using sitting in. We are now we are now using only settings, right. So sorry, which setting specifically were you setting. We are yes, yes, we are initially what we were having is we here we haven't shipped with tells what chatbot slash we three slash a chat JS file name. Okay, so you are using the script equivalent of this sort of initial or okay, we are using this script of. Okay. So, so to change the default chatbot sitting of we we have created multiple settings and now there is a default now you have changed to wonder how we can do it can you just explain it one more time. Yeah, so your chatbot settings so I mean I guess just to distinguish there is you know initialization settings that are pointing at the server URL so these are still going to exist on whatever page you're hosting the chatbot on the chatbot settings yes if you did have different chatbot settings for different contexts. So you would create you know let's say this is my landing page layout and we'll give it a key name description. So you would create your chatbot settings you would make all the manipulations you need regarding either sort of the basic chatbot settings your custom CSS your custom JavaScript changes to the template itself if needed. And then you would reference that template in your bot settings on the page when you initialize it. So this I mean the chatbot settings I don't think is this doesn't really change as a result of the module system this you know you'll still be developing chatbot settings the way you were before. It won't really change how you're hosting the chatbot on your page so this you don't need to go through this page this page is just introduced as sort of a default page for testing the chatbot the assumption is you will still be hosting the chatbot on a customer page using the means you were before. And in and you can swap the template out in that URL so you know we just have said is it a false you have to think about it, but if you had three different templates that you were testing with you could set it up you could use that endpoint just change the template name for the template that you're trying to test against. And which now we have created a new chatbot setting how we can add this in this string one. I mean you don't need to so and for that test page it's just it's going to be accessible automatically so here let me just like make a. Change here to demonstrate a suppose just coming to. Stick some texting here. To demonstrate so we know which one is which. And I'll save that so on this page so you know I have it set to default for the moment if I change that last bit to lending page. But actually you know I'm thinking about it I'm not sure. I should necessarily expect that bit to. Up. Sorry thank you is wrong they are case sensitive. So what is happening there is because I introduced I wrote a key that it wasn't familiar with it just suspect the default but switch over to the actual key here. Let me make a difference change there. That it's. Sorry it's doing that we have thing the chrome does. Okay proper capitalization. Okay so yeah we are using this secondary chatbot settings now with my little edit there. But yeah so for testing purposes yeah if you introduce new chatbot settings you can either change the settings content to point to whatever your new chatbot settings key is by default. Or you can just you know tack on the particular chatbot settings key case sensitive onto the end of the test page you are out there. Okay thank you. You can and you can still continue to set it in your initiation script that you put on your customer website. Yeah yeah that does not change as I was told about module system. Okay. Any other implementation type questions. No questions were answered. So the in and dry accidentally copied I think I was trying to set up some samples and there's two custom hooks or should probably be one in there. Normally we don't only include two custom oak tabs. I think I copied one from another project just to set some stuff up. So normally we only have one custom hooks tab in here with the with those hooks that are available and as you know those then become custom code. So I just want to include the answers example just to show you how that would be set up in here. I know normally you guys don't use answers because you're doing a guy that flows for these customers. But just wanted to include that so when you if you don't have a if you have a project that's you're not doing an ants Q and A bot. It's just a guy that experience. Then you wouldn't need to include the answers in here is answers to out. Okay. I think probably the the best thing to do next is I don't I think I don't know if you start your gill yet bot or not. But to see if you can if we can apply or you can apply. So the modules to that gill at project and then start trying to kind of move stuff around to align with this. And then we can review that with you and answering questions that you have just jump in earmark because the gill yet project is is no longer. They they've stopped the project so we are visited at the end of the year, but as of now, no further work on gill yet so. Okay. Yeah. I wonder though if something to discuss with with Anna Monica if there may be your plans to kind of re architect existing experiences in this modular way. But again, that's something that would laugh to discuss. Yeah, I couldn't tell and if it is would probably be with one of the not the New York State project. Well, I guess that's going away right at the end of the month. That body is going away. So we are there there are plans to expand NIA. And so that's one thing I want to discuss with Anna is whether you know as part of that work, whether we may want to go ahead and. Modularize that whole experience. Yeah, that would probably be a good one to do. Just because it's. I think pretty straightforward. So the New York State one was there was a lot of custom stuff going on, especially because of contact center. Right, but the other two I know Andrea made some recommendations and I think those were a little bit strip more straightforward. And that could be applied as part of a project. I know you don't want to burn hours just to burn hours. So correct. Yeah, but if there's an opportunity as part of an enhancement to. To work on that clean it up. I don't think it would be that big a lift to apply the framework to either one of those other bonds. All right, that sounds good to solve it. I'll get me that something on all discuss with Anna. And we'll let you know more. Okay. Any questions come up. Fire away. I can try to get someone else to help answer them when they come in. There are other developers that are familiar with this framework. But I just want to kind of get this final review in before Andrew goes on vacation. Appreciate that. I'll send those videos out today for both of these the last two meetings or the meetings this week. And then like I said, if you run in anything, just not working or you have a question about just send it to support from just copy me. All right, sounds good. Thank you. Thank you. Hi Mark. Yes. Thanks. We have modularized our J. But it's not working all there in sandbox and normalizing. So we have modularized it, but it's not working. What's I'm sorry, I miss what's not working. The J. We have modularized J project. I'm it not V, but yeah. Orbit a team has modularized J. But it's currently not working. I'm not sure what that means. You can't get your tickets. Is that what you mean or what? I think so. We have a resident ticket for that to. You can you just describe the issue in more detail. Basically, our first project was J. Which. Orbit a team has modularized. I think so initially it was working fine, but currently it's not working. Which project is this? This is Jade. Oh, Jade. Okay. In which environment? I did I do. Okay, we'll take a look at that. So the idea of J. Is it working? Okay. When did that. When did it stop working? I mean, it was a modular way. So they just gave us to understand how modular way coding works. How modular was to work? So before I think so. I'll set it second meeting only it wasn't working. I think so. And you told us they will dig in and check what was what was the issue but. I'm sure. Okay. What's like a look at that? I don't know. Is there something else? And we haven't received any recording of past three to four meetings sessions. So I sent the meat and I want to confirm. Did you get the meetings from last week? I don't know. I don't know. I don't know. So we could have made it but there wasn't an attachment to that. Yeah, I think it's a download it. I know I can't attach it to it. It's too big. But I know, but I sure I sent it out of sure point. That's why I want to. I did send him from last week. I had sent him from this week and from the week before. So I just want to confirm. At least Daniel, did you get him from the previous weeks? I can try to reset it. I thought I saw it and now I'm not seeing it in my box. I'll try to send it again. That's what I like to say teams are a little bit weird with these recordings. And so I was trying to figure out if you all had received the ones from last week. I think that's what I thought was. I think that's what I thought was. I think that's what I was trying to figure out. I think that's what I thought was. Zoom did a much better job with sharing recordings. Should we. Should we do this on zoom going forward? If you guys have them, we can't. I don't. We're using. We don't use zoom anymore. Okay, okay. I know Monica. Is it. Okay. Let me see. So I don't know. I don't know. I don't know. I don't know. I don't know. I don't know. And I'm not seeing. Where the link is to the share point. Okay. I was curious if it showed up in here. That's interesting. All right. I'll try to resend all that. Yeah. I know. I know. I know. I know. Like. That seems like every day. There's some new weird thing that happens in teams or outlook or. I think. It says it saves the meetings into one drive. I think it says, but. Anyhow. I'll. I'll circle back. I was wondering if you all received those or not. It looks like you didn't. So I'll try another approach. All right. Thank you. You're welcome. All right. So we got two action. One is that. A dear day of J project. And the other is the meeting recordings. Yep. Cool. final thoughts or questions guys? No. Thank you. Okay. All right. All right. Thanks, everybody. Hope you had a good time. Have a great time off, Andrew. Thank you. Thanks, everyone.