<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://codedchords.dev/feed_style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
    <tabi:metadata xmlns:tabi="https://github.com/welpo/tabi">
        <tabi:base_url>https://codedchords.dev</tabi:base_url>
        <tabi:separator>
            •
        </tabi:separator>
        <tabi:about_feeds>
            This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free.
        </tabi:about_feeds>
        <tabi:visit_the_site>
            Visit website
        </tabi:visit_the_site>
        <tabi:recent_posts>
            Recent posts
        </tabi:recent_posts>
        <tabi:last_updated_on>
            Updated on $DATE
        </tabi:last_updated_on>
        <tabi:default_theme></tabi:default_theme>
        <tabi:post_listing_date>date</tabi:post_listing_date>
        <tabi:current_section>API</tabi:current_section>
    </tabi:metadata><title>Coded Chords - API</title>
        <subtitle>A personal blog</subtitle>
    <link href="https://codedchords.dev/tags/api/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://codedchords.dev/tags/api/" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2026-09-16T00:00:00+00:00</updated><id>https://codedchords.dev/tags/api/atom.xml</id><entry xml:lang="ja">
        <title>発表されたGPT-image-2.5 Flareに移行</title>
        <published>2026-09-16T00:00:00+00:00</published>
        <updated>2026-09-16T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2026/09/gpt-image-2-5/" type="text/html"/>
        <id>https://codedchords.dev/blog/2026/09/gpt-image-2-5/</id>
        
            <content type="html">&lt;!-- textlint-disable --&gt;
