diff --git a/built-in-ai-task-apis-polyfills/README.md b/built-in-ai-task-apis-polyfills/README.md index 9e0815e..80bbcc5 100644 --- a/built-in-ai-task-apis-polyfills/README.md +++ b/built-in-ai-task-apis-polyfills/README.md @@ -9,7 +9,7 @@ specifically: - **Rewriter API** - **Language Detector API** - **Translator API** -- **Taxonomizer API** +- **Classifier API** These polyfills are backed by the [`prompt-api-polyfill`](https://github.com/GoogleChromeLabs/web-ai-demos/tree/main/prompt-api-polyfill), @@ -25,7 +25,7 @@ window.Writer; window.Rewriter; window.LanguageDetector; window.Translator; -window.Taxonomizer; +window.Classifier; ``` so you can use these Task APIs even in environments where they are not yet @@ -70,8 +70,8 @@ defensive dynamic import strategy: if (!('Translator' in window)) { polyfills.push(import('built-in-ai-task-apis-polyfills/translator')); } - if (!('Taxonomizer' in window)) { - polyfills.push(import('built-in-ai-task-apis-polyfills/taxonomizer')); + if (!('Classifier' in window)) { + polyfills.push(import('built-in-ai-task-apis-polyfills/classifier')); } await Promise.all(polyfills); @@ -146,16 +146,14 @@ const translator = await Translator.create({ const result = await translator.translate('Hello world'); ``` -#### Taxonomizer API +#### Classifier API ```js -const taxonomizer = await Taxonomizer.create(); -const results = await taxonomizer.categorize('A story about a cat'); +const classifier = await Classifier.create(); +const results = await classifier.classify('A story about a cat'); for (const { id, confidence } of results) { - console.log( - `${Taxonomizer.getCategoryName(id)} (${(confidence * 100).toFixed(1)}%)` - ); + console.log(`${id} (${(confidence * 100).toFixed(1)}%)`); } ``` @@ -196,7 +194,7 @@ For complete examples, see: - [`demo_rewriter.html`](demo_rewriter.html) - [`demo_language_detector.html`](demo_language_detector.html) - [`demo_translator.html`](demo_translator.html) -- [`demo_taxonomizer.html`](demo_taxonomizer.html) +- [`demo_classifier.html`](demo_classifier.html) --- diff --git a/built-in-ai-task-apis-polyfills/taxonomizer-api-polyfill.js b/built-in-ai-task-apis-polyfills/classifier-api-polyfill.js similarity index 80% rename from built-in-ai-task-apis-polyfills/taxonomizer-api-polyfill.js rename to built-in-ai-task-apis-polyfills/classifier-api-polyfill.js index 61983b1..f902bb8 100644 --- a/built-in-ai-task-apis-polyfills/taxonomizer-api-polyfill.js +++ b/built-in-ai-task-apis-polyfills/classifier-api-polyfill.js @@ -4,14 +4,14 @@ */ import { BaseTaskModel } from './base-task-model.js'; -import { TaxonomizerPromptBuilder } from './taxonomizer-prompt-builder.js'; +import { ClassifierPromptBuilder } from './classifier-prompt-builder.js'; /** - * Taxonomizer API Polyfill + * Classifier API Polyfill * Backed by Prompt API Polyfill (LanguageModel) */ -export class Taxonomizer extends BaseTaskModel { +export class Classifier extends BaseTaskModel { #options; constructor(session, builder, options) { @@ -30,7 +30,7 @@ export class Taxonomizer extends BaseTaskModel { await this.ensureLanguageModel(); this._checkContext(); - const builder = new TaxonomizerPromptBuilder(); + const builder = new ClassifierPromptBuilder(); const { systemPrompt, initialPrompts } = builder.buildPrompt(''); const sessionOptions = { @@ -44,22 +44,22 @@ export class Taxonomizer extends BaseTaskModel { const win = this.__window || globalThis; const session = await win.LanguageModel.create(sessionOptions); - const taxonomizer = new this(session, builder, options); + const classifier = new this(session, builder, options); if (options.signal) { options.signal.addEventListener( 'abort', () => { - taxonomizer.destroy(options.signal.reason); + classifier.destroy(options.signal.reason); }, { once: true } ); } - return taxonomizer; + return classifier; } - async categorize(input, options = {}) { + async classify(input, options = {}) { this._checkContext(); if (typeof input !== 'string') { @@ -81,8 +81,8 @@ export class Taxonomizer extends BaseTaskModel { } catch (e2) { const win = this.constructor.__window || globalThis; const EX = win.DOMException || globalThis.DOMException || Error; - console.error('Failed to parse Taxonomizer results:', resultString); - throw new EX('Failed to parse categorization results.', 'UnknownError'); + console.error('Failed to parse Classifier results:', resultString); + throw new EX('Failed to parse classification results.', 'UnknownError'); } } } @@ -90,7 +90,7 @@ export class Taxonomizer extends BaseTaskModel { #parseResults(jsonString) { let results = JSON.parse(jsonString); if (!Array.isArray(results)) { - throw new Error('Categorization results must be an array.'); + throw new Error('Classification results must be an array.'); } // 1. Basic cleaning and validation @@ -143,16 +143,11 @@ export class Taxonomizer extends BaseTaskModel { return finalResults; } - - // Static helper as requested by the user - static getCategoryName(id) { - return TaxonomizerPromptBuilder.getCategoryName(id); - } } // Global exposure if in browser BaseTaskModel.exposeAPIGlobally( - 'Taxonomizer', - Taxonomizer, - '__FORCE_TAXONOMIZER_POLYFILL__' + 'Classifier', + Classifier, + '__FORCE_CLASSIFIER_POLYFILL__' ); diff --git a/built-in-ai-task-apis-polyfills/taxonomizer-prompt-builder.js b/built-in-ai-task-apis-polyfills/classifier-prompt-builder.js similarity index 98% rename from built-in-ai-task-apis-polyfills/taxonomizer-prompt-builder.js rename to built-in-ai-task-apis-polyfills/classifier-prompt-builder.js index d375fc2..596c212 100644 --- a/built-in-ai-task-apis-polyfills/taxonomizer-prompt-builder.js +++ b/built-in-ai-task-apis-polyfills/classifier-prompt-builder.js @@ -3,8 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -export class TaxonomizerPromptBuilder { - static #systemPromptTemplate = `You are an expert in content categorization using the IAB Content Taxonomy v3.1. +export class ClassifierPromptBuilder { + static #systemPromptTemplate = `You are an expert in content classification using the IAB Content Taxonomy v3.1. Your task is to analyze the provided text and predict the most relevant categories. The taxonomy categories are provided as a flat list of Unique IDs and their corresponding Tiered Category paths. @@ -749,23 +749,14 @@ JSON Schema for output: return this.#taxonomyData; } - static getCategoryName(id) { - // This is part of the requirement: helper to lookup category name based on ID. - const data = this.#taxonomyData; - if (!data || Object.keys(data).length === 0) { - return id; - } - return data[id] || id; - } - buildPrompt(inputText) { - const taxonomyMap = TaxonomizerPromptBuilder.getTaxonomy(); + const taxonomyMap = ClassifierPromptBuilder.getTaxonomy(); const taxonomyList = Object.entries(taxonomyMap) .map(([id, path]) => `${id}: ${path}`) .join('\n'); return { - systemPrompt: TaxonomizerPromptBuilder.#systemPromptTemplate.replace( + systemPrompt: ClassifierPromptBuilder.#systemPromptTemplate.replace( '{{taxonomy}}', taxonomyList ), @@ -785,7 +776,7 @@ JSON Schema for output: ]), }, ], - userPrompt: `TEXT TO CATEGORIZE:\n${inputText}`, + userPrompt: `TEXT TO CLASSIFY:\n${inputText}`, }; } } diff --git a/built-in-ai-task-apis-polyfills/demo_taxonomizer.html b/built-in-ai-task-apis-polyfills/demo_classifier.html similarity index 70% rename from built-in-ai-task-apis-polyfills/demo_taxonomizer.html rename to built-in-ai-task-apis-polyfills/demo_classifier.html index efaf03a..6a8e358 100644 --- a/built-in-ai-task-apis-polyfills/demo_taxonomizer.html +++ b/built-in-ai-task-apis-polyfills/demo_classifier.html @@ -7,7 +7,7 @@
-