<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: amy5193111-svg</title>
    <description>The latest articles on DEV Community by amy5193111-svg (@amy5193111svg).</description>
    <link>https://dev.to/amy5193111svg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4132575%2Fb6f4bdb5-179c-4db7-97dc-d14ffc756042.png</url>
      <title>DEV Community: amy5193111-svg</title>
      <link>https://dev.to/amy5193111svg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amy5193111svg"/>
    <language>en</language>
    <item>
      <title>Running One Gateway for Multiple Model Providers: Lessons From Production</title>
      <dc:creator>amy5193111-svg</dc:creator>
      <pubDate>Mon, 21 Sep 2026 13:47:55 +0000</pubDate>
      <link>https://dev.to/amy5193111svg/running-one-gateway-for-multiple-model-providers-lessons-from-production-cli</link>
      <guid>https://dev.to/amy5193111svg/running-one-gateway-for-multiple-model-providers-lessons-from-production-cli</guid>
      <description>&lt;p&gt;Every team eventually ends up with three API keys, four SDKs, and no consistent way to answer "what did we spend on this feature last month?"&lt;/p&gt;

&lt;p&gt;A gateway fixes the accounting. It does not automatically fix the architecture. Here is what actually matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a gateway buys you
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One schema.&lt;/strong&gt; Providers disagree on field names, streaming formats, and error shapes. Normalizing that in one place beats normalizing it in five services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One bill.&lt;/strong&gt; Per-token attribution by feature, team, or model. This is the underrated win — you cannot optimize what you cannot see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One failover path.&lt;/strong&gt; When a provider degrades, rerouting should be a config change, not a deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs you
&lt;/h2&gt;

&lt;p&gt;A gateway is another hop. That means another place for latency and another component that can be down. If your gateway is a single container on a single host, you have built a SPOF in exchange for convenience.&lt;/p&gt;

&lt;p&gt;The mitigations that matter: weight-based routing rather than strict primary/backup (a degraded primary should shed load gradually), and health checks that actually exercise the model endpoint rather than just the HTTP port.&lt;/p&gt;

&lt;h2&gt;
  
  
  The measurement trap
&lt;/h2&gt;

&lt;p&gt;Aggregate spend looks informative and is not. What you want is per-model, per-feature token counts, split by input/output/cache. Without that split, "costs went up" is unactionable.&lt;/p&gt;