&lt;img src=&quot;https://codedchords.dev/blog/2026/09/gpt-image-2-5/cover.avif?h=0a7e385af6656ed96ec0&quot; alt=&quot;Cover&quot; width=&quot;1536&quot; height=&quot;864&quot; loading=&quot;lazy&quot; /&gt;
&lt;!-- textlint-enable --&gt;
&lt;details&gt;
&lt;summary&gt;Table of Contents&lt;/summary&gt;
&lt;!-- toc --&gt;
&lt;/details&gt;
&lt;p&gt;このブログの記事上部にあるカバー画像はOpenAIのGPT-image-2を使用してカバー画像を生成していましたが、GPT-image-2.5が発表されたので早速移行してみました。&lt;/p&gt;
&lt;h2 id=&quot;GPT-image-2.5の概要&quot;&gt;GPT-image-2.5の概要&lt;/h2&gt;
&lt;p&gt;GPT-image-2.5は、性格の異なる2つのモデルとして公開されました。OpenAIはそれぞれを次のように位置づけています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gpt-image-2.5-flare&lt;/code&gt;は「日常的な用途で高品質な画像を生成するための、最も速いモデル」である&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gpt-image-2.5-sunburst&lt;/code&gt;は「画像の生成と編集における最も高性能なモデル」である&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;トークン単価はどちらのモデルもGPT-image-2と同じです。&lt;/p&gt;
&lt;p&gt;品質指定の段が増えました。これまでは&lt;code&gt;low&lt;/code&gt; / &lt;code&gt;medium&lt;/code&gt; / &lt;code&gt;high&lt;/code&gt;の3段階で、&lt;code&gt;high&lt;/code&gt;が最上段でした。2.5ではその上に&lt;code&gt;xhigh&lt;/code&gt;と&lt;code&gt;max&lt;/code&gt;が加わり、&lt;code&gt;high&lt;/code&gt;は最上段ではなくなっています。&lt;/p&gt;
&lt;p&gt;試験的提供であった透過背景が今回正式な機能として提供されました。&lt;code&gt;background&lt;/code&gt;に&lt;code&gt;transparent&lt;/code&gt;を指定してPNGかWebPで受け取ると、背景を抜いた画像が返ります。文字の描画も大きく改善されましたが、正確な位置に置くのは依然として苦手です。&lt;/p&gt;
&lt;h2 id=&quot;gpt-image-2.5-flare_vs_gpt-image-2&quot;&gt;gpt-image-2.5-flare vs gpt-image-2&lt;/h2&gt;
&lt;p&gt;移行の前後で何がどう変わるのかを、同じプロンプトで実際に生成して比べました。サイズは1536x864、品質はhighで、両モデルとも条件を揃えました。実際に使用したプロンプトは以下です。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;プロンプト&lt;/summary&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;荒れた海の上で対峙するポセイドンとネプチューン。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;左に立つポセイドンは青緑の海水をまとい、三叉の銛を振り上げている。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;右のネプチューンは白い波頭を鎧のようにまとい、同じく三叉の銛を構える。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;二人の間で海面が渦を巻き、波しぶきが高く上がる。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;低い位置から見上げる構図、嵐の空、雲間から差す光。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;油彩のような重い質感、青と灰色を基調に、波しぶきだけが白く輝く。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;文字やロゴは写り込まない。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;
&lt;p&gt;生成時間は各モデル3回ずつ計測しています。サーバー側の混雑が一方に偏らないよう、GPT-image-2とFlareを1回ずつ交互に実行しました。ジョブを投入してから完了を確認するまでの秒数です。&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;モデル&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;1回目&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;2回目&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;3回目&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;中央値&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;gpt-image-2&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;129.1&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;118.7&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;117.6&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;118.7&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;gpt-image-2.5-flare&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;25.2&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;25.8&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;25.4&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;25.4&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;中央値で4.7倍の差です。3回の振れ幅はGPT-image-2が117.6秒から129.1秒、Flareが25.2秒から25.8秒に収まっていて、たまたま速い1回を引いたわけではありません。2分待つか25秒待つかは、記事を書きながら試行錯誤する場面ではかなり違います。&lt;/p&gt;
&lt;p&gt;生成された6枚です。左がgpt-image-2、右がgpt-image-2.5-flareで、上から1回目・2回目・3回目です。この節に掲載しているのは縮小したサムネイルです。元データの可逆WebPは、以下にまとめて置いています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://e.pcloud.link/publink/show?code=kZ9Kq77ZJs6HQphSWUJPRcwIyyiRpJuQAqiy&quot;&gt;ポセイドンとネプチューンの生成画像（可逆WebP）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;display:grid;gap:1rem;margin:1.5rem 0;
grid-template-columns:repeat(auto-fit,minmax(280px,1fr));&quot;&gt;
&lt;figure style=&quot;margin:0;text-align:center;&quot;&gt;
&lt;img src=&quot;poseidon-old-1-thumb.avif&quot;
alt=&quot;gpt-image-2が1回目に生成したポセイドンとネプチューン&quot; width=&quot;400&quot; height=&quot;225&quot; loading=&quot;lazy&quot;&gt;
&lt;figcaption&gt;1回目 / gpt-image-2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure style=&quot;margin:0;text-align:center;&quot;&gt;
&lt;img src=&quot;poseidon-flare-1-thumb.avif&quot;
alt=&quot;gpt-image-2.5-flareが1回目に生成したポセイドンとネプチューン&quot; width=&quot;400&quot; height=&quot;225&quot; loading=&quot;lazy&quot;&gt;
&lt;figcaption&gt;1回目 / gpt-image-2.5-flare&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure style=&quot;margin:0;text-align:center;&quot;&gt;
&lt;img src=&quot;poseidon-old-2-thumb.avif&quot;
alt=&quot;gpt-image-2が2回目に生成したポセイドンとネプチューン&quot; width=&quot;400&quot; height=&quot;225&quot; loading=&quot;lazy&quot;&gt;
&lt;figcaption&gt;2回目 / gpt-image-2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure style=&quot;margin:0;text-align:center;&quot;&gt;
&lt;img src=&quot;poseidon-flare-2-thumb.avif&quot;
alt=&quot;gpt-image-2.5-flareが2回目に生成したポセイドンとネプチューン&quot; width=&quot;400&quot; height=&quot;225&quot; loading=&quot;lazy&quot;&gt;
&lt;figcaption&gt;2回目 / gpt-image-2.5-flare&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure style=&quot;margin:0;text-align:center;&quot;&gt;
&lt;img src=&quot;poseidon-old-3-thumb.avif&quot;
alt=&quot;gpt-image-2が3回目に生成したポセイドンとネプチューン&quot; width=&quot;400&quot; height=&quot;225&quot; loading=&quot;lazy&quot;&gt;
&lt;figcaption&gt;3回目 / gpt-image-2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure style=&quot;margin:0;text-align:center;&quot;&gt;
&lt;img src=&quot;poseidon-flare-3-thumb.avif&quot;
alt=&quot;gpt-image-2.5-flareが3回目に生成したポセイドンとネプチューン&quot; width=&quot;400&quot; height=&quot;225&quot; loading=&quot;lazy&quot;&gt;
&lt;figcaption&gt;3回目 / gpt-image-2.5-flare&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;総じてFlareのほうが主題をフォーカスし密度が高い構図になっています。コトラストの高く見やすい絵になっています。ただし、gpt-image-2のほうも悪くはなく、広大さと自然なコントラストでこちらが好きと言う方も多いでしょう。&lt;/p&gt;
&lt;p&gt;速さは疑いようがなく、何度か引き直して選ぶ使い方であれば1回25秒で試せることの方が効いてきます。&lt;/p&gt;
&lt;p&gt;ここまではすべて&lt;code&gt;high&lt;/code&gt;での生成です。2.5で加わった&lt;code&gt;max&lt;/code&gt;がどう違うのかを、同じプロンプトで1枚だけ試しました。&lt;/p&gt;
&lt;div style=&quot;text-align:center;margin:1.5rem 0;&quot;&gt;
&lt;figure&gt;
&lt;img src=&quot;poseidon-flare-max-thumb.avif&quot;
alt=&quot;gpt-image-2.5-flareがmax品質で生成したポセイドンとネプチューン&quot; width=&quot;400&quot; height=&quot;225&quot; loading=&quot;lazy&quot;&gt;
&lt;figcaption&gt;quality=max / gpt-image-2.5-flare&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;所要時間は35.3秒でした。&lt;code&gt;high&lt;/code&gt;の25秒台から4割ほど伸びています。&lt;/p&gt;
&lt;p&gt;サムネではあまりわかりませんが、元のサイズで確認すると明らかに絵が油彩のような質感を再現しています。画像の題材やもっとフォトリアリスティックなトーンであればよりはっきりと質感は上がるかも知れません。この1枚の生成にかかったのは約0.13ドルになります。&lt;/p&gt;
&lt;h2 id=&quot;画像生成に使用しているスクリプト&quot;&gt;画像生成に使用しているスクリプト&lt;/h2&gt;
&lt;p&gt;カバー画像は&lt;code&gt;scripts/generate-cover.sh&lt;/code&gt;という自前のシェルスクリプトで生成しています。プロンプトと出力先を渡すと、OpenAIに投げてAVIFに変換するところまでやります。全文は以下のとおりです。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;scripts/generate-cover.sh&lt;/summary&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;scripts/generate-cover.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-16 z-i&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -euo pipefail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# Generate cover image using OpenAI gpt-image-2.5 Flare API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# Requires: OPENAI_API_KEY, curl, jq, avifenc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# Note: gpt-image-2.5 can return png, jpeg or webp, but we deliberately&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# keep the default PNG. It is the only lossless option among them, and&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# feeding a lossless intermediate to avifenc avoids stacking a second&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# generation of lossy artifacts on top of the AVIF encode.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# AVIF is used for photographic and AI-generated cover images only.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# Diagrams, charts and screenshots must stay lossless WebP:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;#   cwebp -lossless -z 9 -exact input.png -o output.webp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SIZE&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;1536x864&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;QUALITY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;high&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MODEL&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;gpt-image-2.5-flare&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;  # image_generation tool model&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;HOST_MODEL&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;gpt-4.1-mini&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;  # host model that drives the image tool&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AVIF_QUALITY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;60&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;usage&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;  cat&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;#39;USAGE&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;Usage: generate-cover.sh -p &amp;lt;prompt&amp;gt; -o &amp;lt;output&amp;gt; [-s size] [-q quality] [-w avif_quality]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;Options:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  -p  Image generation prompt (required)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  -o  Output file path, e.g. cover.avif (required)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  -s  Size: 1536x864, 2048x1152, 1024x1024, etc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;      Must be multiples of 16, aspect ratio within 3:1 to 1:3.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;      (default: 1536x864 = 16:9)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  -q  Quality: low, medium, high, xhigh, or max (default: high)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;      gpt-image-2.5 adds xhigh and max above high. They cost more per&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;      image, so covers stay at high unless asked otherwise.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  -w  AVIF encoder quality (0-100, default: 60)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;      60 is roughly equivalent to the previous cwebp -q 80.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;Examples:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  # 16:9 cover image (default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  ./scripts/generate-cover.sh \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    -p &amp;quot;A futuristic cityscape&amp;quot; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    -o content/blog/2026/05/my-article/cover.avif&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  # Higher-quality AVIF encoding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  ./scripts/generate-cover.sh \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    -p &amp;quot;Abstract pattern&amp;quot; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    -o output.avif -w 75&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;USAGE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;  exit&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;z-11 z-i&quot;&gt; getopts&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;p:o:s:q:w:&amp;quot; opt&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;  case&lt;/span&gt;&lt;span&gt; $opt&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    p&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;)&lt;/span&gt;&lt;span&gt; PROMPT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$OPTARG&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    o&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;)&lt;/span&gt;&lt;span&gt; OUTPUT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$OPTARG&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    s&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;)&lt;/span&gt;&lt;span&gt; SIZE&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$OPTARG&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    q&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;)&lt;/span&gt;&lt;span&gt; QUALITY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$OPTARG&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    w&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;)&lt;/span&gt;&lt;span&gt; AVIF_QUALITY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$OPTARG&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    *)&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt; usage&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;${PROMPT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:-&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;${OUTPUT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:-&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ];&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;  usage&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;${OPENAI_API_KEY&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:-&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ];&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;  echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Error: OPENAI_API_KEY is not set&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;  exit&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Generating image with &lt;/span&gt;&lt;span&gt;$MODEL&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;...&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;  Size: &lt;/span&gt;&lt;span&gt;$SIZE&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;  Quality: &lt;/span&gt;&lt;span&gt;$QUALITY&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;  AVIF quality: &lt;/span&gt;&lt;span&gt;$AVIF_QUALITY&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;  Prompt: &lt;/span&gt;&lt;span&gt;${PROMPT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span&gt;80}&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;...&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RESP_FILE&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;mktemp&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -t cover-resp-XXXXXX&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TMP_PNG&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;mktemp&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -t cover-XXXXXX&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;trap&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;rm -f &amp;quot;$RESP_FILE&amp;quot; &amp;quot;$TMP_PNG&amp;quot;&amp;#39; EXIT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# A high-quality render can still take a couple of minutes — longer than the&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# ~60s idle timeout that closes a synchronous (or streamed) connection before&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# the image is ready. Submit the job in background mode via the Responses API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# and poll for it, so every HTTP request is short-lived and never hits the&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# timeout. The image_generation tool drives gpt-image-2.5 Flare; the host model just&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;# forwards the prompt verbatim.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Submitting background job...&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SUBMIT&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -s --max-time&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; https://api.openai.com/v1/responses&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  -H &amp;quot;Content-Type: application/json&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  -H &amp;quot;Authorization: Bearer &lt;/span&gt;&lt;span&gt;$OPENAI_API_KEY&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  -d &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;jq&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -n&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    --arg host &amp;quot;&lt;/span&gt;&lt;span&gt;$HOST_MODEL&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    --arg model &amp;quot;&lt;/span&gt;&lt;span&gt;$MODEL&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    --arg prompt &amp;quot;&lt;/span&gt;&lt;span&gt;$PROMPT&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    --arg size &amp;quot;&lt;/span&gt;&lt;span&gt;$SIZE&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    --arg quality &amp;quot;&lt;/span&gt;&lt;span&gt;$QUALITY&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    &amp;#39;{model: $host, background: true, store: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;      instructions: &amp;quot;The user message is the exact image prompt. Call the image_generation tool once using that text verbatim as the prompt; do not paraphrase, summarize, translate, or add to it.&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;      input: $prompt,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;      tools: [{type: &amp;quot;image_generation&amp;quot;, model: $model, size: $size, quality: $quality}],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;      tool_choice: {type: &amp;quot;image_generation&amp;quot;}}&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;JOB_ID&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$SUBMIT&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt; jq&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -r &amp;#39;.id // empty&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$JOB_ID&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ];&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;  echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Error: &lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$SUBMIT&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt; jq&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -r &amp;#39;.error.message // &amp;quot;failed to submit job&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;  exit&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;  Job: &lt;/span&gt;&lt;span&gt;$JOB_ID&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Polling for completion (high quality can take a few minutes)...&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;STATUS&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; _&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 1 120&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;  curl&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -s --max-time&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 30&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;https://api.openai.com/v1/responses/&lt;/span&gt;&lt;span&gt;$JOB_ID&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    -H &amp;quot;Authorization: Bearer &lt;/span&gt;&lt;span&gt;$OPENAI_API_KEY&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$RESP_FILE&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  STATUS&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;jq&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -r &amp;#39;.status // &amp;quot;unknown&amp;quot;&amp;#39; &amp;quot;&lt;/span&gt;&lt;span&gt;$RESP_FILE&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;  case&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$STATUS&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    completed&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; break&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    failed&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;cancelled&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;incomplete&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;      echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Error: job &lt;/span&gt;&lt;span&gt;$STATUS&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; — &lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;jq&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -r &amp;#39;.error.message // .incomplete_details.reason // &amp;quot;no detail&amp;quot;&amp;#39; &amp;quot;&lt;/span&gt;&lt;span&gt;$RESP_FILE&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;      exit&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;  sleep&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$STATUS&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;completed&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ];&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;  echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Error: job did not complete (last status: &lt;/span&gt;&lt;span&gt;$STATUS&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;)&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;  exit&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;B64&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;jq&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -r &amp;#39;[.output[]? | select(.type==&amp;quot;image_generation_call&amp;quot;) | .result][0] // empty&amp;#39; &amp;quot;&lt;/span&gt;&lt;span&gt;$RESP_FILE&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$B64&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ];&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;  echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Error: no image in completed response&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;  jq&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -r &amp;#39;.output[]? | select(.type==&amp;quot;message&amp;quot;) | .content[]?.text // empty&amp;#39; &amp;quot;&lt;/span&gt;&lt;span&gt;$RESP_FILE&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt; head&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -c&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 500&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;  echo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;  exit&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Decoding base64 image...&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;%s&amp;#39; &amp;quot;&lt;/span&gt;&lt;span&gt;$B64&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt; base64&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$TMP_PNG&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Converting to AVIF (quality=&lt;/span&gt;&lt;span&gt;$AVIF_QUALITY&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;)...&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;avifenc&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -q &amp;quot;&lt;/span&gt;&lt;span&gt;$AVIF_QUALITY&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot; -y&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 420&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; 6&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; --ignore-exif --ignore-xmp&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span&gt;$TMP_PNG&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span&gt;$OUTPUT&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; /dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-11 z-i&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Saved: &lt;/span&gt;&lt;span&gt;$OUTPUT&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;du&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -h &amp;quot;&lt;/span&gt;&lt;span&gt;$OUTPUT&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt; cut&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; -f1&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;)&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;
&lt;p&gt;今回はパラメータや戻り値に変更はないので、モデル名の修正だけで移行できました。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-11&quot;&gt;MODEL=&amp;quot;gpt-image-2&amp;quot;        # image_generation tool model&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;MODEL=&amp;quot;gpt-image-2.5-flare&amp;quot;  # image_generation tool model&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;GPT-image-2からGPT-image-2.5 Flareへの移行は、スクリプトのモデル名を1行変えるだけで済みました。パラメータと戻り値は変わらず、トークン単価も据え置きです。&lt;/p&gt;
&lt;p&gt;効果がはっきり出たのは速さでした。同じプロンプトと設定で、中央値118.7秒が25.4秒になっています。記事を書きながら何度か引き直す使い方では、この差がそのまま作業の速さになります。&lt;/p&gt;
&lt;p&gt;画質は一長一短です。Flareは描写が濃く絵としての見栄えは上です。一方でgpt-image-2は色の指示に忠実で、構図も落ち着いています。速くなったからといって指示への忠実さまで上がったわけではありませんでした。&lt;/p&gt;
&lt;p&gt;新しく加わった&lt;code&gt;max&lt;/code&gt;は35.3秒、1枚あたり約0.13ドルでした。&lt;code&gt;high&lt;/code&gt;よりも質感は上がりますから、高解像度でここぞという1枚では選ぶ価値があります。&lt;/p&gt;
&lt;h2 id=&quot;References&quot;&gt;References&lt;/h2&gt;
&lt;!-- textlint-disable --&gt;
&lt;div class=&quot;references&quot;&gt;
    &lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://developers.openai.com/api/docs/guides/image-generation&quot;&gt;OpenAI&lt;/a&gt;. 「Image generation」&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://developers.openai.com/api/docs/pricing&quot;&gt;OpenAI&lt;/a&gt;. 「Pricing」&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://developers.openai.com/api/docs/models/gpt-image-2.5-flare&quot;&gt;OpenAI&lt;/a&gt;. 「GPT-Image-2.5 Flare」&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://developers.openai.com/api/docs/changelog&quot;&gt;OpenAI&lt;/a&gt;. 「Changelog」&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!-- textlint-enable --&gt;
