[{"data":1,"prerenderedAt":568},["ShallowReactive",2],{"footer-primary":3,"footer-secondary":93,"footer-description":119,"tv-ai":121,"tv-ai-seasons":131,"tv-ai-episodes":148,"sales-reps":316},{"items":4},[5,29,49,69],{"id":6,"title":7,"url":8,"page":8,"children":9},"522e608a-77b0-4333-820d-d4f44be2ade1","Solutions",null,[10,15,20,25],{"id":11,"title":12,"url":8,"page":13},"fcafe85a-a798-4710-9e7a-776fe413aae5","Headless CMS",{"permalink":14},"/solutions/headless-cms",{"id":16,"title":17,"url":8,"page":18},"79972923-93cf-4777-9e32-5c9b0315fc10","Backend-as-a-Service",{"permalink":19},"/solutions/backend-as-a-service",{"id":21,"title":22,"url":8,"page":23},"0fa8d0c1-7b64-4f6f-939d-d7fdb99fc407","Product Information",{"permalink":24},"/solutions/product-information-management",{"id":26,"title":27,"url":28,"page":8},"63946d54-6052-4780-8ff4-91f5a9931dcc","100+ Things to Build","https://directus.io/blog/100-tools-apps-and-platforms-you-can-build-with-directus",{"id":30,"title":31,"url":8,"page":8,"children":32},"8ab4f9b1-f3e2-44d6-919b-011d91fe072f","Resources",[33,37,41,45],{"id":34,"title":35,"url":36,"page":8},"f951fb84-8777-4b84-9e91-996fe9d25483","Documentation","https://docs.directus.io",{"id":38,"title":39,"url":40,"page":8},"366febc7-a538-4c08-a326-e6204957f1e3","Guides","https://docs.directus.io/guides/",{"id":42,"title":43,"url":44,"page":8},"aeb9128e-1c5f-417f-863c-2449416433cd","Community","https://directus.chat",{"id":46,"title":47,"url":48,"page":8},"da1c2ed8-0a77-49b0-a903-49c56cb07de5","Release Notes","https://github.com/directus/directus/releases",{"id":50,"title":51,"url":8,"page":8,"children":52},"d61fae8c-7502-494a-822f-19ecff3d0256","Support",[53,57,61,65],{"id":54,"title":55,"url":56,"page":8},"8c43c781-7ebd-475f-a931-747e293c0a88","Issue Tracker","https://github.com/directus/directus/issues",{"id":58,"title":59,"url":60,"page":8},"d77bb78e-cf7b-4e01-932a-514414ba49d3","Feature Requests","https://github.com/directus/directus/discussions?discussions_q=is:open+sort:top",{"id":62,"title":63,"url":64,"page":8},"4346be2b-2c53-476e-b53b-becacec626a6","Community Chat","https://discord.com/channels/725371605378924594/741317677397704757",{"id":66,"title":67,"url":68,"page":8},"26c115d2-49f7-4edc-935e-d37d427fb89d","Cloud Dashboard","https://directus.cloud",{"id":70,"title":71,"url":8,"page":8,"children":72},"49141403-4f20-44ac-8453-25ace1265812","Organization",[73,78,84,88],{"id":74,"title":75,"url":76,"page":77},"1f36ea92-8a5e-47c8-914c-9822a8b9538a","About","/about",{"permalink":76},{"id":79,"title":80,"url":81,"page":82},"b84bf525-5471-4b14-a93c-225f6c386005","Careers","#",{"permalink":83},"/careers",{"id":85,"title":86,"url":87,"page":8},"86aabc3a-433d-434b-9efa-ad1d34be0a34","Brand Assets","https://drive.google.com/drive/folders/1lBOTba4RaA5ikqOn8Ewo4RYzD0XcymG9?usp=sharing",{"id":89,"title":90,"url":8,"page":91},"8d2fa1e3-198e-4405-81e1-2ceb858bc237","Contact",{"permalink":92},"/contact",{"items":94},[95,101,107,113],{"id":96,"title":97,"url":8,"page":98,"children":100},"8a1b7bfa-429d-4ffc-a650-2a5fdcf356da","Cloud Policies",{"permalink":99},"/cloud-policies",[],{"id":102,"title":103,"url":81,"page":104,"children":106},"bea848ef-828f-4306-8017-6b00ec5d4a0c","License",{"permalink":105},"/bsl",[],{"id":108,"title":109,"url":81,"page":110,"children":112},"4e914f47-4bee-42b7-b445-3119ee4196ef","Terms",{"permalink":111},"/terms",[],{"id":114,"title":115,"url":81,"page":116,"children":118},"ea69eda6-d317-4981-8421-fcabb1826bfd","Privacy",{"permalink":117},"/privacy",[],{"description":120},"\u003Cp>A composable backend to build your Headless CMS, BaaS, and more.&nbsp;\u003C/p>",{"id":122,"title":123,"logo":124,"cover":125,"tile":126,"announcement_text":8,"description":127,"slug":128,"one_liner":129,"card_text":8,"status":130,"sort":8},"c248c0ef-2c20-4465-a2fb-54a805f13ee1","Directus AI","d42589f0-c20b-4f8e-9dbe-7d2a6fb3ea8f","42602785-c25e-4a27-b873-47abdee0fa5d","b3609dd7-2fea-4925-ae4a-8a4a69a1b64b","With Directus AI, we are providing new ways to augment what parts of Directus can do with best-in-class platforms. Learn about what's new and available in the Directus Marketplace.","ai","Take a look at the AI extensions we've built for Directus Automate.","published",[132],{"id":133,"number":134,"show":122,"year":135,"episodes":136},"25c1b8ec-a696-4551-8d13-4e2abfbc7cb5",1,"2024",[137,138,139,140,141,142,143,144,145,146,147],"6aee5cdc-3d0a-4fa6-acee-49c1860a553d","50b4447b-73c7-4b49-9e70-d210595d1a7e","42784fad-29d4-4f01-a076-43f1817655b7","d948815e-2417-4319-814b-87d7c5fbdd43","2d94463a-5c39-4274-ba39-287e9059cc9c","afb17dd7-48b9-4297-ada8-f22c1daa82ce","be92a983-6a6a-411f-8f07-2cba4aa9308c","afc8f09e-f82f-473d-8643-14176380ae52","3d978332-855b-4eb0-a878-b932e0f9d704","40e14c84-7b60-4fc2-a125-beec15e39a28","be07b8cd-0d0f-4713-affe-88c210c29d9a",[149,166,183,198,212,227,242,256,271,286,301],{"id":137,"slug":150,"vimeo_id":151,"description":152,"tile":153,"length":154,"resources":8,"people":8,"episode_number":134,"published":155,"title":156,"video_transcript_html":157,"video_transcript_text":158,"content":8,"seo":159,"status":130,"episode_people":160,"recommendations":163,"season":164},"ai-overview","945772281","​Hear from our CTO Rijk about our philosophy on AI’s role in Directus and beyond, and then our Director of Developer Relations Kevin on our brand new AI extensions.","dc879be9-3817-458e-92de-72378e03db25",7,"2024-05-15","Directus AI Overview","\u003Cp>Rijk: Hello everyone. I'm Rijk, Co-Founder and CTO here at Directus. AI is everywhere. Every company under the sun is doing something with AI but AI can mean a lot of different things Are you using it to generate new information, summarize things you've recorded before, creating images, making analysis, etcetera, etcetera. Shoving that AI into, you know, existing products just for the sake of it can lead to quite a lot of issues.\u003C/p>\n\u003Cp>We've seen, you know, in in recent times, we've seen products with a lot of hype and little follow through, confidently being wrong, some hallucinating, that kind of stuff. Fair to say, for some of those things, implementing AI doesn't really act on the core purpose of the thing, taking the focus away of what really matters most to the users. At Directus, we really don't build things just for the sake of building things. We're always building it because there's a real interest and demand from the users. The same goes for A.\u003C/p>\n\u003Cp>I. We really want to be grounded and considered in our approach around implementing artificial intelligence. Thankfully, we've done our homework. We have something to really ground our decisions in. In our stated data survey we ran a little earlier this year, we saw that 8 out of 10 developers set that they're using artificial intelligence in their day to day work today.\u003C/p>\n\u003Cp>So we knew it was something we could take time to consider, but it's important that we stay true to ourselves and our community while we explore this new space. Even with the industry pressure. We want to be able to experiment with AI without spending so much time on it that it starts to affect other work that we're doing. We want to ensure that there is a real customer and user need for everything that we're building. And so we don't really like the idea of having to rely on a single third party service to power, you know, the core Directus experience.\u003C/p>\n\u003Cp>We still wanna make sure that you can host Directus yourself and even run it in isolation air gapped from the Internet if you wanted to. So today, we're announcing Directus AI. Directus is the toolkit for building applications. It's modular, powerful, and it places you in control. This is about providing tools to use if you want and when you want that weren't there before.\u003C/p>\n\u003Cp>With Directus AI, we are providing new ways to augment what parts of Directus can do and enable those 8 and 10 developers who use AI daily to more easily do so through our platform. Through the Directus marketplace, to build powerful automation. This isn't a refocus or reframing of what Directus is. We're taking advantage of Directus' extensibility and marketplace to explore this exciting new opportunity. And today, that forms the basis of our approach to AI.\u003C/p>\n\u003Cp>As AI becomes more ubiquitous in the way that developers and everyone work, our views and approach will continue to evolve. But for now, as a company that works with data, we remain cautiously optimistic. I'd love to hand it over to Kevin to tell you more about the extension.\u003C/p>\n\u003Cp>Kevin: Thank you very much for that introduction, Wrike, and I'm really excited to talk to you about what we've built. So, today, we're bringing AI to Directus Automate with a collection of 10 new operation extensions across 3 categories, data transformation, generation, and analysis. Now today, I'm gonna give you a super quick summary of all 10, but tomorrow we are releasing a brand new series on Directus TV, which will go more in-depth into each one, including how to set them up and their use cases. So firstly, we have the AI transcription operation. You feed it in a media file, and it will output transcripts powered by Deepgram speech recognition API.\u003C/p>\n\u003Cp>The AI translation operation will take in some text and a target language, and it will translate that text for you. The AI alt text and text extraction operations use Clarify's AI models to describe images and extract text from them, which is super useful for things like, business cards or receipts or things like that. The AI writer operation is really cool. It allows you to pass in some text and select from one of our pre written prompts, or you can write your own. It will then process that text and return the output.\u003C/p>\n\u003Cp>Our built in prompts include things like writing social posts, writing SEO descriptions, checking for spelling and grammar, and changing the length of text. This operation also has an advanced mode where you can provide multi step prompts making this super powerful and flexible. The AI image generation operation will take in a prompt and generate an image, which you can then save back to your director's project. And, similarly, the AI speech generation operation will take in some written text and one of our selected voices, and it will provide a realistic MP 3 file of that text being read out. This can be useful for things like automated or at scale ad generation or video voice overs.\u003C/p>\n\u003Cp>The AI text intelligence operation uses Deepgram's text analysis API to provide summaries, sentiment, intents, and topics for the text that you provide. The AI focal point detection operation uses OpenAI's vision models to determine the primary point of interest in an image. And you can combine this with the new focal point feature for more intelligent image cropping inside of your project. And finally, the image moderation operation. This will detect drugs, suggestive or explicit material, and gore within images powered by Clarify.\u003C/p>\n\u003Cp>This is a great step at helping you build safe and positive applications powered by Directus. Now all of these operations are available right now in the Directus marketplace, and together, they unlock super powerful workflows that enrich your projects. I'm really excited to talk to you more tomorrow through our new series, Directus AI, available on Directus TV, about how to actually set these extensions up and chain them together in really interesting ways. But for now on behalf of myself, right, and the whole directors team thank you so much for tuning in. We're really excited about what we can now do with these extensions and we hope you are too.\u003C/p>\n\u003Cp>Okay. Bye for now.\u003C/p>","Hello everyone. I'm Rijk, Co-Founder and CTO here at Directus. AI is everywhere. Every company under the sun is doing something with AI but AI can mean a lot of different things Are you using it to generate new information, summarize things you've recorded before, creating images, making analysis, etcetera, etcetera. Shoving that AI into, you know, existing products just for the sake of it can lead to quite a lot of issues. We've seen, you know, in in recent times, we've seen products with a lot of hype and little follow through, confidently being wrong, some hallucinating, that kind of stuff. Fair to say, for some of those things, implementing AI doesn't really act on the core purpose of the thing, taking the focus away of what really matters most to the users. At Directus, we really don't build things just for the sake of building things. We're always building it because there's a real interest and demand from the users. The same goes for A. I. We really want to be grounded and considered in our approach around implementing artificial intelligence. Thankfully, we've done our homework. We have something to really ground our decisions in. In our stated data survey we ran a little earlier this year, we saw that 8 out of 10 developers set that they're using artificial intelligence in their day to day work today. So we knew it was something we could take time to consider, but it's important that we stay true to ourselves and our community while we explore this new space. Even with the industry pressure. We want to be able to experiment with AI without spending so much time on it that it starts to affect other work that we're doing. We want to ensure that there is a real customer and user need for everything that we're building. And so we don't really like the idea of having to rely on a single third party service to power, you know, the core Directus experience. We still wanna make sure that you can host Directus yourself and even run it in isolation air gapped from the Internet if you wanted to. So today, we're announcing Directus AI. Directus is the toolkit for building applications. It's modular, powerful, and it places you in control. This is about providing tools to use if you want and when you want that weren't there before. With Directus AI, we are providing new ways to augment what parts of Directus can do and enable those 8 and 10 developers who use AI daily to more easily do so through our platform. Through the Directus marketplace, to build powerful automation. This isn't a refocus or reframing of what Directus is. We're taking advantage of Directus' extensibility and marketplace to explore this exciting new opportunity. And today, that forms the basis of our approach to AI. As AI becomes more ubiquitous in the way that developers and everyone work, our views and approach will continue to evolve. But for now, as a company that works with data, we remain cautiously optimistic. I'd love to hand it over to Kevin to tell you more about the extension. Thank you very much for that introduction, Wrike, and I'm really excited to talk to you about what we've built. So, today, we're bringing AI to Directus Automate with a collection of 10 new operation extensions across 3 categories, data transformation, generation, and analysis. Now today, I'm gonna give you a super quick summary of all 10, but tomorrow we are releasing a brand new series on Directus TV, which will go more in-depth into each one, including how to set them up and their use cases. So firstly, we have the AI transcription operation. You feed it in a media file, and it will output transcripts powered by Deepgram speech recognition API. The AI translation operation will take in some text and a target language, and it will translate that text for you. The AI alt text and text extraction operations use Clarify's AI models to describe images and extract text from them, which is super useful for things like, business cards or receipts or things like that. The AI writer operation is really cool. It allows you to pass in some text and select from one of our pre written prompts, or you can write your own. It will then process that text and return the output. Our built in prompts include things like writing social posts, writing SEO descriptions, checking for spelling and grammar, and changing the length of text. This operation also has an advanced mode where you can provide multi step prompts making this super powerful and flexible. The AI image generation operation will take in a prompt and generate an image, which you can then save back to your director's project. And, similarly, the AI speech generation operation will take in some written text and one of our selected voices, and it will provide a realistic MP 3 file of that text being read out. This can be useful for things like automated or at scale ad generation or video voice overs. The AI text intelligence operation uses Deepgram's text analysis API to provide summaries, sentiment, intents, and topics for the text that you provide. The AI focal point detection operation uses OpenAI's vision models to determine the primary point of interest in an image. And you can combine this with the new focal point feature for more intelligent image cropping inside of your project. And finally, the image moderation operation. This will detect drugs, suggestive or explicit material, and gore within images powered by Clarify. This is a great step at helping you build safe and positive applications powered by Directus. Now all of these operations are available right now in the Directus marketplace, and together, they unlock super powerful workflows that enrich your projects. I'm really excited to talk to you more tomorrow through our new series, Directus AI, available on Directus TV, about how to actually set these extensions up and chain them together in really interesting ways. But for now on behalf of myself, right, and the whole directors team thank you so much for tuning in. We're really excited about what we can now do with these extensions and we hope you are too. Okay. Bye for now.","4480f7ca-008b-40f2-a059-1ff260217678",[161,162],"9a31e513-71fe-497a-bd37-a7e5970233db","f73d6a94-019c-434f-85d8-1e59e588c3a2",[],{"id":133,"number":134,"show":122,"year":135,"episodes":165},[137,138,139,140,141,142,143,144,145,146,147],{"id":138,"slug":167,"vimeo_id":168,"description":169,"tile":170,"length":171,"resources":8,"people":8,"episode_number":172,"published":173,"title":174,"video_transcript_html":175,"video_transcript_text":176,"content":8,"seo":177,"status":130,"episode_people":178,"recommendations":180,"season":181},"ai-alt-text-writer","945761043","Create captions for your images within Directus Files with this custom operation, powered by Clarifai.","ac361908-b15b-4f15-908a-c18bc28b6771",4,2,"2024-05-16","AI Alt Text Writer","\u003Cp>Speaker 0: The Directus AI alt text writer will take in an image and provide a description for the image, which you can then save in the description of that image and use in your applications to make them more accessible. So we're gonna set it up today. So, automatically, whenever a new file is uploaded, it will go off and have its description automatically and we'll make this an event based hook. When and we'll make this an event based hook whenever a file is uploaded. Now just to note that here this will trigger on every single file regardless of file type.\u003C/p>\u003Cp>I'm gonna leave it like this, but in the real, you would probably want to add a condition that says, hey. Make sure this is an image or, you know, make sure this is in a certain directory. The docs on how to do that are inside of the marketplace listing for this extension, but we won't do that. So, you know, we'll assume every file that's uploaded is going to be an image. So we're gonna jump straight in and we are going to use the AI alt text writer, and this operation uses Clarify.\u003C/p>\u003Cp>So we have to provide our access token, and we have to provide a direct full URL. So what we're gonna do there is provide the core URL of our directors project slash assets slash and then a dynamic value here trigger dot key, and that will be the ID of the image or file that has just been uploaded causing this flow to start in the first place. So that will go off, and, honestly, it's pretty straightforward, this one. It just returns a string, which is the description. So we're gonna go straight ahead, and we are going to update data in the Directus files collection, specifically, the item that triggered this flow and we are going to update the description.\u003C/p>\u003Cp>And the value will be lost because it just returns the string. That's it. That's how you set up the AI alt text writer. It's really really pleasant and, you know, if you can set this up earlier rather than later you can make sure more of your images actually have alt text written. Let's, let's try it out here.\u003C/p>\u003Cp>So I've got this photo from a holiday, I did a few months ago with my friend Nathaniel, and we click into that and you know what not bad. A photograph of 2 men sitting on a bench in front of a sign that says Avenue Ave Ave. Again, do double check these, you know, there is a point where they can you know, where enough, error proneness, can actually cause a degraded experience for people who need this, but it will get you a really long way there. Of course, it was never gonna get that this said Avengers Campus, so I think I'll forgive it this time. So that is how to set up the AI alt text writer operation.\u003C/p>\u003Cp>Hope you found this interesting, and I'll see you in the next video.\u003C/p>","The Directus AI alt text writer will take in an image and provide a description for the image, which you can then save in the description of that image and use in your applications to make them more accessible. So we're gonna set it up today. So, automatically, whenever a new file is uploaded, it will go off and have its description automatically and we'll make this an event based hook. When and we'll make this an event based hook whenever a file is uploaded. Now just to note that here this will trigger on every single file regardless of file type. I'm gonna leave it like this, but in the real, you would probably want to add a condition that says, hey. Make sure this is an image or, you know, make sure this is in a certain directory. The docs on how to do that are inside of the marketplace listing for this extension, but we won't do that. So, you know, we'll assume every file that's uploaded is going to be an image. So we're gonna jump straight in and we are going to use the AI alt text writer, and this operation uses Clarify. So we have to provide our access token, and we have to provide a direct full URL. So what we're gonna do there is provide the core URL of our directors project slash assets slash and then a dynamic value here trigger dot key, and that will be the ID of the image or file that has just been uploaded causing this flow to start in the first place. So that will go off, and, honestly, it's pretty straightforward, this one. It just returns a string, which is the description. So we're gonna go straight ahead, and we are going to update data in the Directus files collection, specifically, the item that triggered this flow and we are going to update the description. And the value will be lost because it just returns the string. That's it. That's how you set up the AI alt text writer. It's really really pleasant and, you know, if you can set this up earlier rather than later you can make sure more of your images actually have alt text written. Let's, let's try it out here. So I've got this photo from a holiday, I did a few months ago with my friend Nathaniel, and we click into that and you know what not bad. A photograph of 2 men sitting on a bench in front of a sign that says Avenue Ave Ave. Again, do double check these, you know, there is a point where they can you know, where enough, error proneness, can actually cause a degraded experience for people who need this, but it will get you a really long way there. Of course, it was never gonna get that this said Avengers Campus, so I think I'll forgive it this time. So that is how to set up the AI alt text writer operation. Hope you found this interesting, and I'll see you in the next video.","58131a69-92b7-4c5e-9c09-8db247e22838",[179],"38c120ea-75a1-47bf-badc-a46a9a72bacd",[],{"id":133,"number":134,"show":122,"year":135,"episodes":182},[137,138,139,140,141,142,143,144,145,146,147],{"id":139,"slug":184,"vimeo_id":185,"description":186,"tile":187,"length":171,"resources":8,"people":8,"episode_number":188,"published":173,"title":189,"video_transcript_html":190,"video_transcript_text":191,"content":8,"seo":192,"status":130,"episode_people":193,"recommendations":195,"season":196},"ai-focal-point-detection","945761249","Determine an image's primary point of interest with this custom operation, powered by OpenAI.","f93156b0-e977-44bf-8616-71ae745e47d9",3,"AI Focal Point Detection","\u003Cp>Speaker 0: The AI focal point detection operation uses AI to determine the point of interest inside of an image. You can combine this with Directus' new focal point functionality to make sure that as images are automatically cropped, or cropped via API requests that your points of interests are are not lost in that cropping. Otherwise, by default, it happens from the center. So that's what we're gonna set up today. We're gonna do this whenever a new file is uploaded.\u003C/p>\u003Cp>So focal point. We're gonna do this whenever a new file is uploaded. So we will do files dot upload. This will run with every single file upload regardless of location, regardless of file types in the reel. You will want a condition just to check that this is indeed an image.\u003C/p>\u003Cp>The documentation for this operation in the marketplace, the listing page, shows you how to set that up. For now, we're gonna assume every file needs this treatment applied to it. So we are gonna go in, and we are gonna use our AI focal point detection end point. Now this uses OpenAI. So we have to put in our open AI API key and a full file URL.\u003C/p>\u003Cp>So first thing is our director's project URL, so that's mine, slash assets slash and then a dynamic value trigger dot key. That's the ID of the image that was uploaded and triggered this flow to actually start. So that will come back with an object, which contains a focal point x, a focal point y, and a reason. The reason could be interesting based on your use case. We're not gonna do anything with it.\u003C/p>\u003Cp>Instead, we're just gonna update the directives files item, specifically the item that triggered this whole flow to start. And we are going to update the focal point x value to be the value that came from the last operation focal point x. We're gonna do the same for focal point y. And, again, you know, you may choose to do something, you may choose to do something with the reason, but we are not going to. So focal point y and with Jason no hanging commas.\u003C/p>\u003Cp>That's the whole thing. That's how you use AI to set up focal points. It's really, really cool, and really leverages this new feature of Directus along with AI to just really make your media library a lot more expressive when you're using it in your actual applications. So let's try this out. I just uploaded a new image, that should have triggered that whole flow, the focal points to be, to be generated, and then save to that back to the focal point x and y value.\u003C/p>\u003Cp>And there it is. Now you don't need to do anything more with these values. When you start to crop the image using URL parameters, using the on the fly media transformations that directors provide, that will be the central point which the image is cropped around. So I hope you found this interesting, and I'll see you in the next video.\u003C/p>","The AI focal point detection operation uses AI to determine the point of interest inside of an image. You can combine this with Directus' new focal point functionality to make sure that as images are automatically cropped, or cropped via API requests that your points of interests are are not lost in that cropping. Otherwise, by default, it happens from the center. So that's what we're gonna set up today. We're gonna do this whenever a new file is uploaded. So focal point. We're gonna do this whenever a new file is uploaded. So we will do files dot upload. This will run with every single file upload regardless of location, regardless of file types in the reel. You will want a condition just to check that this is indeed an image. The documentation for this operation in the marketplace, the listing page, shows you how to set that up. For now, we're gonna assume every file needs this treatment applied to it. So we are gonna go in, and we are gonna use our AI focal point detection end point. Now this uses OpenAI. So we have to put in our open AI API key and a full file URL. So first thing is our director's project URL, so that's mine, slash assets slash and then a dynamic value trigger dot key. That's the ID of the image that was uploaded and triggered this flow to actually start. So that will come back with an object, which contains a focal point x, a focal point y, and a reason. The reason could be interesting based on your use case. We're not gonna do anything with it. Instead, we're just gonna update the directives files item, specifically the item that triggered this whole flow to start. And we are going to update the focal point x value to be the value that came from the last operation focal point x. We're gonna do the same for focal point y. And, again, you know, you may choose to do something, you may choose to do something with the reason, but we are not going to. So focal point y and with Jason no hanging commas. That's the whole thing. That's how you use AI to set up focal points. It's really, really cool, and really leverages this new feature of Directus along with AI to just really make your media library a lot more expressive when you're using it in your actual applications. So let's try this out. I just uploaded a new image, that should have triggered that whole flow, the focal points to be, to be generated, and then save to that back to the focal point x and y value. And there it is. Now you don't need to do anything more with these values. When you start to crop the image using URL parameters, using the on the fly media transformations that directors provide, that will be the central point which the image is cropped around. So I hope you found this interesting, and I'll see you in the next video.","d234c6c1-ee09-4895-a3cd-cc8081439197",[194],"bd63b46a-18fc-4a22-9a56-a8020924b913",[],{"id":133,"number":134,"show":122,"year":135,"episodes":197},[137,138,139,140,141,142,143,144,145,146,147],{"id":140,"slug":199,"vimeo_id":200,"description":201,"tile":202,"length":171,"resources":8,"people":8,"episode_number":171,"published":173,"title":203,"video_transcript_html":204,"video_transcript_text":205,"content":8,"seo":206,"status":130,"episode_people":207,"recommendations":209,"season":210},"ai-image-generation","945761480","Generate new images within Directus Automate with this custom operation, powered by OpenAI.","ad0578de-c6af-432b-aa4d-6749ee367e0e","AI Image Generation","\u003Cp>Speaker 0: The Directus AI image generation operation will take in a prompt and a couple of other settings and use OpenAI's DALL E 3 model to generate an image, which you can then save into your director's project. So here we have a recipes collection and an item with a recipe that I wrote and there is an empty field here for an image. Because I'm actually not a good chef we're gonna use AI to generate an image which we can then use on things like social media or the recipe website header, things like that. So, we are going to create a new flow, and we'll call this one generate image, and we'll make this a manual flow trigger on the recipes collection. So a button appears on the right.\u003C/p>\n\u003Cp>Now we are gonna manually give it a prompt because we don't have an amount of text suitable to send for an image generation, only a big recipe that's too long. So without a single field here, I'll just call it prompt. You might choose to call it something nicer, and we'll just make it a little text input here. Now that had a key of prompt, and what that means is whenever that button is pressed, we will receive the ID of the item where we press the button and also the prompt itself. And so we are gonna use that prompt and send it off for image generation.\u003C/p>\n\u003Cp>So we will go ahead and create a new operation here, and we will use the AI image generation operation. Now we need to use our open AI API key, we'll pop that in here and our prompt. And once again this is gonna be dynamic so trigger dot body dot prompt. We want high quality, standard quality will do, and we'll make it square so we can share it on our Instagram grid. So we'll hit save.\u003C/p>\n\u003Cp>This will result in having, a URL. So we now need to import that URL into our directors project. To do that, we will use the request URL operation, and we'll make a post request to this Directus project URL slash files slash import. Just a note that I've made image, file creation body, we are going to set the URL to the value that was returned from the last operation, which is just a URL string. So that will import the image to our file library.\u003C/p>\n\u003Cp>The final step is that we want to save that image into into the actual item where we triggered the flow to begin. So we're gonna add one final operation here, which is to update data. We are going to update the recipe specifically trigger dot body dot keys 0 which is the ID. And we are going to update the file value. File, and that is going to be last dot data dot data dot ID because that is a response for an API call.\u003C/p>\n\u003Cp>And that should be it. You should be able to press the button. It will come up with a box for the prompt. It will go and generate the image, import it, and save it back to the image. So let's try that out.\u003C/p>\n\u003Cp>Let's go in here. Let's generate image. I've got this rudimentary prompt written, and we'll run Flow on current item. Now image generation takes a little while so we'll come back when it's done. We're back and it did not work because it is not called file, it is called image.\u003C/p>\n\u003Cp>So we're gonna update that and we'll go back and run it again. Welcome back, and it turns out I'm not a very good engineer because that is not an easy stuffed bell pepper. It is a bowl stuffed with bell peppers. But in any case, you need to write better prompts but that is how you use the Directus AI image generation operation. I'll see you in the next video.\u003C/p>","The Director's AI image generation operation will take in a prompt and a couple of other settings and use OpenAI's DALL E 3 model to generate an image, which you can then save into your director's project. So here we have a recipes collection and an item with a recipe that I wrote and there is an empty field here for an image. Because I'm actually not a good chef we're gonna use AI to generate an image which we can then use on things like social media or the recipe website header, things like that. So, we are going to create a new flow, and we'll call this one generate image, and we'll make this a manual flow trigger on the recipes collection. So a button appears on the right. Now we are gonna manually give it a prompt because we don't have an amount of text suitable to send for an image generation, only a big recipe that's too long. So without a single field here, I'll just call it prompt. You might choose to call it something nicer, and we'll just make it a little text input here. Now that had a key of prompt, and what that means is whenever that button is pressed, we will receive the ID of the item where we press the button and also the prompt itself. And so we are gonna use that prompt and send it off for image generation. So we will go ahead and create a new operation here, and we will use the AI image generation operation. Now we need to use our open AI API key, we'll pop that in here and our prompt. And once again this is gonna be dynamic so trigger dot body dot prompt. We want high quality, standard quality will do, and we'll make it square so we can share it on our Instagram grid. So we'll hit save. This will result in having, a URL. So we now need to import that URL into our directors project. To do that, we will use the request URL operation, and we'll make a post request to this Directus project URL slash files slash import. Just a note that I've made image, file creation body, we are going to set the URL to the value that was returned from the last operation, which is just a URL string. So that will import the image to our file library. The final step is that we want to save that image into into the actual item where we triggered the flow to begin. So we're gonna add one final operation here, which is to update data. We are going to update the recipe specifically trigger dot body dot keys 0 which is the ID. And we are going to update the file value. File, and that is going to be last dot data dot data dot ID because that is a response for an API call. And that should be it. You should be able to press the button. It will come up with a box for the prompt. It will go and generate the image, import it, and save it back to the image. So let's try that out. Let's go in here. Let's generate image. I've got this rudimentary prompt written, and we'll run Flow on current item. Now image generation takes a little while so we'll come back when it's done. We're back and it did not work because it is not called file, it is called image. So we're gonna update that and we'll go back and run it again. Welcome back, and it turns out I'm not a very good engineer because that is not an easy stuffed bell pepper. It is a bowl stuffed with bell peppers. But in any case, you need to write better prompts but that is how you use the Directus AI image generation operation. I'll see you in the next video.","b6a9a85e-53cc-4086-b7cd-4096ba305a02",[208],"d711f2a8-80dc-4f48-95c8-8b21e0171d66",[],{"id":133,"number":134,"show":122,"year":135,"episodes":211},[137,138,139,140,141,142,143,144,145,146,147],{"id":141,"slug":213,"vimeo_id":214,"description":215,"tile":216,"length":171,"resources":8,"people":8,"episode_number":217,"published":173,"title":218,"video_transcript_html":219,"video_transcript_text":220,"content":8,"seo":221,"status":130,"episode_people":222,"recommendations":224,"season":225},"ai-image-moderation","945761757","Analyze images for drugs, suggestive or explicit material with this custom operation, powered by Clarifai.","314fcef8-4c7e-41ac-a7ab-96838c6f0aff",5,"AI Image Moderation","\u003Cp>Speaker 0: The Directus AI image moderation operation helps you build safer and more positive applications powered by Clarify. It will take in an image and tell you whether there is any drugs, suggestive or explicit material, or gore in the images, and then you can take action based on what is right for your application. So we're gonna build that together today. So we are going to create a new flow that will trigger whenever a new image is uploaded. We'll call this moderation, image moderation.\u003C/p>\u003Cp>Lovely, and we will run this whenever a file is uploaded. Now this will run on every file that's uploaded regardless of type. So in the real, you will want to add a condition that checks that this is indeed an image or perhaps based on a certain folder maybe just end user upload folders stuff like that. The documentation for this operation shows you how to set that up, but for now, I'm going to assume every file is an image and every file wants this moderation check. So we have this file upload, and we are gonna go ahead and use our AI image moderation.\u003C/p>\u003Cp>There it is. AI image moderation operation. Now we want to provide our Clarify API token and provide a full file URL. So https tunnel.orws.i0 /asset/trigger.key which is the ID of the file whose upload started this flow, and of course you'll want to replace this with your actual, Director's project URL. There's also a threshold here, which will change which items are flagged.\u003C/p>\u003Cp>So you will always get back a raw response between 0 and a100 of the confidence that either drug drugs suggestive or explicit material or gore is present, but there's an additional section called flags, which makes it easier to take action. This threshold changes what is needed for something to appear as a flag. In fact, I just want to show you how this works because what happens next is very very specific. So, I've got an image here of a needle with some white powder. So, sorry in our file module here we'll just go and update upload that.\u003C/p>\u003Cp>So you see that's the image there, there is definitely some drugs in that image right. So we're gonna go over to our flow and and we're gonna look at the log, and we see here that in the payload, there's a very very very high chance that drugs were present. It's not suggestive. It's not gore. It's not explicit, and because that number is above our threshold this appears as a flag.\u003C/p>\u003Cp>Now in most episodes in this series, I build a complete project, but this one is really up to you. You might choose instead of an action, which is a non blocking flow, you may choose to block it, and if and then you add a condition on to the end of the moderation, and if there's something that's flagged, you may stop it being uploaded at all, or you may flag it a certain way, change a status on the file field and stop it displaying to end users or display a warning. You may choose to email moderators to come in and do a manual check over. You may wanna send an email to the user and so on and so forth. So, hopefully, you can start seeing the applications of this image moderation operation.\u003C/p>\u003Cp>I'm gonna stop here in this video because it gets very specific after this, very implementation specific. But I hope you find loads of value in it. It's really, really powerful, and hopefully, you'll agree quite nice to set up. So I'll see you in the next video. Bye for now.\u003C/p>","The Directus AI image moderation operation helps you build safer and more positive applications powered by Clarify. It will take in an image and tell you whether there is any drugs, suggestive or explicit material, or gore in the images, and then you can take action based on what is right for your application. So we're gonna build that together today. So we are going to create a new flow that will trigger whenever a new image is uploaded. We'll call this moderation, image moderation. Lovely, and we will run this whenever a file is uploaded. Now this will run on every file that's uploaded regardless of type. So in the real, you will want to add a condition that checks that this is indeed an image or perhaps based on a certain folder maybe just end user upload folders stuff like that. The documentation for this operation shows you how to set that up, but for now, I'm going to assume every file is an image and every file wants this moderation check. So we have this file upload, and we are gonna go ahead and use our AI image moderation. There it is. AI image moderation operation. Now we want to provide our Clarify API token and provide a full file URL. So https tunnel.orws.i0 /asset/trigger.key which is the ID of the file whose upload started this flow, and of course you'll want to replace this with your actual, Director's project URL. There's also a threshold here, which will change which items are flagged. So you will always get back a raw response between 0 and a100 of the confidence that either drug drugs suggestive or explicit material or gore is present, but there's an additional section called flags, which makes it easier to take action. This threshold changes what is needed for something to appear as a flag. In fact, I just want to show you how this works because what happens next is very very specific. So, I've got an image here of a needle with some white powder. So, sorry in our file module here we'll just go and update upload that. So you see that's the image there, there is definitely some drugs in that image right. So we're gonna go over to our flow and and we're gonna look at the log, and we see here that in the payload, there's a very very very high chance that drugs were present. It's not suggestive. It's not gore. It's not explicit, and because that number is above our threshold this appears as a flag. Now in most episodes in this series, I build a complete project, but this one is really up to you. You might choose instead of an action, which is a non blocking flow, you may choose to block it, and if and then you add a condition on to the end of the moderation, and if there's something that's flagged, you may stop it being uploaded at all, or you may flag it a certain way, change a status on the file field and stop it displaying to end users or display a warning. You may choose to email moderators to come in and do a manual check over. You may wanna send an email to the user and so on and so forth. So, hopefully, you can start seeing the applications of this image moderation operation. I'm gonna stop here in this video because it gets very specific after this, very implementation specific. But I hope you find loads of value in it. It's really, really powerful, and hopefully, you'll agree quite nice to set up. So I'll see you in the next video. Bye for now.","5030a562-a906-4869-a63c-1a3678a20bfe",[223],"0eade7f9-5a3c-49c1-9e15-13d9f16a0bfd",[],{"id":133,"number":134,"show":122,"year":135,"episodes":226},[137,138,139,140,141,142,143,144,145,146,147],{"id":142,"slug":228,"vimeo_id":229,"description":230,"tile":231,"length":217,"resources":8,"people":8,"episode_number":232,"published":173,"title":233,"video_transcript_html":234,"video_transcript_text":235,"content":8,"seo":236,"status":130,"episode_people":237,"recommendations":239,"season":240},"ai-speech-generation","945761979","Generate realistic speech clips from text with this custom operation, powered by Genny from LOVO.\n\n","7acce675-8773-4d30-a844-56f78a198dd8",6,"AI Speech Generation","\u003Cp>Speaker 0: The Directus AI speech generation operation allows you to create realistic sounding speech from text inside of your director's project. This extension is powered by Jenny, so you will need an API key in order to follow along. Now here I have a collection called ads, and I've created just a very short textual ad that I want to run for directors. However, it's gonna go in something like a podcast or a audiobook or something, so it needs to be in audio form. So what we're gonna do is create a manual flow where when we click a button here, it will go off and generate that audio for us.\u003C/p>\u003Cp>So let's go over to our flows and create a new flow, generate audio, with a manual trigger on the ads collection. This will return just the ID of the item where the button is pressed. We obviously want the text. So the first thing we're gonna do is read data and we will read data from the ads collection, specifically the ID from the from the item whether it was pressed. So trigger dot body dot keys zero.\u003C/p>\u003Cp>So this will return the text and the currently empty file field. Then we can go straight away and send this off to the AI speech generation operation. Now we do need a Jenny API key, but I have one that I made earlier. And in here, we put in our text with a maximum of 500 characters. And I am gonna go ahead and just say, hey, that last operation that fetched all the data, go grab the text value out of it.\u003C/p>\u003Cp>You get to pick one of the selected speakers, so we'll use Brian Lee junior here and you get to specify the speed at which the, the speech happens. So this will return just a URL of an mp3 on the web. Next, we need to import it into this Director's project, and we can do that using the webhook request URL operation. So we'll make a post request to this directus URL trigger dotlws.i. So that's your specific project URL/assets, not assets, sorry, slash files slash import.\u003C/p>\u003Cp>That's the endpoint. It's a post request, and then the body here, we are going to just pass in the URL. Now just a note that for this project I've made file creation publicly accessible, you may need to lock down those permissions and provide your authentication headers here, but for ease I've turned that off for this demo. So what this will do is make that API call and return with the whole payload of the brand new director's files item that was just created, and what we wanna do is extract the ID and save that back to our ads item. So let's update the ads item here.\u003C/p>\u003Cp>We wanna update trigger.body.keys 0, and what we wanna do is just update the file value, and the location of the ID in the returned JSON payload is in data dot data dot ID. That is the whole flow. We click the button. We grab the whole item, which includes the text. We generate the text, which results in an m p 3.\u003C/p>\u003Cp>We import the m p 3 and save the m p 3 back to the item. So let's see if this works. Fingers crossed, we're now going and generating that audio. It's going off to that 3rd party vendor creating that realistic sounding audio for us, importing it, and then finally adding it here inside of the file except when it doesn't. Why is that?\u003C/p>\u003Cp>Let's take a little look together. Let's take a look at the log. What happened there? Trigger, because I got completely the wrong URL of just my director's project here. Tunnel is actually where this project is located.\u003C/p>\u003Cp>So let's run that one last time, generate audio. We'll give that just a moment once again to do its thing in that time I'll tell you a joke I'm not a funny person so I won't be doing that but that allows me to stall for long enough for this operation to complete and that of course is our, is our wav file, our actual audio file there containing our ad. So that is a little bit about how the, speech generation operation works using directus AI. We hope you enjoy it. I see loads of use cases for this, but the primary one being either like video voiceovers at scale or programmatic ads or stuff like that.\u003C/p>\u003Cp>So I hope you found this interesting. I'll see you in the next video.\u003C/p>","The Directus AI speech generation operation allows you to create realistic sounding speech from text inside of your director's project. This extension is powered by Jenny, so you will need an API key in order to follow along. Now here I have a collection called ads, and I've created just a very short textual ad that I want to run for directors. However, it's gonna go in something like a podcast or a audiobook or something, so it needs to be in audio form. So what we're gonna do is create a manual flow where when we click a button here, it will go off and generate that audio for us. So let's go over to our flows and create a new flow, generate audio, with a manual trigger on the ads collection. This will return just the ID of the item where the button is pressed. We obviously want the text. So the first thing we're gonna do is read data and we will read data from the ads collection, specifically the ID from the from the item whether it was pressed. So trigger dot body dot keys zero. So this will return the text and the currently empty file field. Then we can go straight away and send this off to the AI speech generation operation. Now we do need a Jenny API key, but I have one that I made earlier. And in here, we put in our text with a maximum of 500 characters. And I am gonna go ahead and just say, hey, that last operation that fetched all the data, go grab the text value out of it. You get to pick one of the selected speakers, so we'll use Brian Lee junior here and you get to specify the speed at which the, the speech happens. So this will return just a URL of an mp3 on the web. Next, we need to import it into this Director's project, and we can do that using the webhook request URL operation. So we'll make a post request to this directus URL trigger dotlws.i. So that's your specific project URL/assets, not assets, sorry, slash files slash import. That's the endpoint. It's a post request, and then the body here, we are going to just pass in the URL. Now just a note that for this project I've made file creation publicly accessible, you may need to lock down those permissions and provide your authentication headers here, but for ease I've turned that off for this demo. So what this will do is make that API call and return with the whole payload of the brand new director's files item that was just created, and what we wanna do is extract the ID and save that back to our ads item. So let's update the ads item here. We wanna update trigger.body.keys 0, and what we wanna do is just update the file value, and the location of the ID in the returned JSON payload is in data dot data dot ID. That is the whole flow. We click the button. We grab the whole item, which includes the text. We generate the text, which results in an m p 3. We import the m p 3 and save the m p 3 back to the item. So let's see if this works. Fingers crossed, we're now going and generating that audio. It's going off to that 3rd party vendor creating that realistic sounding audio for us, importing it, and then finally adding it here inside of the file except when it doesn't. Why is that? Let's take a little look together. Let's take a look at the log. What happened there? Trigger, because I got completely the wrong URL of just my director's project here. Tunnel is actually where this project is located. So let's run that one last time, generate audio. We'll give that just a moment once again to do its thing in that time I'll tell you a joke I'm not a funny person so I won't be doing that but that allows me to stall for long enough for this operation to complete and that of course is our, is our wav file, our actual audio file there containing our ad. So that is a little bit about how the, speech generation operation works using directus AI. We hope you enjoy it. I see loads of use cases for this, but the primary one being either like video voiceovers at scale or programmatic ads or stuff like that. So I hope you found this interesting. I'll see you in the next video.","3d5b7ece-22e1-4315-9812-671b8e487cdf",[238],"5a1eb839-4c7d-4f2f-974d-599639631352",[],{"id":133,"number":134,"show":122,"year":135,"episodes":241},[137,138,139,140,141,142,143,144,145,146,147],{"id":143,"slug":243,"vimeo_id":244,"description":245,"tile":246,"length":232,"resources":8,"people":8,"episode_number":154,"published":173,"title":247,"video_transcript_html":248,"video_transcript_text":249,"content":8,"seo":250,"status":130,"episode_people":251,"recommendations":253,"season":254},"ai-speech-transcription","945762260","Generate transcripts from audio files with this custom operation, powered by Deepgram.","cd890799-ed45-4240-a12f-d5790cc4c35a","AI Speech Transcription","\u003Cp>Speaker 0: The Directus AI speech generation operation allows you to create realistic sounding speech from text inside of your director's project. This extension is powered by Jenny, so you will need an API key in order to follow along. Now here I have a collection called ads, and I've created just a very short textual ad that I want to run for directors. However, it's gonna go in something like a podcast or a audiobook or something, so it needs to be in audio form. So what we're gonna do is create a manual flow where when we click a button here it will go off and generate that audio for us.\u003C/p>\u003Cp>So let's go over to our flows and create a new flow, generate audio, with a manual trigger on the ads collection. This will return just the ID of the item where the button is pressed. We obviously want the text. So the first thing we're gonna do is read data and we will read data from the ads collection, specifically the ID from the from the item whether it was pressed. So trigger dot body dot keys zero.\u003C/p>\u003Cp>So this will return the text and the currently empty file field. Then we can go straight away and send this off to the AI speech generation operation. Now we do need a Jenny API key, but I have one that I made earlier. And in here, we put in our text with a maximum of 500 characters. And I am gonna go ahead and just say, hey, that last operation that fetched all the data, go grab the text value out of it.\u003C/p>\u003Cp>You get to pick one of the selected speakers, so we'll use Brian Lee junior here and you get to specify the speed at which the, the speech happens. So this will return just a URL of an mp3 on the web. Next, we need to import it into this Director's project, and we can do that using the webhook request URL operation. So we'll make a post request to this directus URL trigger dotlws.i. So that's your specific project URL/assets, not assets, sorry, slash files slash import.\u003C/p>\u003Cp>That's the endpoint. It's a post request, and then the body here, we are going to just pass in the URL. Now just a note that for this project I've made file creation publicly accessible, you may need to lock down those permissions and provide your authentication headers here, but for ease I've turned that off for this demo. So what this will do is make that API call and return with the whole payload of the brand new director's files item that was just created, and what we wanna do is extract the ID and save that back to our ads item. So let's update the ads item here.\u003C/p>\u003Cp>We wanna update trigger.body.keys 0, and what we wanna do is just update the file value, and the location of the ID in the returned JSON payload is in data dot data dot ID. That is the whole flow. We click the button. We grab the whole item, which includes the text. We generate the text, which results in an m p 3.\u003C/p>\u003Cp>We import the m p 3 and save the m p 3 back to the item. So let's see if this works. Fingers crossed, we're now going and generating that audio. It's going off to that 3rd party vendor creating that realistic sounding audio for us, importing it, and then finally adding it here inside of the file except when it doesn't. Why is that?\u003C/p>\u003Cp>Let's take a little look together. Let's take a look at the log. What happened there? Trigger, because I got completely the wrong URL of just my director's project here. Tunnel is actually where this project is located.\u003C/p>\u003Cp>So let's run that one last time, generate audio. We'll give that just a moment once again to do its thing in that time I'll tell you a joke I'm not a funny person so I won't be doing that but that allows me to stall for long enough for this operation to complete and that of course is our, is our wav file, our actual audio file there containing our ad. So that is a little bit about how the, speech generation operation works using directus AI. We hope you enjoy it. I see loads of use cases for this, but the primary one being either like video voiceovers at scale or programmatic ads or stuff like that.\u003C/p>\u003Cp>So I hope you found this interesting. I'll see you in the next video.\u003C/p>","The Directus AI speech generation operation allows you to create realistic sounding speech from text inside of your director's project. This extension is powered by Jenny, so you will need an API key in order to follow along. Now here I have a collection called ads, and I've created just a very short textual ad that I want to run for directors. However, it's gonna go in something like a podcast or a audiobook or something, so it needs to be in audio form. So what we're gonna do is create a manual flow where when we click a button here it will go off and generate that audio for us. So let's go over to our flows and create a new flow, generate audio, with a manual trigger on the ads collection. This will return just the ID of the item where the button is pressed. We obviously want the text. So the first thing we're gonna do is read data and we will read data from the ads collection, specifically the ID from the from the item whether it was pressed. So trigger dot body dot keys zero. So this will return the text and the currently empty file field. Then we can go straight away and send this off to the AI speech generation operation. Now we do need a Jenny API key, but I have one that I made earlier. And in here, we put in our text with a maximum of 500 characters. And I am gonna go ahead and just say, hey, that last operation that fetched all the data, go grab the text value out of it. You get to pick one of the selected speakers, so we'll use Brian Lee junior here and you get to specify the speed at which the, the speech happens. So this will return just a URL of an mp3 on the web. Next, we need to import it into this Director's project, and we can do that using the webhook request URL operation. So we'll make a post request to this directus URL trigger dotlws.i. So that's your specific project URL/assets, not assets, sorry, slash files slash import. That's the endpoint. It's a post request, and then the body here, we are going to just pass in the URL. Now just a note that for this project I've made file creation publicly accessible, you may need to lock down those permissions and provide your authentication headers here, but for ease I've turned that off for this demo. So what this will do is make that API call and return with the whole payload of the brand new director's files item that was just created, and what we wanna do is extract the ID and save that back to our ads item. So let's update the ads item here. We wanna update trigger.body.keys 0, and what we wanna do is just update the file value, and the location of the ID in the returned JSON payload is in data dot data dot ID. That is the whole flow. We click the button. We grab the whole item, which includes the text. We generate the text, which results in an m p 3. We import the m p 3 and save the m p 3 back to the item. So let's see if this works. Fingers crossed, we're now going and generating that audio. It's going off to that 3rd party vendor creating that realistic sounding audio for us, importing it, and then finally adding it here inside of the file except when it doesn't. Why is that? Let's take a little look together. Let's take a look at the log. What happened there? Trigger, because I got completely the wrong URL of just my director's project here. Tunnel is actually where this project is located. So let's run that one last time, generate audio. We'll give that just a moment once again to do its thing in that time I'll tell you a joke I'm not a funny person so I won't be doing that but that allows me to stall for long enough for this operation to complete and that of course is our, is our wav file, our actual audio file there containing our ad. So that is a little bit about how the, speech generation operation works using directus AI. We hope you enjoy it. I see loads of use cases for this, but the primary one being either like video voiceovers at scale or programmatic ads or stuff like that. So I hope you found this interesting. I'll see you in the next video.","00e06324-0577-4399-ad49-ac9bdc4ce2cf",[252],"4698e4b9-382b-4b95-93ab-86921d79f77d",[],{"id":133,"number":134,"show":122,"year":135,"episodes":255},[137,138,139,140,141,142,143,144,145,146,147],{"id":144,"slug":257,"vimeo_id":258,"description":259,"tile":260,"length":188,"resources":8,"people":8,"episode_number":261,"published":173,"title":262,"video_transcript_html":263,"video_transcript_text":264,"content":8,"seo":265,"status":130,"episode_people":266,"recommendations":268,"season":269},"ai-text-extraction","945762700","Extract text from image files within Directus Files with this custom operation, using Clarifai.","4a3c8606-c4d9-41c1-a9e3-5322f3cfc83a",8,"AI Text Extraction","\u003Cp>Speaker 0: The Directus AI text extraction operation will do exactly that. You feed it an image and it will extract text from that image. You can then do whatever you want with it, but in today's example, we're going to save the extracted text to the file description. And we and we're going to do this based on an event hook, a non blocking event hook whenever a file is uploaded. Now we're gonna not set up any extra configuration, but in the real, you would probably want a condition that, says this has to be an image file.\u003C/p>\u003Cp>Right now, it will trigger on every file, and the documentation of this extension will show you how to do that. So then we are gonna just go straight away and we are going to use the AI text extraction operation. And you have to provide your Clarify access token, which I made earlier, and provide a direct file URL. So your full director's project URL slash assets and then slash trigger dot key. So that is the file ID that has just been uploaded that has triggered this whole flow to actually begin.\u003C/p>\u003Cp>And this will return a couple of things, it will return the overall text, but it will also return different bounding boxes, so you can say, hey, only give me the text maybe in the top left or stuff like that, but we're gonna just take that overall summary, and we're gonna save it back to the image. So we are going to update the Directus files core collection, and we are going to update specifically the item whose upload started this whole thing, and we are going to set the description to last dot text, so that is the value from this is a is an object, text is a property within it, and that is the entire setup of the AI text extraction operation. Very nifty. So let's, try this out. Let's go to our file library here and let's upload a new file.\u003C/p>\u003Cp>Just moments later we can go in and we can see right here the description has been filled in. Now probably a very fair point the AI is not perfect and you'll see here finance manager. The f is missing, but it's not done a bad job. Perhaps in your real workflows, you'll want a a step of human intervention. This will still save loads of time for stuff like business cards, for written documents, for receipts and invoices, but do always make sure that you're checking the output is exactly what you need it to be.\u003C/p>\u003Cp>But that is the, the rundown of how the AI text extraction operation works. Hope you found this interesting, and I'll see you in the next video.\u003C/p>","The Directus AI text extraction operation will do exactly that. You feed it an image and it will extract text from that image. You can then do whatever you want with it, but in today's example, we're going to save the extracted text to the file description. And we and we're going to do this based on an event hook, a non blocking event hook whenever a file is uploaded. Now we're gonna not set up any extra configuration, but in the real, you would probably want a condition that, says this has to be an image file. Right now, it will trigger on every file, and the documentation of this extension will show you how to do that. So then we are gonna just go straight away and we are going to use the AI text extraction operation. And you have to provide your Clarify access token, which I made earlier, and provide a direct file URL. So your full director's project URL slash assets and then slash trigger dot key. So that is the file ID that has just been uploaded that has triggered this whole flow to actually begin. And this will return a couple of things, it will return the overall text, but it will also return different bounding boxes, so you can say, hey, only give me the text maybe in the top left or stuff like that, but we're gonna just take that overall summary, and we're gonna save it back to the image. So we are going to update the Directus files core collection, and we are going to update specifically the item whose upload started this whole thing, and we are going to set the description to last dot text, so that is the value from this is a is an object, text is a property within it, and that is the entire setup of the AI text extraction operation. Very nifty. So let's, try this out. Let's go to our file library here and let's upload a new file. Just moments later we can go in and we can see right here the description has been filled in. Now probably a very fair point the AI is not perfect and you'll see here finance manager. The f is missing, but it's not done a bad job. Perhaps in your real workflows, you'll want a a step of human intervention. This will still save loads of time for stuff like business cards, for written documents, for receipts and invoices, but do always make sure that you're checking the output is exactly what you need it to be. But that is the, the rundown of how the AI text extraction operation works. Hope you found this interesting, and I'll see you in the next video.","302dac60-4dda-4a4c-b9b5-fa7d27a506f0",[267],"80258ab7-b77c-4e91-bd2b-4b62ae993ebc",[],{"id":133,"number":134,"show":122,"year":135,"episodes":270},[137,138,139,140,141,142,143,144,145,146,147],{"id":145,"slug":272,"vimeo_id":273,"description":274,"tile":275,"length":171,"resources":8,"people":8,"episode_number":276,"published":173,"title":277,"video_transcript_html":278,"video_transcript_text":279,"content":8,"seo":280,"status":130,"episode_people":281,"recommendations":283,"season":284},"ai-text-intelligence","945762911","Analyze text intents, sentiment, topics, and generate a summary within with this custom operation, powered by Deepgram.","e9291721-20ad-4a6f-a6ea-e5158d7baf79",9,"AI Text Intelligence","\u003Cp>Speaker 0: The Directus AI text intelligence operation allows you to analyze bodies of text and generate summaries, topics, intents, and sentiments powered by Deepgram. Today, I'm gonna show you how to set it up using a manual flow trigger. Inside of this episode's collection, we have items representing podcast episodes with a transcript of every word that is said inside of this podcast. What we're gonna do is set up a manual flow. So when we click a button here, it will generate a summary using the text intelligence operation.\u003C/p>\u003Cp>And, of course, we're gonna do it manually, but you could do this automatically on the creation of a new podcast or a new transcript, but we're gonna do it manually. So let's head over to our flows and create a new flow called summarise. We're gonna do this based on a manual trigger on the operations collection. Now whenever this runs, all we get is the ID of the item where the button was pressed. We obviously need the summary.\u003C/p>\u003Cp>We need the transcript rather. So the first thing we'll do is we will create a read data operation, and what we'll do is say in the episodes collection, we want to access trigger dot body dot keys 0. So this will return the whole object including the ID, the file ID, the transcript, and the currently empty summary field. So we're then gonna send this off to the AI text intelligence service here. And the first thing you'll need to pop in is a Deepgram API key.\u003C/p>\u003Cp>The second thing you need to put in is actually the text itself. Unfortunately, this will have been returned in the last operation, and it's called transcript. So we can just send that off like so. So this will go off. It will it will return summaries, topics, intents, and sentiments.\u003C/p>\u003Cp>And for topics intents and sentiments, it will kind of break that down for different portions of the text. And for sentiments, you'll also get a kind of average summary, which is really useful if you wanna say, you know, a call into your, you know, call center or a call with a prospect or something like that. What was the general sentiment from beginning to end? So as I said, this is gonna return quite a lot of data. We only care about the summary.\u003C/p>\u003Cp>And what we wanna do is actually save that summary back to the item where we clicked the button. So that was in episodes, and the ID was trigger dot body dot keys 0. And the payload, what we actually wanna update that item with is a summary field. So we wanna update the summary field, and we want the value of that to be last dot summary dot text, like so. So if we hit save, this is actually the whole operation, the whole, sorry, flow.\u003C/p>\u003Cp>So we click the button. We grab the whole item. We send it off to the text intelligence service, and then we save the outcome. Of course, you don't need to save it back to the item. You could simply send an email out or do something else with it, but we're gonna save it back to the item.\u003C/p>\u003Cp>And if all has worked, I should be able to click this summarize button, wait a few seconds. It's being summarized. Topics are being generated. Intents and sentiments, we're grabbing just the summary, and there we go. There's the summary.\u003C/p>\u003Cp>So I'm sure you can see all of the ways this can be applied. It's really flexible. It's really interesting. And, again, it's not just summaries. It's topics.\u003C/p>\u003Cp>It's intents, and it's sentiments. So I hope you found this interesting, and I'll see you in the next show.\u003C/p>","The Directus AI text intelligence operation allows you to analyze bodies of text and generate summaries, topics, intents, and sentiments powered by Deepgram. Today, I'm gonna show you how to set it up using a manual flow trigger. Inside of this episode's collection, we have items representing podcast episodes with a transcript of every word that is said inside of this podcast. What we're gonna do is set up a manual flow. So when we click a button here, it will generate a summary using the text intelligence operation. And, of course, we're gonna do it manually, but you could do this automatically on the creation of a new podcast or a new transcript, but we're gonna do it manually. So let's head over to our flows and create a new flow called summarise. We're gonna do this based on a manual trigger on the operations collection. Now whenever this runs, all we get is the ID of the item where the button was pressed. We obviously need the summary. We need the transcript rather. So the first thing we'll do is we will create a read data operation, and what we'll do is say in the episodes collection, we want to access trigger dot body dot keys 0. So this will return the whole object including the ID, the file ID, the transcript, and the currently empty summary field. So we're then gonna send this off to the AI text intelligence service here. And the first thing you'll need to pop in is a Deepgram API key. The second thing you need to put in is actually the text itself. Unfortunately, this will have been returned in the last operation, and it's called transcript. So we can just send that off like so. So this will go off. It will it will return summaries, topics, intents, and sentiments. And for topics intents and sentiments, it will kind of break that down for different portions of the text. And for sentiments, you'll also get a kind of average summary, which is really useful if you wanna say, you know, a call into your, you know, call center or a call with a prospect or something like that. What was the general sentiment from beginning to end? So as I said, this is gonna return quite a lot of data. We only care about the summary. And what we wanna do is actually save that summary back to the item where we clicked the button. So that was in episodes, and the ID was trigger dot body dot keys 0. And the payload, what we actually wanna update that item with is a summary field. So we wanna update the summary field, and we want the value of that to be last dot summary dot text, like so. So if we hit save, this is actually the whole operation, the whole, sorry, flow. So we click the button. We grab the whole item. We send it off to the text intelligence service, and then we save the outcome. Of course, you don't need to save it back to the item. You could simply send an email out or do something else with it, but we're gonna save it back to the item. And if all has worked, I should be able to click this summarize button, wait a few seconds. It's being summarized. Topics are being generated. Intents and sentiments, we're grabbing just the summary, and there we go. There's the summary. So I'm sure you can see all of the ways this can be applied. It's really flexible. It's really interesting. And, again, it's not just summaries. It's topics. It's intents, and it's sentiments. So I hope you found this interesting, and I'll see you in the next show.","0dccd3bf-652f-448e-b07e-9ea4222535da",[282],"4504ff0d-9ed8-479c-b7e2-d1013cd35547",[],{"id":133,"number":134,"show":122,"year":135,"episodes":285},[137,138,139,140,141,142,143,144,145,146,147],{"id":146,"slug":287,"vimeo_id":288,"description":289,"tile":290,"length":217,"resources":8,"people":8,"episode_number":291,"published":173,"title":292,"video_transcript_html":293,"video_transcript_text":294,"content":8,"seo":295,"status":130,"episode_people":296,"recommendations":298,"season":299},"ai-text-translator","945763189","Translate text into over 30 languages with this custom oepration, powered by DeepL.","b5c4b266-6fde-4c42-ad52-430fae9037ae",10,"AI Text Translator","\u003Cp>Speaker 0: The Directus AI text translator operation allows you to provide some text and a target language, and it will be translated into the target language. This operation extension is powered by DeepL, so you will need a DeepL API key in order to get started. Now here in our directors project, we have an episodes collection, and here we have moved transcript into a translation, which means that this bass here in English is actually not in this collection. It's actually held within the episodes translations. You can read more about translations and directors inside of our documentation, but just to give you the high level understanding, we have an item.\u003C/p>\u003Cp>The item relates to episodes translations, which contains, a link to the item, a link to the target language, and the specific translated fields in that language for that item, and we have a languages collection. In this case, just English and German. We're assuming that content will always be authored in English, and then you will be translating it into German. But, of course, you can build more flexible workflows using prompt confirmation dialogues or looping flows or stuff like that. So our goal will be to have a button here translate to German and the German translation will be applied by creating a new item in the episodes translations collection.\u003C/p>\u003Cp>Let's create a new flow called translate to German, and this will be a manual trigger on the episodes page. So this returns the ID of the item where we click the button which is actually perfect for our use case. What we're gonna do is we we're now gonna kind of cross reference and instead of grabbing data from this item we're gonna go grab the existing English translation for this item, so we have the English base to translate. So we are gonna read the data from the episodes translations collection with the following filter. We want to make sure that the item is from this, the translation item is related to this episode item and that we are only grabbing the English.\u003C/p>\u003Cp>So we will hit save. So this should return, an array with 1 item in it which contains the translation. We are then gonna send this to the AI trans the AI translation operation. Now you will need a DeepL API key. Here's one I made earlier, and select which API plan you're on.\u003C/p>\u003Cp>And in here, we pass in some text. We could hard code it, but we actually want it from the previous operation. Transcript, trans script. Yeah, and we pick a target language that this operation supports. So this should return, this should return just a string not an object just a pure string of that content in German instead.\u003C/p>\u003Cp>And the final thing we want to do is create a new translation. So we will create data in the episodes translations collection, and the payload will be as follows. The episode ID needs to match the initial one, the language that we've translated to, so this is the language code for German, and the string inside of transcript. So we'll hit save on all of those. So just to reiterate, we click the button on the episode.\u003C/p>\u003Cp>We grab the existing English translation for that item. We translate it to German, and we create a new translation item. So let's go to our episode. Let's hit translate to German, and there is our German translation for the same content. Once again you can build really powerful workflows here by looping or maybe by allowing a specific language selection as part of a confirmation prompt dialogue.\u003C/p>\u003Cp>That is how the AI, text translator operation extension works. Hope you found this interesting. We'll see you next time.\u003C/p>","The Directus AI text translator operation allows you to provide some text and a target language, and it will be translated into the target language. This operation extension is powered by DeepL, so you will need a DeepL API key in order to get started. Now here in our directors project, we have an episodes collection, and here we have moved transcript into a translation, which means that this bass here in English is actually not in this collection. It's actually held within the episodes translations. You can read more about translations and directors inside of our documentation, but just to give you the high level understanding, we have an item. The item relates to episodes translations, which contains, a link to the item, a link to the target language, and the specific translated fields in that language for that item, and we have a languages collection. In this case, just English and German. We're assuming that content will always be authored in English, and then you will be translating it into German. But, of course, you can build more flexible workflows using prompt confirmation dialogues or looping flows or stuff like that. So our goal will be to have a button here translate to German and the German translation will be applied by creating a new item in the episodes translations collection. Let's create a new flow called translate to German, and this will be a manual trigger on the episodes page. So this returns the ID of the item where we click the button which is actually perfect for our use case. What we're gonna do is we we're now gonna kind of cross reference and instead of grabbing data from this item we're gonna go grab the existing English translation for this item, so we have the English base to translate. So we are gonna read the data from the episodes translations collection with the following filter. We want to make sure that the item is from this, the translation item is related to this episode item and that we are only grabbing the English. So we will hit save. So this should return, an array with 1 item in it which contains the translation. We are then gonna send this to the AI trans the AI translation operation. Now you will need a DeepL API key. Here's one I made earlier, and select which API plan you're on. And in here, we pass in some text. We could hard code it, but we actually want it from the previous operation. Transcript, trans script. Yeah, and we pick a target language that this operation supports. So this should return, this should return just a string not an object just a pure string of that content in German instead. And the final thing we want to do is create a new translation. So we will create data in the episodes translations collection, and the payload will be as follows. The episode ID needs to match the initial one, the language that we've translated to, so this is the language code for German, and the string inside of transcript. So we'll hit save on all of those. So just to reiterate, we click the button on the episode. We grab the existing English translation for that item. We translate it to German, and we create a new translation item. So let's go to our episode. Let's hit translate to German, and there is our German translation for the same content. Once again you can build really powerful workflows here by looping or maybe by allowing a specific language selection as part of a confirmation prompt dialogue. That is how the AI, text translator operation extension works. Hope you found this interesting. We'll see you next time.","68280a24-6880-4499-9100-3d2793c606b9",[297],"497401ce-4880-4166-a825-4e1cdaadfbde",[],{"id":133,"number":134,"show":122,"year":135,"episodes":300},[137,138,139,140,141,142,143,144,145,146,147],{"id":147,"slug":302,"vimeo_id":303,"description":304,"tile":305,"length":171,"resources":8,"people":8,"episode_number":306,"published":173,"title":307,"video_transcript_html":308,"video_transcript_text":309,"content":8,"seo":310,"status":130,"episode_people":311,"recommendations":313,"season":314},"ai-writer","945763500","Generate text based on a prompt with this custom operation, powered by OpenAI.","471ed635-921b-4153-92eb-1a31d87951a5",11,"AI Writer","\u003Cp>Speaker 0: Here we have an articles collection with a title and a piece of content. We're gonna generate a social post, a social text right here, but I'm also gonna get to show you the other prompts that are available as well as the advanced usage mode. So let's go ahead and create a new flow, and we'll call this writer. We're gonna do this based on a manual flow trigger, so you click a button in the sidebar. We'll make that available on the article item pages.\u003C/p>\u003Cp>Now this will only return when triggered, the ID. So first thing we wanna do is read the whole item so we can get the content. So we will read data from the content. Including the content. Now, we're gonna use the ai writer operation.\u003C/p>\u003Cp>Let's take a little look at it together. Firstly, you need to provide an OpenAI API key. You select the GPT model, each of these having different characteristics around speed and cost, and, of course, the quality of the output, we'll use GPT 4. And you can use one of our selected prompts, fix spelling and grammar, short social post, make longer, make shorter, create an SEO description, or a custom prompt. On top of all of that, you can also use this messages mode here in order to utilize, like, multi step prompt engineering where you can give it kind of a history of messages as either the system, the assistant, or the user, and then your message will come in after all of that.\u003C/p>\u003Cp>Really good for powerful prompt engineering. But for now, we'll just create a short social post. So we're gonna pass into this last dot content, and we're gonna use our built in prompt short social post. Let's go ahead and see what this returns. So we'll go ahead here.\u003C/p>\u003Cp>We'll go back to our item, and we'll run the writer operation. So that's going off. It's doing its work, but, of course, we've not told it to save back to the item. So that is the end, but now we get to see in the logs what was actually returned. We see here the text is indeed returned.\u003C/p>\u003Cp>So what we can do is we can add on to the end of this and update data operation. We will update the article, which triggered this flow once again. So trigger dot body dot keys 0 and we are gonna update the social text property with the value of last like so. And that's everything we need to do. Of course, the flexibility comes in the configuration, the custom prompts, and indeed the multi step prompt engineering that is available to you.\u003C/p>\u003Cp>For now, if we click this manual prompt and we wait a few seconds, we should receive a much shorter I mean, this is, like, a fairly long piece here. It's a transcription from a podcast. That is a social post that we can go ahead and share. So that's how the AI writer operation works. I hope you find it useful.\u003C/p>\u003Cp>I'm sure you can see the many many many utilizations of it, and, yeah, thank you so much for joining me. I'll see you in the next video!\u003C/p>","Here we have an articles collection with a title and a piece of content. We're gonna generate a social post, a social text right here, but I'm also gonna get to show you the other prompts that are available as well as the advanced usage mode. So let's go ahead and create a new flow, and we'll call this writer. We're gonna do this based on a manual flow trigger, so you click a button in the sidebar. We'll make that available on the article item pages. Now this will only return when triggered, the ID. So first thing we wanna do is read the whole item so we can get the content. So we will read data from the content. Including the content. Now, we're gonna use the ai writer operation. Let's take a little look at it together. Firstly, you need to provide an OpenAI API key. You select the GPT model, each of these having different characteristics around speed and cost, and, of course, the quality of the output, we'll use GPT 4. And you can use one of our selected prompts, fix spelling and grammar, short social post, make longer, make shorter, create an SEO description, or a custom prompt. On top of all of that, you can also use this messages mode here in order to utilize, like, multi step prompt engineering where you can give it kind of a history of messages as either the system, the assistant, or the user, and then your message will come in after all of that. Really good for powerful prompt engineering. But for now, we'll just create a short social post. So we're gonna pass into this last dot content, and we're gonna use our built in prompt short social post. Let's go ahead and see what this returns. So we'll go ahead here. We'll go back to our item, and we'll run the writer operation. So that's going off. It's doing its work, but, of course, we've not told it to save back to the item. So that is the end, but now we get to see in the logs what was actually returned. We see here the text is indeed returned. So what we can do is we can add on to the end of this and update data operation. We will update the article, which triggered this flow once again. So trigger dot body dot keys 0 and we are gonna update the social text property with the value of last like so. And that's everything we need to do. Of course, the flexibility comes in the configuration, the custom prompts, and indeed the multi step prompt engineering that is available to you. For now, if we click this manual prompt and we wait a few seconds, we should receive a much shorter I mean, this is, like, a fairly long piece here. It's a transcription from a podcast. That is a social post that we can go ahead and share. So that's how the AI writer operation works. I hope you find it useful. I'm sure you can see the many many many utilizations of it, and, yeah, thank you so much for joining me. I'll see you in the next video!","e48fb3eb-e55e-4454-a5e8-3fcf2e814784",[312],"42f1c79c-17a4-45ba-8cd4-4a4cea2f166c",[],{"id":133,"number":134,"show":122,"year":135,"episodes":315},[137,138,139,140,141,142,143,144,145,146,147],{"reps":317},[318,374],{"name":319,"sdr":8,"link":320,"countries":321,"states":323},"John Daniels","https://meet.directus.io/meetings/john2144/john-contact-form-meeting",[322],"United States",[324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373],"Michigan","Indiana","Ohio","West Virginia","Kentucky","Virginia","Tennessee","North Carolina","South Carolina","Georgia","Florida","Alabama","Mississippi","New York","MI","IN","OH","WV","KY","VA","TN","NC","SC","GA","FL","AL","MS","NY","Connecticut","CT","Delaware","DE","Maine","ME","Maryland","MD","Massachusetts","MA","New Hampshire","NH","New Jersey","NJ","Pennsylvania","PA","Rhode Island","RI","Vermont","VT","Washington DC","DC",{"name":375,"link":376,"countries":377},"Michelle Riber","https://meetings.hubspot.com/mriber",[378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,355,566,567],"Albania","ALB","Algeria","DZA","Andorra","AND","Angola","AGO","Austria","AUT","Belgium","BEL","Benin","BEN","Bosnia and Herzegovina","BIH","Botswana","BWA","Bulgaria","BGR","Burkina Faso","BFA","Burundi","BDI","Cameroon","CMR","Cape Verde","CPV","Central African Republic","CAF","Chad","TCD","Comoros","COM","Côte d'Ivoire","CIV","Croatia","HRV","Czech Republic","CZE","Democratic Republic of Congo","COD","Denmark","DNK","Djibouti","DJI","Egypt","EGY","Equatorial Guinea","GNQ","Eritrea","ERI","Estonia","EST","Eswatini","SWZ","Ethiopia","ETH","Finland","FIN","France","FRA","Gabon","GAB","Gambia","GMB","Ghana","GHA","Greece","GRC","Guinea","GIN","Guinea-Bissau","GNB","Hungary","HUN","Iceland","ISL","Ireland","IRL","Italy","ITA","Kenya","KEN","Latvia","LVA","Lesotho","LSO","Liberia","LBR","Libya","LBY","Liechtenstein","LIE","Lithuania","LTU","Luxembourg","LUX","Madagascar","MDG","Malawi","MWI","Mali","MLI","Malta","MLT","Mauritania","MRT","Mauritius","MUS","Moldova","MDA","Monaco","MCO","Montenegro","MNE","Morocco","MAR","Mozambique","MOZ","Namibia","NAM","Niger","NER","Nigeria","NGA","North Macedonia","MKD","Norway","NOR","Poland","POL","Portugal","PRT","Republic of Congo","COG","Romania","ROU","Rwanda","RWA","San Marino","SMR","São Tomé and Príncipe","STP","Senegal","SEN","Serbia","SRB","Seychelles","SYC","Sierra Leone","SLE","Slovakia","SVK","Slovenia","SVN","Somalia","SOM","South Africa","ZAF","South Sudan","SSD","Spain","ESP","Sudan","SDN","Sweden","SWE","Tanzania","TZA","Togo","TGO","Tunisia","TUN","Uganda","UGA","United Kingdom","GBR","Vatican City","VAT","Zambia","ZMB","Zimbabwe","ZWE","UK","Germany","Netherlands","Switzerland","CH","NL",1773850417643]