Using AI to create new content "autonomously"

Hi,

I’ve had a request to investigate integrating AI into a client’s site, to bolster its own chances of being referenced in AI searches by customers (“GEO”). Their site content is heavily based on block lists, so a product page might contain a Text Block describing the product, an Image Block, and FAQ Block about the product etc. Since the blocks can be fairly generic (e.g. a “Text Block” could contain information about a product or general article information or quotes etc) there isn’t a great way of being able to create a JSON-LD structure from that block’s data automatically in code, as the content could represent one of several types of schema. Ideally there’d be a block for each type of JSON-LD schema and it would then be much simpler, but this is a historical site with a huge amount of content so that’s not an option.

I’m investigating whether it would be feasible to add a property to each page called ‘JSON-LD’ or something, and potentially have AI read through all of the block content on that page and create suitable JSON-LD data from it.

Question 1. Is this viable? If so, how, in simple terms would this be achieved? I’ve not yet used Umbraco AI so it’s a little abstract at the moment.

Question 2. Is there a way the client can use their own AI tooling, outside of Umbraco, to update content inside Umbraco. I’m thinking for example, the client opens their desktop AI agent and says “create JSON-LD schema data for all pages in the product section”, or “on the ‘Widget’ page, modify the JSON-LD schema to be a Product rather than an Article”, or even, “add an FAQ block to the ‘Widget’ page, with this content (…) and summarise that information in a JSON-LD snippet using the FAQPage schema”. This should be gate-kept so changes needed manual save + publishing in the back-office. Again, if this is doable, what would be the overall approach? Would it require custom code etc?

Many thanks for any pointers folks. :slight_smile:

Hi Dan, I’m wondering whether the SchemeWeaver package could help here?

I haven’t used the package myself (yet), but feels promising, plus there is an AI add-on and uSync support.

I imagine there’s a lot of ways to achieve this. It’d be good to understand the type of content on the site, as that’s where you start with JSON-LD. If you need to define data outside of the typical options (recipes, articles, organisations e.t.c.) then you can define your own schemas. That’s a great job to give AI.

Umbraco AI has access to your content and would be a good tool to generate the JSON-LD data, so creating a read-only property sounds like a good idea. I’m not entirely sure how you’d achieve that though, I’ll let someone more knowledgeable than me to advise.

In terms of outside tooling, that might be possible with Webhooks, but I’d generally stay away from this approach, as it might make things more confusing for editors, and require a great deal of work. Ideally, you’d be able to ask Umbraco AI the same question (see this video for an example).

The final piece would be regenerating the JSON-LD after content change. You might be able to do this with Webhooks or a saved AI process, but that’s for someone who knows more than me!

Finally, this package springs to mind AI Visibility for Umbraco | Umbraco Marketplace which does a lot of AI visibility work. Though it uses Markdown, not JSON-LD

Looking forward to seeing where this thread goes

This looks really interesting, thanks! Since the block types on this site are mostly very generic there isn’t necessarily a particular field which maps neatly into a JSON-LD property, it’s something I’m hoping can be inferred from the overall page content via AI, with the ability to edit if needs be. Similarly a single page might contain data which maps to potentially multiple JSON-LD schemas, and I’m not clear whether it can do that or not. Will certainly dig in and have a better look, thanks! :slight_smile:

Just touching base on this as I’ve implemented a solution and thought it might be interesting to others. It’s worth noting that the solution was quite specific to the project/client requirements on this particular site. The site in question is heavily block-based with very few distinct ‘page’ document types, so it wasn’t practical to associate document types to specific schemas or properties to specific schema properties, which would have made things stricter and to some degree easier. The client is also semi-technical and values flexibility and ultimate control over rigidity.

So the solution we’ve gone with is to use the Umbraco.AI and Umbraco.AI.Prompt packages. A new JSON-LD property (textarea) has been added to each page document type with a prompt to generate JSON-LD data from the page content. Since most of the page data is in blocks, the approach we took here was effectively to render the full page’s published content from the content cache and flatten it down to text, which is then passed to AI to convert to meaningful JSON-LD. AI figures out the most appropriate schema(s) and summarises the content accordingly. It leaves a lot of determination with the LLM, which could be a good or bad thing, but so far it is impressive. There are people overseeing this and can tweak (via their own offline methods or via their connected desktop AI terminals using MCP) if necessary, too, which is important with this kind of implementation.

One potential downside of this approach is that it could result in variable ‘peripheral’ data. For example each page contains general company information (logo, name, contact details etc), which may not parse exactly identically on each request from different pages, but that can be overcome by feeding the model an Organisation Context where these basic details are consistently defined.

I couldn’t figure out (or perhaps there isn’t) a way to hook into the event which populates the property from the returned AI data, so I wasn’t able to validate the data at population time i.e. from the property prompt, but I’ve built in a validator to do so on publish, so if the data happens to be invalid (more likely due to truncation or token limits than anything else, since the prompts stress that the data must be valid JSON-LD) the editor is made aware and has to correct. There’s also an additional safety-net validator on the rendering side which simply doesn’t inject anything incorrectly formatted into the page at render time.

It’s a fairly ‘loose’ implementation but it’s working very nicely and fits the bill in terms of the flexibility the client was looking for.

The extension points Umbraco gives to be able to do this kind of thing are fantastic! :clap:

I’ve done a lot of research on what is ACTUALLY important for being quoted by AI. Yes, you need to have your SEO in order and JSON-LD absolutely helps, but in the end, it’s all about having a good site with up to date information that’s quotable and answers a question. And the more you are refered to externally, the better.

The best indicator for getting quoted is ranking well in the standard search results.

Agreed! JSON-LD to GEO feels a little like meta keywords and description did to SEO in the early days i.e. potentially helpful but the most important thing is still website content and authority.

Microsoft and Google actually parse the JSON-LD because their AI bots are build on top of their search infrastructure, but a lot of others don’t even parse JSON-LD seperately. They just take the entire page content as a blob of text they need to interpret.