</content>
        <summary type="html">GPT-image-2.5が発表されました。生成速度と品質向上が謳われているので、実際にgpt-image-2.5-flareを使用して画像生成を行い旧モデルと比較してみます。
</summary>
        </entry><entry xml:lang="ja">
        <title>SoundCloud API仕様の変更</title>
        <published>2025-04-28T00:00:00+00:00</published>
        <updated>2025-04-28T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/soundcloud-api-changed/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/soundcloud-api-changed/</id>
        
            <content type="html">&lt;p&gt;直近数日の内にSoundCloudはAPIの仕様を変更したようです。自作のTypeScriptコンポーネントがうまく機能しなくなったために対応しました。&lt;/p&gt;
&lt;h2 id=&quot;変更のポイント&quot;&gt;変更のポイント&lt;/h2&gt;
&lt;p&gt;以下のコードは以前使用していたものでSoundCloudの曲をWebに埋め込むためのコー
ドです。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;export const&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt; SoundCloudEmbed&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-10 z-i&quot;&gt; React&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-10 z-i&quot;&gt;FC&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-10 z-i&quot;&gt;SoundCloudEmbedProps&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; ({&lt;/span&gt;&lt;span class=&quot;z-12 z-i&quot;&gt; url&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; })&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;  // SoundCloud の埋め込み URL 形式に変換&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;  const&lt;/span&gt;&lt;span&gt; embedUrl&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; `https://w.soundcloud.com/player/?url=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true`&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;  return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;z-10&quot;&gt; className&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;w-full&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt;iframe&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;        width&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;        height&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;166&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;        scrolling&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;no&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;        frameBorder&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;no&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;        allow&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;autoplay&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;        src&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;{&lt;/span&gt;&lt;span&gt;embedUrl&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;      &amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt;iframe&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;z-10&quot;&gt; className&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;text-[10px] text-gray-400 overflow-hidden whitespace-nowrap text-ellipsis font-light&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt;a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;          href&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;https://soundcloud.com/yostos&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;          title&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;Yostos&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;          target&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;_blank&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;          rel&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;noopener noreferrer&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;          className&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;text-gray-400 no-underline&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;        &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          Yostos&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;        &amp;amp;&lt;/span&gt;&lt;span&gt;nbsp&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;span&gt;·&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;nbsp&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt;a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;          href&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;{&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;          title&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;Yostos&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;          target&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;_blank&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;          rel&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;noopener noreferrer&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-10&quot;&gt;          className&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;text-gray-400 no-underline&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;        &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          Blackbird&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;      &amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-3&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以前はiframeのsrcに指定するurlは曲ページへのリンクと同じリンクを指定すればよかった
のですが、ここ数日の変更でiframeのsrcの指定はAPI専用のURLでなければならなく
なったようです。&lt;/p&gt;
&lt;p&gt;この変更は既にアップロードされている曲には遡及していないようで、直近にアップ
ロードした曲のみに影響しています。&lt;/p&gt;
&lt;h2 id=&quot;SoundCloudEmbed_コンポーネントの変更&quot;&gt;SoundCloudEmbed コンポーネントの変更&lt;/h2&gt;
&lt;p&gt;本来はSoundCloudでJavascriptのコードを取得すべきです。
このブログではMDXを使っている関係で取得したコードでは修正が必要なため、
&lt;code&gt;SoundCloudEmbed&lt;/code&gt;というコンポーネントを作っていました。
この変更でShare Linkのみ指定していたSoundCloudEmbedは動かなくなりました。&lt;/p&gt;
&lt;p&gt;仕方がないのでAPI用のURLを指定できようように修正しました。またタイトルの固定
でなく曲名を指定できるよう変更しています。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;z-10 z-i&quot;&gt; SoundCloudEmbedProps&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot; z-i&quot;&gt;  url&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot; z-i&quot;&gt;  apiurl&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;?:&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt; // Optional API URL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot; z-i&quot;&gt;  title&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;?:&lt;/span&gt;&lt;span class=&quot;z-9&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;  // Optional title&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;export const&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt; SoundCloudEmbed&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-10 z-i&quot;&gt; React&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-10 z-i&quot;&gt;FC&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-10 z-i&quot;&gt;SoundCloudEmbedProps&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; =&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  url&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  apiurl&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  title&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;  // SoundCloud の埋め込み URL 形式に変換&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;  // If apiurl is provided, use it for the iframe source, otherwise use the url&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;  const&lt;/span&gt;&lt;span&gt; sourceUrl&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; =&lt;/span&gt;&lt;span&gt; apiurl&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; ||&lt;/span&gt;&lt;span&gt; url&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;  const&lt;/span&gt;&lt;span&gt; embedUrl&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; `https://w.soundcloud.com/player/?url=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;(&lt;/span&gt;&lt;span&gt;sourceUrl&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true`&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4 z-i&quot;&gt;  // Prepare the display title&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;  const&lt;/span&gt;&lt;span&gt; displayTitle&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; =&lt;/span&gt;&lt;span&gt; title&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; ?&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; `Yostos - &lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;${&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;quot;Yostos&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-9&quot;&gt;  return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;div className&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;w-full&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-12 z-i&quot;&gt;iframe&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        width&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        height&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;166&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        scrolling&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;no&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        frameBorder&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;no&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        allow&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;autoplay&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        src&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;{&lt;/span&gt;&lt;span&gt;embedUrl&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;      &amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-10 z-i&quot;&gt;iframe&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;div className&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;text-[10px] text-gray-400 overflow-hidden whitespace-nowrap text-ellipsis font-light&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-12 z-i&quot;&gt;a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          href&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;{&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          title&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;{&lt;/span&gt;&lt;span&gt;displayTitle&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          target&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;_blank&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          rel&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;noopener noreferrer&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          className&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;text-gray-400 no-underline&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;        &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;          {&lt;/span&gt;&lt;span class=&quot;z-12 z-i&quot;&gt;displayTitle&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;      &amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-4&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;API用URLだけ取得はできないので、結局埋め込み用のJavascriptのコードをSoundCloudから取得してURLを取り出して貼り付けることになります。
手間は貼り付けるより面倒なので、コンポーネントにした意味がないかもしれません。&lt;/p&gt;
</content>
        <summary type="html">直近数日の内にSoundCloudはAPIの仕様を変更したようです。自作のTypeScriptコンポーネントがうまく機能しなくなったために対応しました。</summary>
        </entry><entry xml:lang="ja">
        <title>国税庁の法人番号システムWeb-APIの検証</title>
        <published>2025-04-18T00:00:00+00:00</published>
        <updated>2025-04-18T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/04/company-info-api/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/04/company-info-api/</id>
        
            <content type="html">&lt;p&gt;仕事で企業を一意に特定するという要件があり、法人番号制度を利用するために