&lt;p&gt;I wrote up the full set of trade-offs, including the weighting formula and why equal-priority retries behave the way they do, at &lt;a href="https://blog.yushou.xyz/2026/09/05/multi-model-api-gateway/" rel="noopener noreferrer"&gt;multi-model API gateway&lt;/a&gt; and the &lt;a href="https://blog.yushou.xyz/llm-api-pricing-guide/" rel="noopener noreferrer"&gt;LLM API pricing guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The lesson: adopt a gateway for the accounting and the schema normalization. Do not adopt it thinking it makes you highly available for free.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>api</category>
      <category>devops</category>
    </item>
    <item>
      <title>Why Developers in China Route Through API Relays (And When It's a Bad Idea)</title>
      <dc:creator>amy5193111-svg</dc:creator>
      <pubDate>Mon, 21 Sep 2026 13:42:03 +0000</pubDate>
      <link>https://dev.to/amy5193111svg/why-developers-in-china-route-through-api-relays-and-when-its-a-bad-idea-26f</link>
      <guid>https://dev.to/amy5193111svg/why-developers-in-china-route-through-api-relays-and-when-its-a-bad-idea-26f</guid>
      <description>&lt;p&gt;If you write code outside mainland China and deploy inside it, you already know the shape of this problem: the API works from your laptop and times out from your server.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual failure modes
&lt;/h2&gt;

&lt;p&gt;Three things break, in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;TLS handshakes to some endpoints&lt;/strong&gt; get reset intermittently, not consistently. Hard to reproduce, easy to blame on your code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency spikes&lt;/strong&gt; that look like model slowness but are network-side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment rails&lt;/strong&gt; — even when the network is fine, billing is where it stops.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What a relay actually does
&lt;/h2&gt;

&lt;p&gt;A relay terminates your request domestically and forwards it over a stable egress path. Done well, it is transparent: same request shape, same response shape, one base URL change.&lt;/p&gt;

&lt;p&gt;Done badly, it is a single point of failure with worse uptime than what you started with.&lt;/p&gt;

&lt;h2&gt;
  
  
  When it is the wrong answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You need provider-specific beta features that the relay has not implemented&lt;/li&gt;
&lt;li&gt;You need a data residency guarantee the relay cannot give you in writing&lt;/li&gt;
&lt;li&gt;Your traffic is low enough that retry logic on your side is genuinely simpler&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The practical checklist
&lt;/h2&gt;

&lt;p&gt;Before picking one, verify: does it expose the same request schema, does it document its egress path, and can you get per-token cost attribution rather than a monthly total?&lt;/p&gt;

&lt;p&gt;I wrote a longer comparison of the trade-offs, including how to test a relay before committing, at &lt;a href="https://blog.yushou.xyz/2026/09/03/api-relay-station-worth-it/" rel="noopener noreferrer"&gt;API relay station worth it&lt;/a&gt; and a setup guide for &lt;a href="https://blog.yushou.xyz/ai-client-setup-guide/" rel="noopener noreferrer"&gt;Claude-compatible clients&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Rule of thumb: if you cannot articulate what breaks without the relay, you are adding a dependency for reasons you cannot measure.&lt;/p&gt;

</description>
      <category>api</category>
      <category>china</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Cutting Claude Code API Costs: Where the Money Actually Goes</title>
      <dc:creator>amy5193111-svg</dc:creator>
      <pubDate>Mon, 21 Sep 2026 13:41:56 +0000</pubDate>
      <link>https://dev.to/amy5193111svg/cutting-claude-code-api-costs-where-the-money-actually-goes-4gfe</link>
      <guid>https://dev.to/amy5193111svg/cutting-claude-code-api-costs-where-the-money-actually-goes-4gfe</guid>
      <description>&lt;p&gt;Most developers hit the same wall a week into using Claude Code: the token bill grows faster than the output. Here is where the money actually goes, and the config changes that move the needle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the tokens go
&lt;/h2&gt;

&lt;p&gt;Three buckets dominate:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bucket&lt;/th&gt;
&lt;th&gt;Typical share&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cache writes&lt;/td&gt;
&lt;td&gt;20-35%&lt;/td&gt;
&lt;td&gt;Every new file in context re-billed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache reads&lt;/td&gt;
&lt;td&gt;30-50%&lt;/td&gt;
&lt;td&gt;Cheap per token, but constant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fresh output&lt;/td&gt;
&lt;td&gt;15-25%&lt;/td&gt;
&lt;td&gt;The only bucket you actually want&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The counterintuitive part: &lt;strong&gt;context management beats model choice&lt;/strong&gt;. Switching from a frontier model to a mid-tier one saves less than fixing context bloat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three changes that work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Set an explicit context ceiling.&lt;/strong&gt; Auto-compaction helps, but a hard ceiling forces the agent to summarize early rather than discover the limit mid-task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Separate read-heavy from write-heavy sessions.&lt;/strong&gt; Exploration and implementation have different cost shapes; mixing them means paying cache-write prices for work that never needed repo context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Watch the base URL.&lt;/strong&gt; If you are routing through a gateway rather than hitting the provider directly, the per-token price may differ from the published rate card.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring it properly
&lt;/h2&gt;

&lt;p&gt;The only honest way to compare is to log input/output/cache tokens separately per session. Aggregate "total spend" hides the structure you need to fix.&lt;/p&gt;

&lt;p&gt;I wrote up the full breakdown with the actual numbers, including the config file changes, here: &lt;a href="https://blog.yushou.xyz/2026/09/12/claude-code-monthly-cost-breakdown/" rel="noopener noreferrer"&gt;Claude Code monthly cost breakdown&lt;/a&gt; and a &lt;a href="https://blog.yushou.xyz/claude-code-api-guide/" rel="noopener noreferrer"&gt;base URL configuration walkthrough&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The short version: measure the three buckets separately, cap context, and stop switching models hoping it fixes an architecture problem.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>api</category>
      <category>programming</category>
    </item>
    <item>
      <title>Site Is Not Indexed? Debug It in Search Console, Not With Backlinks</title>
      <dc:creator>amy5193111-svg</dc:creator>
      <pubDate>Sat, 19 Sep 2026 07:55:36 +0000</pubDate>
      <link>https://dev.to/amy5193111svg/site-is-not-indexed-debug-it-in-search-console-not-with-backlinks-13h8</link>
      <guid>https://dev.to/amy5193111svg/site-is-not-indexed-debug-it-in-search-console-not-with-backlinks-13h8</guid>
      <description>&lt;h1&gt;
  
  
  Your New Site Is Not Indexed? Debug It in Search Console, Not With Backlinks
&lt;/h1&gt;

&lt;p&gt;I run a few small sites. Every time one of them goes live, someone eventually asks the same question: &lt;em&gt;"Google still hasn't indexed it - should I buy backlinks?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Usually, no. Most of the time the problem is visible in Google Search Console within ten minutes, and it is not about authority at all. This is the checklist I actually run, in this order.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Confirm the sitemap is a sitemap
&lt;/h2&gt;

&lt;p&gt;Submitting a sitemap in GSC feels like a finish line. It is a starting line.&lt;/p&gt;

&lt;p&gt;Check two things before you submit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The URL returns real XML, not an HTML page. A very common failure: a reverse proxy or SPA fallback serves &lt;code&gt;200 OK&lt;/code&gt; with your homepage HTML at &lt;code&gt;/sitemap.xml&lt;/code&gt;. GSC records this as "couldn't fetch" and you get nothing.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;robots.txt&lt;/code&gt; lists the sitemap and doesn't block the paths inside it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quick check from a terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://example.com/sitemap.xml | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://example.com/sitemap.xml | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the first line of the body is &lt;code&gt;&amp;lt;!doctype html&amp;gt;&lt;/code&gt;, you have your answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. "Discovered - currently not indexed" is an internal-linking problem
&lt;/h2&gt;

&lt;p&gt;This is the single most common status for new sites, and people misread it as a penalty. It means: &lt;em&gt;Google knows the URL exists, but has no reason to spend crawl budget on it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Crawl priority is mostly internal PageRank. If your important pages are only reachable from the sitemap - or from an archive page buried five clicks deep - they are effectively orphaned.&lt;/p&gt;

&lt;p&gt;The fix is unglamorous and works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Put your core pages on the homepage, in real &lt;code&gt;&amp;lt;a href&amp;gt;&lt;/code&gt; links&lt;/li&gt;
&lt;li&gt;Link between related articles with descriptive anchor text&lt;/li&gt;
&lt;li&gt;Make sure your homepage isn't linking to URLs that redirect elsewhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick audit: fetch your homepage and count how many links point at pages you actually want indexed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://example.com/ | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'href="https://example.com/[^"]*"'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. "Crawled - currently not indexed" is usually a quality or duplication signal
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;URL Inspection -&amp;gt; Test Live URL -&amp;gt; View Crawled Page&lt;/strong&gt; and look at what Googlebot actually received:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Garbled characters (encoding issues)&lt;/li&gt;
&lt;li&gt;A blank shell (content rendered client-side only)&lt;/li&gt;
&lt;li&gt;A 404 or a redirect chain&lt;/li&gt;
&lt;li&gt;A server so slow that the crawler gave up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the sneaky one: near-duplicate pages. If you have 50 articles that all say roughly the same thing, Google will index one and skip the rest. In that case consolidation is the answer - merge, then 301 the duplicates into the survivor.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Check for redirect chains and stale links
&lt;/h2&gt;

