{"id":78243,"date":"2025-01-22T11:53:05","date_gmt":"2025-01-22T19:53:05","guid":{"rendered":"https:\/\/blog.mozilla.org\/?p=78243"},"modified":"2025-01-31T09:48:33","modified_gmt":"2025-01-31T17:48:33","slug":"running-inference-in-web-extensions","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/","title":{"rendered":"Running inference in web extensions"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"974\" height=\"948\" src=\"https:\/\/blog.mozilla.org\/wp-content\/blogs.dir\/278\/files\/2025\/01\/Screenshot-2025-01-21-at-15.11.11.png\" alt=\"Image generated by DALL*E using the following prompt: A person standing on a platform in the ocean, surrounded by big waves. They are holding a sail with a big Firefox logo on it. Make it like Hokusai\u2019s The Great Wave off Kanagawa print and make sure the boat looks like it can actually stay afloat\" class=\"wp-image-78245\" srcset=\"https:\/\/blog.mozilla.org\/wp-content\/blogs.dir\/278\/files\/2025\/01\/Screenshot-2025-01-21-at-15.11.11.png 974w, https:\/\/blog.mozilla.org\/wp-content\/blogs.dir\/278\/files\/2025\/01\/Screenshot-2025-01-21-at-15.11.11-300x292.png 300w, https:\/\/blog.mozilla.org\/wp-content\/blogs.dir\/278\/files\/2025\/01\/Screenshot-2025-01-21-at-15.11.11-768x747.png 768w\" sizes=\"(max-width: 974px) 100vw, 974px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center has-small-font-size\">Image generated by DALL*E<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><em>We\u2019re shipping a new API in Firefox Nightly that will let you use our Firefox AI runtime to run offline machine learning tasks in your web extension.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Firefox AI Runtime<\/h2>\n\n\n\n<p>We\u2019ve recently shipped a new <a href=\"https:\/\/firefox-source-docs.mozilla.org\/toolkit\/components\/ml\/\">component<\/a> inside of Firefox that leverages <a href=\"https:\/\/huggingface.co\/docs\/transformers.js\/index\">Transformers.js<\/a> (a JavaScript equivalent of Hugging Face\u2019s <a href=\"https:\/\/github.com\/huggingface\/transformers\">Transformers<\/a> Python library) and the underlying <a href=\"https:\/\/onnxruntime.ai\">ONNX runtime engine<\/a>. This component lets you run any machine learning model that is compatible with Transformers.js in the browser, with no server-side calls beyond the initial download of the models. This means Firefox can run everything on your device and avoid sending your data to third parties.<\/p>\n\n\n\n<p>Web applications can already use Transformers.js in vanilla JavaScript, but running through our platform offers some key benefits:<\/p>\n\n\n\n<ul>\n<li>The inference runtime is executed in a dedicated, isolated process, for safety and robustness<\/li>\n\n\n\n<li>Model files are stored using IndexedDB and shared across origins<\/li>\n\n\n\n<li>Firefox-specific performance improvements are done to accelerate the runtime<\/li>\n<\/ul>\n\n\n\n<p>This platform shipped in Firefox 133 to <a href=\"https:\/\/hacks.mozilla.org\/2024\/05\/experimenting-with-local-alt-text-generation-in-firefox-nightly\/\">provide alt text for images in PDF.js<\/a>, and will be used in several other places in Firefox 134 and beyond to improve the user experience.<\/p>\n\n\n\n<p>We also want to unblock the community\u2019s ability to experiment with these capabilities. Starting later today, developers will be able to access a new trial \u201cml\u201d API in Firefox Nightly. This API is basically a thin wrapper around Firefox\u2019s internal API, but with a few additional restrictions for user privacy and security.<\/p>\n\n\n\n<p>There are two major differences between this API and most other WebExtensions APIs: the API is highly experimental and permission to use it must be requested after installation.<\/p>\n\n\n\n<p>This new API is virtually guaranteed to change in the future. To help set developer expectations, the &#8220;ml&#8221; API is exposed under the &#8220;browser.trial&#8221; namespace rather than directly on the &#8220;browser&#8221; global object. Any API exposed on &#8220;browser.trial&#8221; may not be compatible across major versions of Firefox. Developers should guard against breaking changes using a combination of <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Learn_web_development\/Extensions\/Testing\/Feature_detection\">feature detection<\/a> and <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/manifest.json\/browser_specific_settings\">strict_min_version<\/a> declarations. You can see a more detailed description of how to write extensions with it in <a href=\"https:\/\/firefox-source-docs.mozilla.org\/toolkit\/components\/ml\/extensions.html\">our documentation<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Running an inference task<\/h2>\n\n\n\n<p>Performing inference directly in the browser is quite exciting. We expect people will be able to build compelling features using the browser\u2019s data locally.<\/p>\n\n\n\n<p>Like the original <a href=\"https:\/\/huggingface.co\/docs\/transformers\/\">Transformers<\/a> that inspired it, Transformers.js uses \u201ctasks\u201d to abstract away implementation details for performing specific kinds of ML workloads. You can find a description of all tasks that Transformers.js supports in the project\u2019s <a href=\"http:\/\/transformers.js\">official documentation<\/a>.<\/p>\n\n\n\n<p>For our first iteration, Firefox exposes&nbsp; the following tasks:<\/p>\n\n\n\n<ul>\n<li><strong>text-classification<\/strong> \u2013 Assigning a label or class to a given text<\/li>\n\n\n\n<li><strong>token-classification<\/strong> \u2013 Assigning a label to each token in a text<\/li>\n\n\n\n<li><strong>question-answering<\/strong> \u2013 Retrieve the answer to a question from a given text<\/li>\n\n\n\n<li><strong>fill-mask<\/strong> \u2013&nbsp; Masking some of the words in a sentence and predicting which words should replace those masks<\/li>\n\n\n\n<li><strong>summarization<\/strong> \u2013 Producing a shorter version of a document while preserving its important information.<\/li>\n\n\n\n<li><strong>translation<\/strong> \u2013 Converting text from one language to another<\/li>\n\n\n\n<li><strong>text2text-generation<\/strong> \u2013 converting one text sequence into another text sequence<\/li>\n\n\n\n<li><strong>text-generation<\/strong> \u2013 Producing new text by predicting the next word in a sequence<\/li>\n\n\n\n<li><strong>zero-shot-classification<\/strong> \u2013 Classifying text into classes that are unseen during training<\/li>\n\n\n\n<li><strong>image-to-text<\/strong> \u2013 Output text from a given image<\/li>\n\n\n\n<li><strong>image-classification<\/strong> \u2013 Assigning a label or class to an entire image<\/li>\n\n\n\n<li><strong>image-segmentation<\/strong> \u2013 Divides an image into segments where each pixel is mapped to an object&nbsp;<\/li>\n\n\n\n<li><strong>zero-shot-image-classification<\/strong> \u2013 Classifying images into classes that are unseen during training<\/li>\n\n\n\n<li><strong>object-detection<\/strong> \u2013 Identify objects of certain defined classes within an image<\/li>\n\n\n\n<li><strong>zero-shot-object-detection<\/strong> \u2013 Identify objects of classes that are unseen during training<\/li>\n\n\n\n<li><strong>document-question-answering<\/strong> \u2013 Answering questions on document image<\/li>\n\n\n\n<li><strong>image-to-image<\/strong> \u2013 Transforming a source image to match the characteristics of a target image or a target image domain<\/li>\n\n\n\n<li><strong>depth-estimation<\/strong> \u2013 Predicting the depth of objects present in an image<\/li>\n\n\n\n<li><strong>feature-extraction<\/strong> \u2013 Transforming raw data into numerical features that can be processed while preserving the information in the original dataset<\/li>\n\n\n\n<li><strong>image-feature-extraction<\/strong> \u2013 Transforming raw data into numerical features that can be processed while preserving the information in the original image<\/li>\n<\/ul>\n\n\n\n<p>For each task, we\u2019ve selected a default model. See the list here<a href=\"https:\/\/searchfox.org\/mozilla-central\/source\/toolkit\/components\/ml\/content\/EngineProcess.sys.mjs#32\"> EngineProcess.sys.mjs \u2013 mozsearch<\/a>. These curated models are all stored in our Model Hub at <a href=\"https:\/\/model-hub.mozilla.org\/\">https:\/\/model-hub.mozilla.org\/<\/a>. A Model Hub is how Hugging Face defines an online storage of models, see <a href=\"https:\/\/huggingface.co\/docs\/hub\/en\/models-the-hub\">The Model Hub<\/a>. Whether used by Firefox itself or an extension, models are automatically downloaded on the first use and cached.<\/p>\n\n\n\n<p>Below is example below showing how to run a summarizer in your extension with the default model:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background\"><code>async function summarize(text) {\n  await browser.trial.ml.createEngine({taskName: \"summarization\"});\n  const result = await browser.trial.ml.runEngine({args: &#91;text]});\n  return result&#91;0]&#91;\"summary_text\"];\n}<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>If you want to use another model, you can use any model published on Hugging Face by <a href=\"https:\/\/huggingface.co\/Xenova\">Xenova<\/a> or the <a href=\"https:\/\/huggingface.co\/Mozilla\">Mozilla<\/a> organization. For now, we\u2019ve restricted downloading models from those two organizations, but we might relax this limitation in the future.<\/p>\n\n\n\n<p>To use an allow-listed model from Hugging Face, you can use an options object to set the &#8220;modelHub&#8221; option to &#8220;huggingface&#8221;&nbsp; and the &#8220;taskName&#8221; option to the appropriate task when creating an engine.<\/p>\n\n\n\n<p>Let\u2019s modify the previous example to use a model that can summarize larger texts:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background\"><code><code>async function summarize(text) {\n  await browser.trial.ml.createEngine({\n    taskName: \"summarization\", \n    modelHub: \"huggingface\", \n    modelId: \"Xenova\/long-t5-tglobal-base-16384-book-summary\"\n   });\n  const result = await browser.trial.ml.runEngine({args: &#91;text]});\n  return result&#91;0]&#91;\"summary_text\"];\n}<\/code><\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Our PDF.js alt text feature follows the same pattern:<\/p>\n\n\n\n<ul>\n<li>Gets the image to describe<\/li>\n\n\n\n<li>Use the \u201cimage-to-text\u201d task with the \u201c<a href=\"https:\/\/huggingface.co\/Mozilla\/distilvit\">mozilla\/distilvit<\/a>\u201d model<\/li>\n\n\n\n<li>Run the inference and return the generated text<\/li>\n<\/ul>\n\n\n\n<p>This feature is built directly into Firefox, but we\u2019ve also made a web extension example out of it, that you can find in our source code and use as a basis to build your own. See <a href=\"https:\/\/searchfox.org\/mozilla-central\/source\/toolkit\/components\/ml\/docs\/extensions-api-example\">https:\/\/searchfox.org\/mozilla-central\/source\/toolkit\/components\/ml\/docs\/extensions-api-example<\/a>. For instance, it includes some code to <a href=\"https:\/\/searchfox.org\/mozilla-central\/source\/toolkit\/components\/ml\/docs\/extensions-api-example\/settings.js\">request the relevant permission<\/a>, and a model download progress bar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">We\u2019d love to hear from you<\/h2>\n\n\n\n<p>This API is our first attempt to enable the community to build on the top of our Firefox AI Runtime. We want to make this API as simple and powerful as possible.<\/p>\n\n\n\n<p>We believe that offering this feature to web extensions developers will help us learn and understand if and how such an API could be developed as a web standard in the future.<\/p>\n\n\n\n<p>We\u2019d love to hear from you and see what you are building with this.<\/p>\n\n\n\n<p>Come and say hi in our dedicated Mozilla AI discord #firefox-ai. Discord invitation: <a href=\"https:\/\/discord.gg\/Jmmq9mGwy7\">https:\/\/discord.gg\/Jmmq9mGwy7<\/a><\/p>\n\n\n\n<p>Last but not least, we\u2019re doing a <a href=\"https:\/\/fosdem.org\/2025\/schedule\/event\/fosdem-2025-4236-the-firefox-ai-platform\/\">deep dive talk at the FOSDEM<\/a> in the Mozilla room Sunday February 2nd in Brussels. There will be many interesting talks in that room, see: <a href=\"https:\/\/fosdem.org\/2025\/schedule\/track\/mozilla\/\">https:\/\/fosdem.org\/2025\/schedule\/track\/mozilla\/<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Image generated by DALL*E We\u2019re shipping a new API in Firefox Nightly that will let you use our Firefox AI runtime to run offline machine learning tasks in your web extension. Firefox AI Runtime We\u2019ve recently shipped a new component inside of Firefox that leverages Transformers.js (a JavaScript equivalent of Hugging Face\u2019s Transformers Python library) [&hellip;]<\/p>\n","protected":false},"author":571,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30,464303],"tags":[464302,317823,464204,847],"coauthors":[464290],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Running inference in web extensions<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/\",\"url\":\"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/\",\"name\":\"Running inference in web extensions\",\"isPartOf\":{\"@id\":\"https:\/\/blog.mozilla.org\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.mozilla.org\/wp-content\/blogs.dir\/278\/files\/2025\/01\/Screenshot-2025-01-21-at-15.11.11.png\",\"datePublished\":\"2025-01-22T19:53:05+00:00\",\"dateModified\":\"2025-01-31T17:48:33+00:00\",\"author\":{\"@id\":\"https:\/\/blog.mozilla.org\/en\/#\/schema\/person\/aca87dfe79b30da7610884ccd00144ba\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/#primaryimage\",\"url\":\"https:\/\/blog.mozilla.org\/wp-content\/blogs.dir\/278\/files\/2025\/01\/Screenshot-2025-01-21-at-15.11.11.png\",\"contentUrl\":\"https:\/\/blog.mozilla.org\/wp-content\/blogs.dir\/278\/files\/2025\/01\/Screenshot-2025-01-21-at-15.11.11.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.mozilla.org\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Running inference in web extensions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.mozilla.org\/en\/#website\",\"url\":\"https:\/\/blog.mozilla.org\/en\/\",\"name\":\"The Mozilla Blog\",\"description\":\"News and Updates about Mozilla\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.mozilla.org\/en\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.mozilla.org\/en\/#\/schema\/person\/aca87dfe79b30da7610884ccd00144ba\",\"name\":\"Tarek Ziad\u00e9\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/en\/#\/schema\/person\/image\/4b0534bdcf6128df7f4dd34147fcc358\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a75a18983be643c76d3219fb2ffc9aa7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a75a18983be643c76d3219fb2ffc9aa7?s=96&d=mm&r=g\",\"caption\":\"Tarek Ziad\u00e9\"},\"url\":\"https:\/\/blog.mozilla.org\/en\/author\/tziademozilla-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Running inference in web extensions","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/","url":"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/","name":"Running inference in web extensions","isPartOf":{"@id":"https:\/\/blog.mozilla.org\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/#primaryimage"},"image":{"@id":"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.mozilla.org\/wp-content\/blogs.dir\/278\/files\/2025\/01\/Screenshot-2025-01-21-at-15.11.11.png","datePublished":"2025-01-22T19:53:05+00:00","dateModified":"2025-01-31T17:48:33+00:00","author":{"@id":"https:\/\/blog.mozilla.org\/en\/#\/schema\/person\/aca87dfe79b30da7610884ccd00144ba"},"breadcrumb":{"@id":"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/#primaryimage","url":"https:\/\/blog.mozilla.org\/wp-content\/blogs.dir\/278\/files\/2025\/01\/Screenshot-2025-01-21-at-15.11.11.png","contentUrl":"https:\/\/blog.mozilla.org\/wp-content\/blogs.dir\/278\/files\/2025\/01\/Screenshot-2025-01-21-at-15.11.11.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mozilla.org\/en\/firefox\/firefox-ai\/running-inference-in-web-extensions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.mozilla.org\/en\/"},{"@type":"ListItem","position":2,"name":"Running inference in web extensions"}]},{"@type":"WebSite","@id":"https:\/\/blog.mozilla.org\/en\/#website","url":"https:\/\/blog.mozilla.org\/en\/","name":"The Mozilla Blog","description":"News and Updates about Mozilla","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.mozilla.org\/en\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.mozilla.org\/en\/#\/schema\/person\/aca87dfe79b30da7610884ccd00144ba","name":"Tarek Ziad\u00e9","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/en\/#\/schema\/person\/image\/4b0534bdcf6128df7f4dd34147fcc358","url":"https:\/\/secure.gravatar.com\/avatar\/a75a18983be643c76d3219fb2ffc9aa7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a75a18983be643c76d3219fb2ffc9aa7?s=96&d=mm&r=g","caption":"Tarek Ziad\u00e9"},"url":"https:\/\/blog.mozilla.org\/en\/author\/tziademozilla-com\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/en\/wp-json\/wp\/v2\/posts\/78243"}],"collection":[{"href":"https:\/\/blog.mozilla.org\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mozilla.org\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/en\/wp-json\/wp\/v2\/users\/571"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/en\/wp-json\/wp\/v2\/comments?post=78243"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/en\/wp-json\/wp\/v2\/posts\/78243\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/en\/wp-json\/wp\/v2\/media?parent=78243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/en\/wp-json\/wp\/v2\/categories?post=78243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/en\/wp-json\/wp\/v2\/tags?post=78243"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mozilla.org\/en\/wp-json\/wp\/v2\/coauthors?post=78243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}