{"id":16728,"date":"2026-09-14T00:00:00","date_gmt":"2026-09-14T07:00:00","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/ise\/?p=16728"},"modified":"2026-09-13T05:50:29","modified_gmt":"2026-09-13T12:50:29","slug":"japanese-llm-evaluation-pipeline-hackathon","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/ise\/japanese-llm-evaluation-pipeline-hackathon\/","title":{"rendered":"Building a Japanese LLM Evaluation Pipeline: Lessons from a Two-Day Hackathon"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>A: \u304b\u3057\u3053\u307e\u308a\u307e\u3057\u305f\u3002\u3054\u6ce8\u6587\u756a\u53f7\u3092\u304a\u6559\u3048\u3044\u305f\u3060\u3051\u308c\u3070\u3001\u914d\u9001\u72b6\u6cc1\u3092\u304a\u8abf\u3079\u3044\u305f\u3057\u307e\u3059\u3002<\/p>\n<p>B: \u3054\u4e0d\u5b89\u3067\u3059\u3088\u306d\u3002\u3054\u6ce8\u6587\u756a\u53f7\u3092\u304a\u6559\u3048\u3044\u305f\u3060\u3051\u308c\u3070\u3001\u3059\u3050\u306b\u304a\u8abf\u3079\u3044\u305f\u3057\u307e\u3059\u3002<\/p>\n<p>Which sentence do you think is more appropriate as a response from call center AI? As voice AI has evolved, expectations in call centers and customer service have shifted from traditional IVR (Interactive Voice Response) systems toward more natural and flexible conversational experiences. Services like wevnal&#8217;s &#8220;BOTCHAN AI Call&#8221; require more than simple FAQ responses\u2014they demand human operator-level dialogue quality.<\/p>\n<p>When selecting an LLM for customer-facing conversational features in Japanese, leaderboards often fail to serve as reliable references for specific scenarios. MT-Bench, MMLU, and similar benchmarks are English-centric, single-turn, and accuracy-focused. Conversational nuance in Japanese \u2014 appropriate keigo, emotional reading of a frustrated customer, persona consistency across a multi-turn exchange \u2014 rarely shows up in the numbers. As a result, teams end up trial-running models against in-house prompts, by hand, every time.<\/p>\n<p>In April 2026, we joined wevnal for a two-day hackathon to close that gap: build a benchmark and evaluation harness that is multi-provider, multi-turn, and oriented around <em>facets<\/em> of conversational quality, with the vision to contribute back to the Japanese AI community. This post walks through how it is built, why it is built that way, and what we learned along the way.<\/p>\n<h2>The Problem We Needed to Solve<\/h2>\n<p><strong>Subjectivity without standards<\/strong>: No shared rubrics exist for &#8220;Naturalness&#8221; in Japanese conversation, for what makes a response feel contextually appropriate or emotionally attuned to the user&#8217;s tone.<\/p>\n<p><strong>Fragmented evaluation<\/strong>: Existing efforts covered isolated pieces\u2014RAG components here, single-turn accuracy there\u2014but no end-to-end pipeline tied them together.<\/p>\n<p><strong>Data scarcity<\/strong>: High-quality Japanese conversational datasets are rare. Without ground truth or established baselines, it was hard to tell whether model changes were real improvements.<\/p>\n<p><strong>Manual, slow iteration<\/strong>: Evaluation was largely manual and disconnected from CI\/CD\u2014too slow to systematically improve quality at the pace the product needed.<\/p>\n<p>Closing this gap required an automated, standardized, production-ready pipeline that could scale across hundreds of different models.<\/p>\n<h2>A note on what this benchmark is for<\/h2>\n<p>We treat the benchmark as an <strong>initial filter<\/strong>, not a final verdict. Its job is to narrow 50 candidate models down to the 3\u20135 worth deeper, per-product evaluation \u2014 which engineering teams should still own. That framing drives the design choices below: optimize for <strong>breadth and reproducibility<\/strong> over depth, and keep metrics swappable as the field&#8217;s notion of &#8220;good Japanese conversation&#8221; evolves.<\/p>\n<h2>On inspiration and licensing<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/ise\/wp-content\/uploads\/sites\/55\/2026\/09\/architecture.webp\" alt=\"Architecture overview\" \/><\/p>\n<p>The first architectural decision was to keep two things strictly separate, both in code and in mental model:<\/p>\n<ul>\n<li><strong>The evaluation framework<\/strong> \u2014 pipeline code that generates model answers, orchestrates judges, aggregates scores, and renders visualizations. Knows nothing about specific questions.<\/li>\n<li><strong>The benchmark dataset<\/strong> \u2014 authored Japanese conversational Q&amp;A, judge prompts, model answers, judgment outputs. Treated as queryable data by the framework.<\/li>\n<\/ul>\n<p>This separation pays off in three ways: judge prompts and new facets can change without touching pipeline code; the same framework can run other benchmarks; and the licensing story stays clean \u2014 framework code inherits Apache 2.0 from FastChat, while the authored dataset, inspired by <a href=\"https:\/\/huggingface.co\/datasets\/elyza\/ELYZA-tasks-100\">ELYZA-tasks-100<\/a>, is MIT-clean and safe to publish.<\/p>\n<h2>The benchmark: 2-turn conversations across 3 personas, scored on 4 facets<\/h2>\n<p>The dataset has <strong>39 Japanese question pairs<\/strong>, each with two turns (an initial query plus a follow-up), distributed evenly across three personas: <code>customer_service<\/code>, <code>casual_friend<\/code>, and <code>senior_professional<\/code>.<\/p>\n<pre><code class=\"language-json\">{\r\n  \"question_id\": 101,\r\n  \"persona\": \"customer_service\",\r\n  \"turns\": [\r\n    \"\u3042\u306a\u305f\u306f\u30a2\u30d1\u30ec\u30ebEC\u30b5\u30a4\u30c8\u306e\u30ab\u30b9\u30bf\u30de\u30fc\u30b5\u30dd\u30fc\u30c8\u62c5\u5f53\u3067\u3059\u3002\u304a\u5ba2\u69d8\u304b\u3089\u300c\u5148\u9031\u6ce8\u6587\u3057\u305f\u30ef\u30f3\u30d4\u30fc\u30b9\u304c\u307e\u3060\u5c4a\u304d\u307e\u305b\u3093\u3002\u914d\u9001\u72b6\u6cc1\u3092\u6559\u3048\u3066\u304f\u3060\u3055\u3044\u300d\u3068\u3044\u3046\u304a\u554f\u3044\u5408\u308f\u305b\u3092\u53d7\u3051\u307e\u3057\u305f\u3002\u4e01\u5be7\u306a\u656c\u8a9e\u3067\u5bfe\u5fdc\u3057\u3066\u304f\u3060\u3055\u3044\u3002\",\r\n    \"\u304a\u5ba2\u69d8\u304c\u300c\u8ffd\u8de1\u756a\u53f7\u3092\u78ba\u8a8d\u3057\u305f\u3089\\\"\u914d\u9054\u6e08\u307f\\\"\u306b\u306a\u3063\u3066\u3044\u308b\u306e\u306b\u5c4a\u3044\u3066\u3044\u307e\u305b\u3093\u3002\u3069\u3046\u3044\u3046\u3053\u3068\u3067\u3059\u304b\uff1f\u300d\u3068\u4e0d\u5b89\u3092\u793a\u3057\u3066\u3044\u307e\u3059\u3002\u5f15\u304d\u7d9a\u304d\u5bfe\u5fdc\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\r\n  ]\r\n}<\/code><\/pre>\n<p>The two-turn structure is non-negotiable for what we&#8217;re trying to measure. A single-turn benchmark cannot tell you whether a model restates itself unnecessarily, whether it tracks an emotional escalation (mild concern \u2192 frustration), or whether it drifts out of its persona on the follow-up. Two turns is the minimum unit of &#8220;conversation.&#8221;<\/p>\n<p>Each conversation is scored on <strong>four semantic facets<\/strong>:<\/p>\n<ul>\n<li><strong>Brevity &amp; Conciseness<\/strong> \u2014 Is the response appropriate length?<\/li>\n<li><strong>Emotional Intelligence<\/strong> \u2014 Does the model recognize emotional shifts and respond appropriately?<\/li>\n<li><strong>Roleplaying<\/strong> \u2014 Does the assigned persona hold across both turns in voice, tone, register, and vocabulary?<\/li>\n<li><strong>Fluency<\/strong> \u2014 Is the Japanese natural, correct, and situationally appropriate?<\/li>\n<\/ul>\n<p>These four were chosen with consideration for performance and diverse use-cases in production.<\/p>\n<h3>Why we score conversations, not turns<\/h3>\n<p>An early version of the harness scored each turn independently. We swapped to whole-conversation scoring for two reasons. First, several facets \u2014 emotional intelligence and role-playing in particular \u2014 only meaningfully unfold <em>across<\/em> turns. Second, the change halves the judge API budget: a 12-model run dropped from 3,744 calls to 1,872. This enabled the benchmark to stay reproducible and re-runnable on a hackathon-scale budget.<\/p>\n<h2>Auditing the benchmark itself<\/h2>\n<p>We created a rubric-for-the-rubric to ensure the benchmark questions themselves are high-quality, uncontaminated, and linguistically authentic before they&#8217;re used to evaluate any models.<\/p>\n<p><strong>Mechanical checks<\/strong> validate schema, coverage of personas, topic domain and edge cases, and diversity in category distribution.<\/p>\n<p><strong>LLM-judged checks<\/strong> rate a small sample for persona adherence and linguistic naturalness.<\/p>\n<p><strong>Manual spot-check<\/strong>: Leakage hygiene is human-in-the-loop. The audit generates a worksheet extracting distinctive 10-word spans from 10% of items; the reviewer searches each span using a search engine and notes whether it appears in known public corpora.<\/p>\n<p>The output is a JSON + Markdown report:<\/p>\n<pre><code class=\"language-json\">{\r\n  \"timestamp\": \"2026-05-15T10:30:00Z\",\r\n  \"checks\": {\r\n    \"schema\": { \"status\": \"pass\", \"count\": 39 },\r\n    \"coverage\": {\r\n      \"status\": \"pass\",\r\n      \"personas\": {\"customer_service\": 13, \"casual_friend\": 13,\r\n                   \"senior_professional\": 13}\r\n    },\r\n    \"diversity\": {\r\n      \"status\": \"warning\",\r\n      \"category_distribution\": {\"customer_service\": 13, \"general\": 26},\r\n      \"message\": \"High concentration in 'general'; recommend more domain specificity\"\r\n    },\r\n    \"linguistic_naturalness\": {\r\n      \"status\": \"pass\", \"sample_size\": 10, \"avg_score\": 4.3\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p>Failures are <strong>advisory, not blocking<\/strong> \u2014 the audit informs human review without gating the pipeline, because some &#8220;diversity warnings&#8221; are intentional editorial choices.<\/p>\n<h2>Choosing what to benchmark: the model catalog<\/h2>\n<p>Before calling any model, we decide <em>which<\/em> models are worth calling. That decision lives in a separate <strong>model catalog<\/strong>.<\/p>\n<p>We fetch two streams:<\/p>\n<ul>\n<li><strong>Azure API<\/strong>: deployment status, lifecycle, endpoint metadata<\/li>\n<li><strong>Artificial Analysis API<\/strong>: capability indices, pricing<\/li>\n<\/ul>\n<p>These streams are joined on model slug to create enriched records.<\/p>\n<pre><code class=\"language-python\">class CatalogModel(BaseModel):\r\n    azure_id: str\r\n    slug: str\r\n    name: str\r\n    creator: Optional[str] = None\r\n    lifecycle_status: Optional[str] = None\r\n    intelligence_index: Optional[float] = None\r\n    coding_index: Optional[float] = None\r\n    math_index: Optional[float] = None\r\n    pricing: ModelPricing = ModelPricing()\r\n    tokens_per_second: Optional[float] = None\r\n\r\n    def attractiveness(self, metric: str = \"intelligence\") -&gt; float | None:\r\n        \"\"\"ROI prior: AA quality index divided by AA blended price.\"\"\"\r\n        q = self.quality(metric)\r\n        p = self.pricing.blended_price_1m\r\n        if q is None or p is None or p == 0:\r\n            return None\r\n        return q \/ p<\/code><\/pre>\n<p>The <strong>attractiveness<\/strong> metric captures what Japanese might call <em>\u30b3\u30b9\u30d1<\/em> (kosupa), meaning quality per yen spent \u2014 intelligence index divided by blended price per million tokens.<\/p>\n<p>But we don&#8217;t just pick the top-N by <em>kosupa<\/em> \u2014 that would skew cheap. Instead, we use <strong>bucket-biased allocation<\/strong>: divide models into price quantiles, sort within each bucket by attractiveness, then allocate slots across buckets with a bias toward higher tiers. The result spans flagship, mid-tier, and budget models rather than being dominated by cheap-but-good outliers.<\/p>\n<h2>Content-Addressed Caching<\/h2>\n<p>We cache requests by SHA256 over canonical JSON \u2014 same input returns same cached output. This makes experiments reproducible, eliminates duplicate API costs, and speeds up iteration.<\/p>\n<h3>Cache Key Example<\/h3>\n<pre><code class=\"language-json\">{\r\n  \"target_model\": \"openai:gpt-4o\",\r\n  \"messages\": [\r\n    {\"role\": \"system\", \"content\": \"You are a helpful assistant...\"},\r\n    {\"role\": \"user\", \"content\": \"Turn 1: \u304a\u554f\u3044\u5408\u308f\u305b\u3067\u3059...\"},\r\n    {\"role\": \"assistant\", \"content\": \"\u304b\u3057\u3053\u307e\u308a\u307e\u3057\u305f...\"},\r\n    {\"role\": \"user\", \"content\": \"Turn 2: \u8ffd\u8de1\u756a\u53f7\u3092\u78ba\u8a8d...\"}\r\n  ],\r\n  \"temperature\": 0.7,\r\n  \"max_tokens\": 4096,\r\n  \"reasoning_effort\": \"low\"\r\n}\r\n\u2193\r\nSHA256: a3f4b2c1d5e6... (maps to ~\/.cache\/fastchat_llm_judge\/a3\/a3f4b2c1d5e6.json)<\/code><\/pre>\n<h2>Aggregation: facet scores and viz<\/h2>\n<p>Once judgments are in, aggregation is straightforward: per-model, per-facet, per-turn, per-persona means.<\/p>\n<p>What the aggregated per-model JSON looks like:<\/p>\n<pre><code class=\"language-json\">{\r\n  \"model\": \"openai:gpt-4o\",\r\n  \"overall\": 8.24,\r\n  \"by_facet\": {\r\n    \"brevity\": 8.1, \"fluency\": 8.4,\r\n    \"emotional_intelligence\": 8.2, \"roleplaying\": 8.3\r\n  },\r\n  \"by_turn\": { \"1\": 8.0, \"2\": 8.5 },\r\n  \"by_persona\": {\r\n    \"customer_service\": 8.5, \"casual_friend\": 8.0,\r\n    \"senior_professional\": 8.2\r\n  }\r\n}<\/code><\/pre>\n<p>And what the leaderboard view looks like:<\/p>\n<pre><code class=\"language-text\">Rank \u2502 Model                  \u2502 Overall \u2502 Brief \u2502 Fluent \u2502 EI    \u2502 Role  \u2502 $\/1M  \u2502 AA ROI\r\n\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\r\n  1  \u2502 openai:gpt-5.4-mini    \u2502 8.37    \u2502 8.2   \u2502 8.5    \u2502 8.4   \u2502 8.4   \u2502 0.30  \u2502 27.9\r\n  2  \u2502 anthropic:claude-sonnet\u2502 8.21    \u2502 8.3   \u2502 8.1    \u2502 8.3   \u2502 8.1   \u2502 0.75  \u2502 11.0\r\n  3  \u2502 azure:gpt-4o           \u2502 8.15    \u2502 8.0   \u2502 8.3    \u2502 8.2   \u2502 8.1   \u2502 0.06  \u2502136.0\r\n  4  \u2502 openai:gpt-4o-mini     \u2502 7.92    \u2502 7.8   \u2502 8.0    \u2502 8.0   \u2502 7.9   \u2502 0.03  \u2502264.0\r\n  5  \u2502 azure:Kimi-K2.6        \u2502 7.68    \u2502 7.5   \u2502 7.8    \u2502 7.7   \u2502 7.8   \u2502 0.05  \u2502153.6<\/code><\/pre>\n<p>The right two columns \u2014 <strong>$\/1M<\/strong> (Artificial Analysis blended price) and <strong>AA ROI<\/strong> (<code>attractiveness<\/code>) \u2014 come from the catalog integrated with the benchmark scores.<\/p>\n<h2>Headline numbers<\/h2>\n<table>\n<thead>\n<tr>\n<th>Metric<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Models evaluated<\/td>\n<td>24 (OpenAI, Azure, Anthropic, open-source via Hugging Face)<\/td>\n<\/tr>\n<tr>\n<td>Questions<\/td>\n<td>39 Japanese 2-turn conversational pairs<\/td>\n<\/tr>\n<tr>\n<td>Personas<\/td>\n<td>3 (customer_service, casual_friend, senior_professional)<\/td>\n<\/tr>\n<tr>\n<td>Facets<\/td>\n<td>4 (Brevity, Fluency, EI, Role-Playing)<\/td>\n<\/tr>\n<tr>\n<td>Judge calls per run<\/td>\n<td>~1,872 (conversation-level)<\/td>\n<\/tr>\n<tr>\n<td>Visualization types<\/td>\n<td>8 (radar, bar, heatmap, lollipop, diverging, parallel, Minard, scatter)<\/td>\n<\/tr>\n<tr>\n<td>Pipeline runtime<\/td>\n<td>~45 min end-to-end<\/td>\n<\/tr>\n<tr>\n<td>Data-quality checks<\/td>\n<td>6 (schema, coverage, diversity, persona, linguistic, leakage)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A four-facet, 24-model scoreboard is rendered to charts:<\/p>\n<pre><code class=\"language-python\">def render_facet_chart(pivot, bench_name, chart, style=\"publish\",\r\n                       output_path=None, **kwargs):\r\n    _apply_theme(style)\r\n    renderers = {\r\n        \"radar\": _render_radar,\r\n        \"bar\": _render_bar,\r\n        \"heatmap\": _render_heatmap,\r\n        \"lollipop\": _render_lollipop,\r\n        \"diverging\": _render_diverging,    \r\n        \"parallel\": _render_parallel,      \r\n        \"minard\": _render_minard,          \r\n        \"scatter\": plot_multi_scatter,     \r\n    }\r\n    fig = renderers[chart](pivot, **kwargs)\r\n    _save(fig, output_path or _default_output_path(bench_name, chart, style),\r\n          bench_name, chart, style)<\/code><\/pre>\n<p>The four <strong>core charts<\/strong> \u2014 radar, bar, heatmap, lollipop \u2014 are the workhorses for facet-by-facet comparison. They take the pivot table and nothing else.<\/p>\n<p>The four <strong>advanced overlays<\/strong> each answer a different question:<\/p>\n<ul>\n<li><strong>Diverging chart<\/strong> \u2014 pick one model as a reference and show all other models as deviations from it.<\/li>\n<li><strong>Parallel coordinates<\/strong> \u2014 render each model&#8217;s scores across facets as a polyline, making trajectories and crossovers visible at a glance.<\/li>\n<li><strong>Minard &#8220;capability march&#8221;<\/strong> \u2014 score becomes ribbon width across persona panels, with a price strip overlaid below.<\/li>\n<li><strong>Cost-vs-performance scatter<\/strong> \u2014 quality on the y-axis, price on the x-axis.<\/li>\n<\/ul>\n<h3>Example Charts<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/ise\/wp-content\/uploads\/sites\/55\/2026\/09\/evaluation_facet_radar.webp\" alt=\"Facet radar\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/ise\/wp-content\/uploads\/sites\/55\/2026\/09\/evaluation_scores_by_facet.webp\" alt=\"Scores by facet\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/ise\/wp-content\/uploads\/sites\/55\/2026\/09\/parallel_coordinates_by_category.webp\" alt=\"Parallel coordinates\" \/><\/p>\n<h2>Outcomes from the Hackathon<\/h2>\n<p>After two days, the team delivered:<\/p>\n<ol>\n<li>A curated Japanese conversational benchmark dataset<\/li>\n<li>A reusable evaluation pipeline with multi-turn, facet-based scoring<\/li>\n<li>A 3-tier audit system<\/li>\n<li>Model catalog with bucket-biased selection across price tiers<\/li>\n<li>Reproducible runs via deterministic caching<\/li>\n<li>Publication-ready visualization suite and CI-friendly leaderboard exports<\/li>\n<\/ol>\n<p>The project established a baseline for expansion, including voice pipeline evaluation and broader multilingual scenarios.<\/p>\n<h2>On Collaboration<\/h2>\n<p>This hackathon demonstrated the power of working with technically strong engineering partners. Collaborating with wevnal&#8217;s highly skilled engineers enabled us to dive into challenging technical domains and validate solutions against real-world constraints. They shaped technical direction and concrete use cases by prioritizing value delivery in production systems. Their clear goal-setting and technical depth were the main driver behind the outcome that exceeds typical prototypes\u2014we built a foundation conscious of production, not just a technical validation. The partnership wasn&#8217;t one-way delivery\u2014it was <strong>true co-creation<\/strong>.<\/p>\n<h2>Thanks<\/h2>\n<p>Thanks to Mike Lazentta, Keiji Hokamura, Cathy Yeh and Parag Alurkar for their contributions, Mai Matsumoto for building customer relationships. We would also like to extend special thanks to our incredible customers, Wataru Takahashi, Harui Hatakeyama, and Loic Cunningham for their exceptional engineering excellence.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ISE hackathon produced a reusable Japanese LLM evaluation pipeline with multi-turn, facet-based scoring, cross-provider model support, and publication-ready benchmarking outputs.<\/p>\n","protected":false},"author":216063,"featured_media":16729,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1,19],"tags":[3297,3400,3542],"class_list":["post-16728","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cse","category-machine-learning","tag-evaluation","tag-ise","tag-llm"],"acf":[],"blog_post_summary":"<p>ISE hackathon produced a reusable Japanese LLM evaluation pipeline with multi-turn, facet-based scoring, cross-provider model support, and publication-ready benchmarking outputs.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/posts\/16728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/users\/216063"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/comments?post=16728"}],"version-history":[{"count":1,"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/posts\/16728\/revisions"}],"predecessor-version":[{"id":16730,"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/posts\/16728\/revisions\/16730"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/media\/16729"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/media?parent=16728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/categories?post=16728"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/ise\/wp-json\/wp\/v2\/tags?post=16728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}