&lt;p&gt;Internal links pointing at redirected URLs burn crawl budget on every pass. Crawl your homepage and archives, and update any link whose target returns a 301.&lt;/p&gt;

&lt;p&gt;If you consolidated pages, also remove the retired URLs from your sitemap. Advertising URLs that only redirect is a signal you should not send.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. No impressions? Check whether the query space exists
&lt;/h2&gt;

&lt;p&gt;If pages are indexed but the Performance report is empty, you probably aren't ranking - or nobody searches the way you wrote. Look at Search Console -&amp;gt; Performance -&amp;gt; Queries. If you see impressions with a position around 10-20, that is a page worth improving rather than replacing. Add depth to what already half-ranks instead of publishing another article.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What actually moves the needle when everything technical is clean
&lt;/h2&gt;

&lt;p&gt;Once the technical side is green and nothing is indexed, the remaining bottleneck is crawl demand - which comes from off-site signals and content uniqueness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get real links from pages Google already crawls&lt;/li&gt;
&lt;li&gt;Publish something that changes (live data, pricing, benchmarks)&lt;/li&gt;
&lt;li&gt;Cut the number of near-duplicate URLs on the site instead of adding more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Publishing five more articles a week while twenty URLs sit unindexed makes the ratio worse, not better. That was the mistake I made the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. IndexNow is free - use it
&lt;/h2&gt;

&lt;p&gt;Google has no public instant-indexing API outside the (quota-limited) "Request Indexing" button, but Bing and Yandex support IndexNow: host a key file, POST your URLs, and you get crawled quickly. It won't help Google directly, but it's ten minutes of work.&lt;/p&gt;




&lt;p&gt;I wrote up the longer, ordered version of this checklist - including how to read the "Discovered" drilldown and what to do per status - here: &lt;a href="https://blog.yushou.xyz/2026/09/05/google-search-console-indexing-tips/" rel="noopener noreferrer"&gt;Google Search Console indexing troubleshooting&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're debugging this while also wiring up an API integration, the config side of things lives at &lt;a href="https://api.yushou.xyz/guide/" rel="noopener noreferrer"&gt;api.yushou.xyz/guide&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>website</category>
    </item>
  </channel>
</rss>