国税庁が提供する法人番号システムのWeb API
の検証のためのコードを作成してみました。&lt;/p&gt;
&lt;h2 id=&quot;法人番号制度とは&quot;&gt;法人番号制度とは&lt;/h2&gt;
&lt;p&gt;法人番号制度は、2015年10月5日に発足しました。
この制度は、行政の効率化、国民の利便性の向上、および公平・公正な社会の実現を
目的として導入されました。法人には13桁の番号が指定され、商号や所在地といった
基本情報とともに国税庁の法人番号公表サイトで公開されています。&lt;/p&gt;
&lt;p&gt;特に近年では、2023年10月から開始されたインボイス制度（適格請求書等保存方式）
との関連で、登録番号（T+法人番号等）を記載した適格請求書の発行が消費税の
仕入税額控除の要件となっているためシステムで扱うことも多くなっています。&lt;/p&gt;
&lt;h2 id=&quot;国税庁のWeb_APIについて&quot;&gt;国税庁のWeb APIについて&lt;/h2&gt;
&lt;p&gt;国税庁が提供するAPIについては、&lt;a rel=&quot;external&quot; href=&quot;https://www.houjin-bangou.nta.go.jp/webapi/index.html&quot;&gt;法人番号システムのWep API&lt;/a&gt;
のページに利用方法や申し込み方法がガイドされています。&lt;/p&gt;
&lt;p&gt;利用には国税庁が振り出す「アプリケーションID」を取得する必要があります。
次の２つのアプリケーションIDがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インボイスWeb-APIを利用できるアプリケーションID&lt;/li&gt;
&lt;li&gt;法人番号システムWeb-APIのみ利用できるアプリケーションID&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前者は国税庁の承認を受ける必要がありますが、後者の法人番号システムのAPIにつ
いては申請だけでアプリケーションIDを振り出してくれます。ただし、申請してから
２週間から1ヶ月程度かかります。&lt;/p&gt;
&lt;h2 id=&quot;法人情報検索APIクライアント&quot;&gt;法人情報検索APIクライアント&lt;/h2&gt;
&lt;p&gt;Typescriptで検証のためのコードを書いてみました。&lt;/p&gt;
&lt;p&gt;法人名、または法人番号で検索できます。&lt;/p&gt;
&lt;p&gt;実行すると、次のような標準出力にレスポンスをそのまま表示します。
(以下の例では、適当に折り返しています)&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/yostos/get-company-info&quot;&gt;GitHubに公開&lt;/a&gt;したので、ビルド方法や詳細な使い方はそちらをご覧ください。
検証用なのでエラー処理はいい加減です。&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;╰─❯&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; npm start --  --type name 任天堂株式会社&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; company-info-api@1.0.0 start&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; node dist/index.js --type name 任天堂株式会社&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;含まれている日本語：&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; 任天堂株式会社&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;日本語を含むか：&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;xml version&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span&gt; encoding&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;quot;UTF-8&amp;quot;?&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;corporations&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;lastUpdateDate&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;2025-04-18&lt;/span&gt;&lt;span&gt;&amp;lt;/lastUpdateDate&amp;gt;&amp;lt;count&amp;gt;1&amp;lt;/count&amp;gt;&amp;lt;divideNumber&amp;gt;1&amp;lt;/divideNumber&amp;gt;&amp;lt;di&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;videSize&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;/divideSize&amp;gt;&amp;lt;corporation&amp;gt;&amp;lt;sequenceNumber&amp;gt;1&amp;lt;/sequenceNumber&amp;gt;&amp;lt;corpo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;rateNumber&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;1130001011420&lt;/span&gt;&lt;span&gt;&amp;lt;/corporateNumber&amp;gt;&amp;lt;process&amp;gt;01&amp;lt;/process&amp;gt;&amp;lt;correct&amp;gt;1&amp;lt;/c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;orrect&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;updateDate&amp;gt;2018-07-18&amp;lt;/updateDate&amp;gt;&amp;lt;changeDate&amp;gt;2015-10-05&amp;lt;/changeDat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;e&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;name&amp;gt;任天堂株式会社&amp;lt;/name&amp;gt;&amp;lt;nameImageId/&amp;gt;&amp;lt;kind&amp;gt;301&amp;lt;/kind&amp;gt;&amp;lt;prefectureName&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;京都府&lt;/span&gt;&lt;span&gt;&amp;lt;/prefectureName&amp;gt;&amp;lt;cityName&amp;gt;京都市南区&amp;lt;/cityName&amp;gt;&amp;lt;streetNumber&amp;gt;上鳥羽鉾&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;立町１１番地１&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;/streetNumber&amp;gt;&amp;lt;addressImageId/&amp;gt;&amp;lt;prefectureCode&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;6&amp;lt;&lt;/span&gt;&lt;span&gt;/prefectureCode&amp;gt;&amp;lt;cityCod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;e&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;107&lt;/span&gt;&lt;span&gt;&amp;lt;/cityCode&amp;gt;&amp;lt;postCode&amp;gt;6018116&amp;lt;/postCode&amp;gt;&amp;lt;addressOutside/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;addressOutsideImageId/&amp;gt;&amp;lt;closeDate/&amp;gt;&amp;lt;closeCause/&amp;gt;&amp;lt;successorCorporateNumber/&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;changeCause/&amp;gt;&amp;lt;assignmentDate&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;2015-10-&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;05&amp;lt;&lt;/span&gt;&lt;span&gt;/assignmentDate&amp;gt;&amp;lt;latest&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;/latest&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;enName/&amp;gt;&amp;lt;enPrefectureName/&amp;gt;&amp;lt;enCityName/&amp;gt;&amp;lt;enAddressOutside/&amp;gt;&amp;lt;furigana&lt;/span&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;ニンテ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;ンドウ&lt;/span&gt;&lt;span&gt;&amp;lt;/furigana&amp;gt;&amp;lt;hihyoji&amp;gt;0&amp;lt;/hihyoji&amp;gt;&amp;lt;/corporation&amp;gt;&amp;lt;/corporations&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;╰─❯&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; npm start -- --format csv --type name 任天堂株式会社&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; company-info-api@1.0.0 start&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; node dist/index.js --format csv --type name 任天堂株式会社&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;含まれている日本語：&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; 任天堂株式会社&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;日本語を含むか：&lt;/span&gt;&lt;span class=&quot;z-14&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;2025-04-18,1,1,1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;1,1130001011420,01,1,2018-07-18,2015-10-05,&amp;quot;任天堂株式会社&amp;quot;,,301,&amp;quot;京都府&amp;quot;,&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;京都市南区&amp;quot;,&amp;quot;上鳥羽鉾立町１１番地１&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-3 z-i&quot;&gt;,26,107,6018116,,,,,,,2015-10-05,1,,,,,&amp;quot;ニンテンドウ&amp;quot;,0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;一応国の仕組みで、一意に法人を特定できるのいろいろ活用できて便利そうです。&lt;/p&gt;
&lt;p&gt;私が社会人になりたての頃に同じような要件があり、
当時はこういったものがありませんでした。
そのため、名寄せしたり帝国データバンクの企業情報とぶつけたり苦労しました。
国がこんなものを提供してくれるなんて、いい時代だ。&lt;/p&gt;
&lt;h2 id=&quot;2025-04-20_追記&quot;&gt;2025-04-20 追記&lt;/h2&gt;
&lt;p&gt;経済産業省も法人番号で検索できるAPIを公開していたので、対応しました。&lt;/p&gt;
</content>
        <summary type="html">I had a requirement at work to uniquely identify companies, and to utilize the corporate number system, I created code to verify the Web API of the Corporate Number System provided by the National Tax Agency.</summary>
        </entry>
</feed>
