<?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: 张洲诚（Zack.ZHANG）</title>
    <description>The latest articles on DEV Community by 张洲诚（Zack.ZHANG） (@zackzhang).</description>
    <link>https://dev.to/zackzhang</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%2F4009090%2F3dfae9a2-cf7c-4d8e-90fa-7dba1333ea72.jpg</url>
      <title>DEV Community: 张洲诚（Zack.ZHANG）</title>
      <link>https://dev.to/zackzhang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zackzhang"/>
    <language>en</language>
    <item>
      <title>I Stopped Guessing Which LLM to Use — It's One Command and My Own Numbers Now</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Fri, 14 Aug 2026 11:41:52 +0000</pubDate>
      <link>https://dev.to/zackzhang/i-stopped-guessing-which-llm-to-use-its-one-command-and-my-own-numbers-now-3a44</link>
      <guid>https://dev.to/zackzhang/i-stopped-guessing-which-llm-to-use-its-one-command-and-my-own-numbers-now-3a44</guid>
      <description>&lt;h2&gt;
  
  
  The freelance gig that stalled on question one
&lt;/h2&gt;

&lt;p&gt;Last month I took on a freelance build: a customer-support bot for a DTC store. Three hard constraints — it must understand photos customers upload, sustain ~50k calls a day, and the budget was thin.&lt;/p&gt;

&lt;p&gt;The code wasn't the hard part. Question one was: &lt;strong&gt;which model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I opened the model catalog and stared. The Qwen family alone spans flash/plus/max tiers with dated snapshots; below that, a dozen third-party models. Every one has a spec page and a price sheet. None has a row that says "support bot, image input, cost-sensitive."&lt;/p&gt;

&lt;p&gt;Benchmarks didn't help — they measure someone else's scenario (long-context recall, competition math). Free-tier roundups are static snapshots that rot in a quarter, and they tell you &lt;em&gt;who has quota&lt;/em&gt;, never &lt;em&gt;what your project should run on&lt;/em&gt;. Asking a general-purpose LLM was the worst option: it confidently recommended a model I'd never seen in the catalog. I checked. It doesn't exist. Training memory is the wrong tool for a question whose answer is live data.&lt;/p&gt;

&lt;p&gt;Context worth naming: OmniRoute, a free MIT-licensed AI gateway, crossed 47k GitHub stars this month — one endpoint, 330+ providers. People clearly want model selection to stop being their job. But a gateway solves "route me to whatever's cheap and alive," not "which model fits &lt;em&gt;this&lt;/em&gt; scenario."&lt;/p&gt;

&lt;h2&gt;
  
  
  The one command
&lt;/h2&gt;

&lt;p&gt;What closed the ticket was a subcommand in Model Studio's CLI, &lt;code&gt;bl&lt;/code&gt;. (My previous post was about an agent reading provider docs locally — that solved &lt;em&gt;lookup&lt;/em&gt;; this one hands the &lt;em&gt;decision&lt;/em&gt; to the terminal. They stand alone.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; bailian-cli
bl auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Node.js 18+. API key at login — &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;get one in the console&lt;/a&gt;; the &lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github&amp;amp;" rel="noopener noreferrer"&gt;CLI install guide&lt;/a&gt; covers prerequisites.&lt;/p&gt;

&lt;p&gt;Then I wrote the client's constraints as one sentence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl advisor recommend &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"E-commerce support bot that reads product screenshots uploaded by customers, ~50k calls/day, cost is the priority"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten seconds: intent analysis plus three ranked picks. The top one (trimmed from real output):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qwen3.7-flash-2026-07-15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cost-optimized"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contextWindow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The model is specifically designed for cost-optimized, high-concurrency scenarios ... ideal for handling 50,000 daily API calls under a low budget."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"docUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://help.aliyun.com/document_detail/3016807.html"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every pick carries a &lt;code&gt;docUrl&lt;/code&gt; to the official spec-and-pricing page. &lt;strong&gt;Treat the ranking as the starting point, then verify against the doc.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it thinks: three stages
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fmodel-advisor%2Fpipeline-en-1280x720.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fmodel-advisor%2Fpipeline-en-1280x720.jpg" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--dry-run&lt;/code&gt; runs the first two stages only — intent analysis and candidate recall — skipping the final LLM ranking (and its cost):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"intent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scenarioHints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"high-concurrency"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"consumer-facing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low-latency"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cost-sensitive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image-input"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text-output"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"inputModality"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Image"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"budget"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"qualityPreference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cost-optimized"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"candidateCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"candidates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qwen3.5-27b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.509&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"...50 total"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plain language becomes structured constraints: "understands screenshots" → &lt;code&gt;inputModality: Image&lt;/code&gt;; "~50k calls/day" → &lt;code&gt;high-concurrency&lt;/code&gt;. Candidate recall reads &lt;strong&gt;live catalog data&lt;/strong&gt; — that's the honest difference from asking a chatbot, which will invent a plausible-sounding model that doesn't exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change the scenario, change the answer
&lt;/h2&gt;

&lt;p&gt;My partner's contract-review tooling (legal-tech, precision-first, a few dozen contracts a day) got a completely different result from the same command: &lt;code&gt;budget: medium&lt;/code&gt;, &lt;code&gt;qualityPreference: flagship&lt;/code&gt;, and a top pick of &lt;strong&gt;farui-plus&lt;/strong&gt; — a legal-domain model I'd never heard of, because leaderboard authors don't test vertical-domain legal models.&lt;/p&gt;

&lt;p&gt;That's the dividing line: a leaderboard gives every scenario the same answer; scenario-based selection gives each scenario its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your account's real numbers
&lt;/h2&gt;

&lt;p&gt;One prerequisite that will bite you: the &lt;code&gt;usage&lt;/code&gt;/&lt;code&gt;quota&lt;/code&gt; commands authenticate against the console, not your API key. Key-only auth gets you exactly this (my real output):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"No console access token found."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Run `bl auth login --console` or set DASHSCOPE_ACCESS_TOKEN."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix: &lt;code&gt;bl auth login --console&lt;/code&gt; (coexists with your key). Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl usage free &lt;span class="nt"&gt;--expiring&lt;/span&gt; 30          &lt;span class="c"&gt;# quota expiring within 30 days&lt;/span&gt;
bl usage stats &lt;span class="nt"&gt;--days&lt;/span&gt; 30 &lt;span class="nt"&gt;--workspace-id&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="c"&gt;# real usage distribution&lt;/span&gt;
bl quota check &lt;span class="nt"&gt;--model&lt;/span&gt; qwen3.7-flash-2026-07-15  &lt;span class="c"&gt;# RPM/TPM headroom&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;usage stats&lt;/code&gt; requires &lt;code&gt;--workspace-id&lt;/code&gt; — &lt;code&gt;bl workspace list&lt;/code&gt; finds it, or pin it with &lt;code&gt;bl config set workspace_id &amp;lt;id&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free-tier traps (checked against the docs)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quota expires&lt;/strong&gt;: 30–90 days depending on model, from activation. Doesn't pause, doesn't renew, doesn't roll over. Hence &lt;code&gt;--expiring 30&lt;/code&gt; in your calendar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-model quota&lt;/strong&gt;: typically 1M tokens each, not mergeable. A dated snapshot and the undated latest are &lt;em&gt;separate models with separate quotas&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No failover on exhaustion&lt;/strong&gt;: calls just start billing (on completed accounts). Pin &lt;code&gt;--model&lt;/code&gt; in scripts at your own risk — or use the kill switch: &lt;code&gt;bl usage freetier --model &amp;lt;m&amp;gt; --on&lt;/code&gt; returns &lt;code&gt;AllocationQuota.FreeTierOnly&lt;/code&gt; instead of charging&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it is not
&lt;/h2&gt;

&lt;p&gt;It recommends within Model Studio's catalog — not a cross-vendor comparison. It produces a ranked starting point, not a verdict. Gateways (OmniRoute et al.) solve routing and availability; this solves scenario fit. Stack them if you like — someone still has to fill the gateway's fallback list.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Catalogs and prices shift monthly, so model selection is a &lt;em&gt;recurring&lt;/em&gt; decision, not a one-time one. Making it a repeatable command beats being told the right answer once. Entry point: the &lt;a href="https://bailian.console.aliyun.com/?source_channel=hh_github" rel="noopener noreferrer"&gt;Model Studio console&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;All commands verified against bailian-cli 1.4.2; outputs shown are real runs. Free-tier terms checked against official docs at publication time.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>One System Prompt, Five Text Jobs: Compliance Screening, Review Tagging and Contract Extraction from the Terminal</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Wed, 12 Aug 2026 09:12:13 +0000</pubDate>
      <link>https://dev.to/zackzhang/one-system-prompt-five-text-jobs-compliance-screening-review-tagging-and-contract-extraction-27j1</link>
      <guid>https://dev.to/zackzhang/one-system-prompt-five-text-jobs-compliance-screening-review-tagging-and-contract-extraction-27j1</guid>
      <description>&lt;h2&gt;
  
  
  The backlog
&lt;/h2&gt;

&lt;p&gt;A friend's small Etsy/Shopify shop got its product page rejected twice for over-claiming — and her keyword-blacklist checker had passed it both times, because those tools match strings, not meaning ("quietest" flags, "quiet-operation benchmark" sails through).&lt;/p&gt;

&lt;p&gt;Fixing that led to counting everything else her shop publishes or receives and never reads: 300+ negative reviews sitting in the dashboard, hundreds of pre-sale messages, a 20-page supplier agreement. Pasting any of it into a chatbot produces prose — "customers seem unhappy with shipping" — which answers nothing you can act on. Which issue? How many? Enterprise review-analytics SaaS answers that for four figures a year, which a one-person shop won't pay.&lt;/p&gt;

&lt;p&gt;Here's what worked instead: Alibaba Cloud Model Studio's CLI (&lt;code&gt;bl&lt;/code&gt;), a system prompt that acts as a JSON schema, and a shell loop. Five kinds of text, one pattern. Show and tell below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-text-insight%2Fpipeline-en-1280x720.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-text-insight%2Fpipeline-en-1280x720.jpg" width="800" alt="Messy text in, structured data out: the bl text chat pipeline" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; bailian-cli
bl auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Node 18+. API key from the &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;Model Studio console&lt;/a&gt; — free tier included, and &lt;code&gt;bl usage free&lt;/code&gt; shows what's left. Install guide &lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github&amp;amp;" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one command everything else is a variation of
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl text chat &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-turbo &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"You are a review analyzer. Output JSON only, no extra text. Fields: sentiment(positive/negative/neutral), dimension(quality/shipping/support/price/other), severity(high/medium/low), summary(under 12 words). If undeterminable, use 'unknown' — do not guess."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Stopped heating after three days and support took a week to reply."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"sentiment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"negative"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"dimension"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"quality"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"failed in three days, slow support"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three schema rules I learned the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"JSON only, no extra text"&lt;/strong&gt; — otherwise you get a polite "Sure! Here's the analysis:" prefix and your parser dies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enumerate the allowed values&lt;/strong&gt; — otherwise "shipping", "delivery" and "logistics" show up as three different dimensions and your group-by is confetti&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Use 'unknown', don't guess"&lt;/strong&gt; — otherwise a review that just says "fine" gets a confidently invented label&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The loop (this is the whole "batch framework")
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; out
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; line&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;bl text chat &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-turbo &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"You are a review analyzer. Output JSON only. Fields: sentiment, dimension(quality/shipping/support/price/other), severity(high/medium/low), summary(under 12 words). Use 'unknown' if undeterminable."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; out/results.jsonl
&lt;span class="k"&gt;done&lt;/span&gt; &amp;lt; reviews.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;300 reviews, ~15 minutes, one JSON per line. Aggregation for small files: feed it back —&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl text chat &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"Input is line-delimited JSON of review analyses. Output a stats table: count by dimension descending, high-severity count per group, one-line summary of top three issues."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;out/results.jsonl&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For thousands of rows, do the counting in jq or a pivot table instead — deterministic math shouldn't run on a probabilistic model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result that mattered
&lt;/h2&gt;

&lt;p&gt;Shipping damage: 41 mentions. Product quality: 38. Support: 22. Her gut said quality was the top complaint; the data said shipping damage. She took the "41" to her carrier the next morning. &lt;strong&gt;The gap between gut and data is the product here.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-text-insight%2Fresult-en-1280x720.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-text-insight%2Fresult-en-1280x720.jpg" width="800" alt="Gut feeling vs the data: shipping damage was the real number one" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Accuracy, honestly: 28/30 on a manual spot check. The two misses were sarcasm — every model's weak spot, not fixed by paying for a bigger one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same pattern, different system prompts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ad compliance pre-check&lt;/strong&gt;: JSON array of &lt;code&gt;{quote, risk_type, explanation, suggested_rewrite}&lt;/code&gt; — caught an implied health claim ("say goodbye to lung-harming fumes") that no keyword blacklist would ever match. It's a self-check aid, not legal advice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract clause extraction&lt;/strong&gt;: &lt;code&gt;{payment_terms, liability, dispute_resolution}&lt;/code&gt; with the load-bearing instruction "quote verbatim, never paraphrase" — paraphrased legal text is subtly wrong legal text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support inbox tagging&lt;/strong&gt;: &lt;code&gt;{intent, keyword}&lt;/code&gt; over a few hundred messages; compatibility questions turned out to be half of pre-sale volume, so the compatibility chart moved up the product page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The inverse case&lt;/strong&gt; — one long competitor analysis — flips the model strategy: default flagship, &lt;code&gt;--max-tokens 8000&lt;/code&gt; (default 4096 truncates long reports), and "never fabricate figures" in the system prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;bl usage stats --days 7&lt;/code&gt; says the entire evening — 700+ calls — cost pocket change, mostly inside the free tier. The SaaS quote she'd gotten starts at four figures annually.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to do this
&lt;/h2&gt;

&lt;p&gt;Forty reviews? Just read them. Can't write down what "high severity" means? The model can't tag it either. Anything with legal weight? This locates and drafts; a human decides.&lt;/p&gt;

&lt;p&gt;If you've got a text backlog of your own, start with one review and one command: &lt;a href="https://bailian.console.aliyun.com/?source_channel=hh_github" rel="noopener noreferrer"&gt;free tier here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Curious: has anyone wired this kind of tagging loop into a scheduled job with drift monitoring? That's the part I haven't built yet.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>productivity</category>
      <category>datascience</category>
    </item>
    <item>
      <title>I Installed a Pile of Agent Skills. It Still Couldn't Hand Me a File.</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Mon, 10 Aug 2026 01:58:09 +0000</pubDate>
      <link>https://dev.to/zackzhang/i-installed-a-pile-of-agent-skills-it-still-couldnt-hand-me-a-file-o8d</link>
      <guid>https://dev.to/zackzhang/i-installed-a-pile-of-agent-skills-it-still-couldnt-hand-me-a-file-o8d</guid>
      <description>&lt;h2&gt;
  
  
  The moment that made me look at my setup differently
&lt;/h2&gt;

&lt;p&gt;Last week I needed to ship a post. It needed a cover image with the title rendered &lt;em&gt;into&lt;/em&gt; it, plus an audio version for the team channel.&lt;/p&gt;

&lt;p&gt;I asked my agent. It gave me a completely reasonable answer: use a design tool for the image, find a TTS service for the voiceover, here are some options you might like.&lt;/p&gt;

&lt;p&gt;I had a pile of skills installed at that point. It understood my codebase. It matched my writing style. It could not hand me a single file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything I'd installed was on the input side
&lt;/h2&gt;

&lt;p&gt;If you've been watching GitHub trending, you've seen the same wave I have. In the last week of July, three of the top 20 fastest-growing repos were skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;graphify&lt;/strong&gt; — about +4,900 stars that week. Turns your codebase, docs, and PDFs into a queryable knowledge graph. Code parsing runs locally through tree-sitter AST, nothing leaves your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;hallmark&lt;/strong&gt; — about +4,800. Exists purely to strip AI-slop out of design and copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;i-have-adhd&lt;/strong&gt; — about +3,270. Stops the agent from burying the answer under three paragraphs of preamble.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus &lt;strong&gt;find-skills&lt;/strong&gt; sitting north of 60K subscribers, with half the tutorials now opening with "install this one first."&lt;/p&gt;

&lt;p&gt;I lined up what I'd actually installed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;What it handles&lt;/th&gt;
&lt;th&gt;What it produces&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;graphify&lt;/td&gt;
&lt;td&gt;Reads code, docs, PDFs&lt;/td&gt;
&lt;td&gt;Graph data + analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hallmark&lt;/td&gt;
&lt;td&gt;Governs style&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i-have-adhd&lt;/td&gt;
&lt;td&gt;Governs output structure&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;find-skills&lt;/td&gt;
&lt;td&gt;Finds other skills&lt;/td&gt;
&lt;td&gt;A list&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every one either helps the agent &lt;strong&gt;understand&lt;/strong&gt; something, or helps it &lt;strong&gt;say things better&lt;/strong&gt;. Both genuinely useful. Both stop at text.&lt;/p&gt;

&lt;p&gt;The moment you need an artifact — a PNG, an MP3, an MP4, text lifted out of a screenshot — there's nothing in the toolset. The agent recommending external tools isn't a cop-out. It has no output path.&lt;/p&gt;

&lt;p&gt;The ecosystem has been hot for months and the output side is still close to empty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: why some skills never seem to fire
&lt;/h2&gt;

&lt;p&gt;This one bugged me for a while, and the Claude Code docs answer it directly (as of July 2026):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When the agent starts a session, it builds a manifest of every available skill along with its description, then uses the &lt;code&gt;description&lt;/code&gt; field to decide whether any skill matches the request.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two things fall out of that:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;description&lt;/code&gt; is a routing key, not a docstring.&lt;/strong&gt; The agent isn't reading through your skill files inferring intent — it's matching against descriptions. Skills whose descriptions spell out trigger scenarios and keywords get picked far more reliably. If you write your own skills, that field earns more attention than the body.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The manifest is built at session start.&lt;/strong&gt; Anything installed mid-conversation may be invisible for the rest of it. Restart the session after installing — that's not superstition, it's how the manifest works.&lt;/p&gt;

&lt;p&gt;Also worth knowing: Claude Code skills follow the &lt;strong&gt;Agent Skills open standard&lt;/strong&gt;, which applies across multiple AI tools. The mental model transfers when you switch harnesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filling the gap
&lt;/h2&gt;

&lt;p&gt;Alibaba's Model Studio team maintains a skills repo (&lt;code&gt;modelstudioai/skills&lt;/code&gt;, Apache-2.0) covering exactly the output side — image, speech, video, vision — all on top of one CLI called &lt;code&gt;bl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Same install motion you already know:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add modelstudioai/skills
npx skills add modelstudioai/cli &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Node.js 18+, plus an API key (&lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;grab one here&lt;/a&gt;, or read the &lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github&amp;amp;" rel="noopener noreferrer"&gt;CLI install docs&lt;/a&gt;). Restart the session afterward — see above.&lt;/p&gt;

&lt;p&gt;What changes: &lt;strong&gt;you stop memorizing commands.&lt;/strong&gt; You describe the outcome, the agent assembles the call.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cover image with the title rendered in
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl image generate &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Clean technical article cover, dark background, crisp title text centered in frame, smaller subtitle beneath, faint geometric lines and terminal window motifs, flat design, no clutter"&lt;/span&gt; &lt;span class="nt"&gt;--size&lt;/span&gt; 16:9 &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-image-2.0-pro &lt;span class="nt"&gt;--watermark&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="nt"&gt;--out-dir&lt;/span&gt; ./covers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both the title and subtitle landed correctly in the composition, and the terminal motifs showed up as asked. Text is part of the image — no second pass to overlay it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A behavior worth knowing about:&lt;/strong&gt; &lt;code&gt;--size&lt;/code&gt; accepts a ratio (&lt;code&gt;16:9&lt;/code&gt;) or pixels joined by an asterisk (&lt;code&gt;1280*720&lt;/code&gt;). Write it the habitual way as &lt;code&gt;1280x720&lt;/code&gt; and the CLI &lt;strong&gt;does not complain locally&lt;/strong&gt; — run &lt;code&gt;--dry-run --output json&lt;/code&gt; and you'll see &lt;code&gt;"size": "1280x720"&lt;/code&gt; sitting in the request body, forwarded as-is. If you're scripting this, normalize upstream. Also &lt;code&gt;--watermark&lt;/code&gt; defaults to true, so clean output needs it set explicitly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Text to speech
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech synthesize &lt;span class="nt"&gt;--list-voices&lt;/span&gt; &lt;span class="nt"&gt;--model&lt;/span&gt; cosyvoice-v3-flash
bl speech synthesize &lt;span class="nt"&gt;--text-file&lt;/span&gt; ./intro.txt &lt;span class="nt"&gt;--voice&lt;/span&gt; longxiaochun_v3 &lt;span class="nt"&gt;--rate&lt;/span&gt; 0.9 &lt;span class="nt"&gt;--out&lt;/span&gt; ./intro.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can't invent a voice name — run &lt;code&gt;--list-voices&lt;/code&gt; first. The default model returns a couple dozen voices as IDs plus a one-line style note (&lt;code&gt;longxiaochun_v3&lt;/code&gt;, &lt;code&gt;longcheng_v3&lt;/code&gt;, &lt;code&gt;longtian_v3&lt;/code&gt;, …), all bilingual EN/ZH.&lt;/p&gt;

&lt;p&gt;Speech rate is &lt;code&gt;--rate&lt;/code&gt; (0.5–2.0), &lt;strong&gt;not &lt;code&gt;--speed&lt;/code&gt;&lt;/strong&gt; — which is the flag everyone reaches for first, myself included.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reading a screenshot
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl vision describe &lt;span class="nt"&gt;--image&lt;/span&gt; ./error-screenshot.png &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Transcribe the error message and key stack frames verbatim"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command is &lt;code&gt;bl vision describe&lt;/code&gt; — &lt;code&gt;vision&lt;/code&gt; is the group, &lt;code&gt;describe&lt;/code&gt; is the subcommand. Local paths work directly; upload happens inside the command.&lt;/p&gt;

&lt;h3&gt;
  
  
  Video, and one gotcha
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;bl video generate&lt;/code&gt; is async. Pair it with &lt;code&gt;bl video task get&lt;/code&gt; and &lt;code&gt;bl video download --task-id &amp;lt;id&amp;gt; --out &amp;lt;path&amp;gt;&lt;/code&gt;. Note that &lt;code&gt;--poll-interval&lt;/code&gt; defaults differ per command — 5 seconds for &lt;code&gt;video generate&lt;/code&gt;, 15 for &lt;code&gt;video edit&lt;/code&gt; and &lt;code&gt;video ref&lt;/code&gt;. Don't copy one polling value across all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The money part
&lt;/h2&gt;

&lt;p&gt;Output-side calls cost money, and here's the part worth sitting with: &lt;strong&gt;the agent decides how many calls to make.&lt;/strong&gt; Ask for three candidate covers and that's three billable calls. That's a different mental model from text-only skills.&lt;/p&gt;

&lt;p&gt;Set the guardrail before you start playing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl usage freetier &lt;span class="nt"&gt;--all&lt;/span&gt;          &lt;span class="c"&gt;# auto-stop when free quota runs out&lt;/span&gt;
bl usage free &lt;span class="nt"&gt;--expiring&lt;/span&gt; 30      &lt;span class="c"&gt;# console command — run `bl auth login --console` first&lt;/span&gt;
bl usage stats &lt;span class="nt"&gt;--days&lt;/span&gt; 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things to verify rather than assume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free tier is not permanent.&lt;/strong&gt; Validity windows, per-model allocation, and regional eligibility all have specific rules — check the official quota page for your account's region. Third-party "free tier roundup" posts get this wrong often enough that they're not worth trusting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quota does not fail over.&lt;/strong&gt; When one model's allocation is exhausted, nothing routes you to a model that still has budget. You change the model parameter yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Worth it&lt;/strong&gt; if you're already installing skills and regularly need the agent to produce &lt;em&gt;files&lt;/em&gt; — covers, voiceovers, demo clips, text out of screenshots. The flow stays in one place, no shuttling assets between tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skip it&lt;/strong&gt; if your work lives entirely in code and prose. It'll sit unused and still consume manifest context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Different tool&lt;/strong&gt; if you need precise composition control or batch-consistent style — a local ComfyUI node graph wins there, at the cost of a GPU and a workflow to maintain. Not the same problem.&lt;/p&gt;

&lt;p&gt;One genuinely useful side note: that repo also maintains a curated index of third-party skills tracked from Anthropic, Vercel, Google Labs and others, flagged for whether the team actually verified them working, grouped into skill management, code, design, docs, video, and testing. If you're in the hunting phase, that list saves time on its own.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bailian.console.aliyun.com/?source_channel=hh_github" rel="noopener noreferrer"&gt;Console's here&lt;/a&gt; if you want to poke at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;The thing this skill wave makes easy to miss: &lt;strong&gt;an agent's ceiling is the ceiling of the tools in its hands.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;graphify gives it eyes for code structure. hallmark gives it taste. The output side lets it actually hand you the thing. None of them compete — you fill whichever gap is costing you.&lt;/p&gt;

&lt;p&gt;Asking for a cover and a voiceover no longer gets me a list of tool recommendations.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Anyone else run into the "installed but never fires" thing? Curious whether the description-matching explanation matches what you've seen.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I Built the Entire Pre-Production Kit for a Vertical Drama in One Evening — From One Terminal</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Fri, 07 Aug 2026 09:22:39 +0000</pubDate>
      <link>https://dev.to/zackzhang/i-built-the-entire-pre-production-kit-for-a-vertical-drama-in-one-evening-from-one-terminal-345e</link>
      <guid>https://dev.to/zackzhang/i-built-the-entire-pre-production-kit-for-a-vertical-drama-in-one-evening-from-one-terminal-345e</guid>
      <description>&lt;h2&gt;
  
  
  The gig
&lt;/h2&gt;

&lt;p&gt;A friend's three-person studio landed an 80-episode vertical drama (the ReelShort/DramaBox format: 60-second episodes, cliffhanger every minute). The producer wanted a pre-production package for episodes 1-3 in a week: scripts, character look references, shot lists, a narration sample.&lt;/p&gt;

&lt;p&gt;Their workflow was three browser tabs playing relay — chatbot for scripts, image site for character looks, another tool for storyboards — with copy-paste as the integration layer. Episode 4 needs the character bible from episode 1, which lives... somewhere in a chat scroll.&lt;/p&gt;

&lt;p&gt;The reframe: &lt;strong&gt;pre-production is asset production, and assets are files.&lt;/strong&gt; Alibaba Cloud Model Studio's CLI (&lt;code&gt;bl&lt;/code&gt;) runs text, image, and speech models from one terminal, so the whole kit became one folder. Show and tell below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fshort-drama-studio%2Fpipeline-en-1280x720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fshort-drama-studio%2Fpipeline-en-1280x720.png" width="800" alt="One logline, one terminal, every pre-production asset as a file" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; bailian-cli
bl auth login &lt;span class="nt"&gt;--api-key&lt;/span&gt; sk-xxxx
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; drama/ep1-3/&lt;span class="o"&gt;{&lt;/span&gt;script,roles,casting,storyboard,art,audio&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Node 18+. Key from the &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;Model Studio console&lt;/a&gt; — free tier included, &lt;code&gt;bl usage free&lt;/code&gt; shows the balance. Install guide &lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github&amp;amp;" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scripts: genre rules live in the system prompt
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl text chat &lt;span class="nt"&gt;--max-tokens&lt;/span&gt; 8000 &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"You are a vertical short-drama screenwriter. One-minute episodes, every episode ends on a hook. Output per scene: setting, character actions, dialogue, shot suggestion, duration. 3-5 main characters."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Second-chance revenge romance: heroine betrayed and killed by her fiance and best friend, wakes up one month before the engagement. Write episode 1."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; script/ep1.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things I learned the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--max-tokens 8000&lt;/code&gt;&lt;/strong&gt; — the 4096 default truncated the script mid-scene-five&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"every episode ends on a hook" must be explicit&lt;/strong&gt; — otherwise the model paces like prestige TV and vertical-drama viewers swipe away&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The character bible: most valuable file in the repo
&lt;/h2&gt;

&lt;p&gt;Serials die by character drift. Fix: a structured bible that every downstream step references.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl text chat &lt;span class="nt"&gt;--max-tokens&lt;/span&gt; 8000 &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"Extract all main characters. Output a bible per character as JSON: {name, role, age, appearance(hair/face/build/signature outfit — concrete enough to draw), personality_keywords, core_motivation, arc}. Ban vague phrases like 'strikingly beautiful'."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;script/ep1-v2.md&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; roles/roles.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Concrete enough to draw" is the load-bearing clause. Without it: "coldly elegant" → ten runs, ten faces. With it: "long straight black hair, center part, oval face, cream turtleneck under camel coat" → a description that pipes straight into the image prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Look tests: 12 casting references for cents
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl image generate &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Vertical drama heroine look test, 25, long straight black hair center part, oval face, cream turtleneck under camel coat, studio grey backdrop, cinematic lighting, vertical half-body"&lt;/span&gt; &lt;span class="nt"&gt;--size&lt;/span&gt; 3:4 &lt;span class="nt"&gt;--n&lt;/span&gt; 3 &lt;span class="nt"&gt;--seed&lt;/span&gt; 42 &lt;span class="nt"&gt;--out-dir&lt;/span&gt; ./casting &lt;span class="nt"&gt;--out-prefix&lt;/span&gt; heroine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--n 3&lt;/code&gt; per run, &lt;code&gt;--seed 42&lt;/code&gt; so a prompt tweak doesn't reroll the whole vibe. Honest boundary: &lt;strong&gt;generative models don't hold a face across images.&lt;/strong&gt; These are casting references and mood boards, not promo material — we printed that caveat on the deck's cover page and the producer read it as professionalism, not weakness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shot lists, concept frames, art boards
&lt;/h2&gt;

&lt;p&gt;Shot list = text job with the table schema pinned in the system prompt (shot number / type / frame / action / VO / duration / lighting notes) — the director argues with row numbers. The money shot gets a 16:9 concept frame; sets, props, and costumes reuse the same command with different prompts and sizes (16:9 / 1:1 / 3:4). Nine boards in half an hour, each with a concrete downstream user: location scout, props team, wardrobe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Narration sample
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech synthesize &lt;span class="nt"&gt;--list-voices&lt;/span&gt; &lt;span class="nt"&gt;--model&lt;/span&gt; cosyvoice-v3-flash
bl speech synthesize &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"Three years ago she walked away with nothing. Today she is the youngest executive director the group has ever named."&lt;/span&gt; &lt;span class="nt"&gt;--voice&lt;/span&gt; longtian_v3 &lt;span class="nt"&gt;--out&lt;/span&gt; audio/narration-demo.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gotcha from testing: stacking &lt;code&gt;--instruction&lt;/code&gt; on a system voice returns a 428 — pick the style via the voice itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ledger
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fshort-drama-studio%2Fledger-en-1280x720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fshort-drama-studio%2Fledger-en-1280x720.png" width="800" alt="One evening's output: scripts, bibles, look tests, shot lists, boards, narration" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 scripts, 4 bibles, 12 look tests, 3 shot lists, 9 boards, 1 MP3 — one evening, single-digit dollars per &lt;code&gt;bl usage stats --days 7&lt;/code&gt;, mostly free tier. The real win is the shape: &lt;strong&gt;the folder is a Git repo.&lt;/strong&gt; Episode 4 starts with &lt;code&gt;cat roles/roles.json&lt;/code&gt; into the prompt — no drift. Wardrobe change request = edit one bible field, rerun two commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to do this
&lt;/h2&gt;

&lt;p&gt;Funded production's final art pass (a concept artist's work and an AI draft are different products); anything needing face consistency across images; and the script's soul — the model writes competent scaffolding, the 2 a.m. binge factor still comes from a human.&lt;/p&gt;

&lt;p&gt;Pitch package due next week? Start with one episode: &lt;a href="https://bailian.console.aliyun.com/?source_channel=hh_github" rel="noopener noreferrer"&gt;free tier here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Curious: anyone wired script → storyboard regeneration into a Git hook? That's the automation I haven't built yet.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Batch Text Analysis with an LLM CLI: 500 Reviews, One For Loop, a Few Cents</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Thu, 06 Aug 2026 03:11:21 +0000</pubDate>
      <link>https://dev.to/zackzhang/batch-text-analysis-with-an-llm-cli-500-reviews-one-for-loop-a-few-cents-2m45</link>
      <guid>https://dev.to/zackzhang/batch-text-analysis-with-an-llm-cli-500-reviews-one-for-loop-a-few-cents-2m45</guid>
      <description>&lt;p&gt;I tried to get an AI to label 500 Etsy reviews by pasting them into a chat tab, twenty at a time. By batch three, the model had quietly invented a new category that wasn't in my labeling scheme. That's not a model problem — it's a container problem. Long conversations drift; batch work needs rules that don't.&lt;/p&gt;

&lt;p&gt;So I moved the whole job into the terminal. This post is the full walkthrough: sentiment labeling for 500 reviews, a contract risk checklist, an AI-writing check for a thesis chapter, and turning a 2-hour lecture video into Obsidian notes. Total cost for the week: under $0.50.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tool
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;bl&lt;/code&gt; is the CLI for Alibaba Cloud Model Studio. Install with Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; bailian-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get a free API key from the &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;Model Studio console&lt;/a&gt; (new accounts include a free tier), then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pattern: Rules as Files, Input as Files, Output as JSON
&lt;/h2&gt;

&lt;p&gt;The whole approach fits in one sentence: put your labeling rules in a file, feed inputs from files, write structured output to files. Every call gets identical rules — drift is gone by construction.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rule.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a review analyzer. For the input review output JSON: {"sentiment": "positive/negative/neutral", "aspect": [matching items from "quality","shipping","packaging","price","service"], "intent": "praise/complaint/suggestion/question", "summary": "under 10 words"}. Output JSON only.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in &lt;/span&gt;reviews/&lt;span class="k"&gt;*&lt;/span&gt;.txt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;bl text chat &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-turbo &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;rule.txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; json &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"out/&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; .txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;.json"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three deliberate choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--model qwen-turbo&lt;/code&gt;&lt;/strong&gt;: labeling is factory work, not reasoning work. On a 50-sample side-by-side, the budget tier matched the flagship default — at an order of magnitude lower cost. The 500-review batch cost cents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--output json&lt;/code&gt;&lt;/strong&gt;: results feed straight into a spreadsheet or script. (Piped output defaults to JSON anyway.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File-per-review&lt;/strong&gt;: 3 items failed on special characters; retrying meant re-running exactly 3 files, not the batch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sequential run: ~40 minutes. With &lt;code&gt;--concurrent 4&lt;/code&gt;: ~11 minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-text-analysis%2Fpipeline-4steps-en-1280x720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-text-analysis%2Fpipeline-4steps-en-1280x720.png" width="800" alt="Batch text-analysis pipeline: file-per-item input, rules file, concurrent loop, JSON output and aggregation" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The aggregate: 62% of negative sentiment pointed at "shipping," and 17 product suggestions were hiding inside 5-star reviews. My friend had skimmed those reviews for three evenings and come away with vibes; the loop came back with numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contract → Risk Checklist
&lt;/h2&gt;

&lt;p&gt;Same command, different contract (pun intended). The trick is the negative constraint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl text chat &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"You are a contract reviewer. List ONLY clauses that are unfavorable or unusual for the contractor. For each: quote the exact wording, explain the risk, suggest a redline. Skip boilerplate."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;agreement.txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without "skip boilerplate," the model dutifully reviews every standard clause and buries the signal. With it, my 9-page freelance agreement came back as four flagged items — including an IP-assignment clause that kicked in before final payment. Each with exact quotes I could paste into my reply.&lt;/p&gt;

&lt;p&gt;Boundary: this is triage. For real money, the checklist is what you bring &lt;em&gt;to&lt;/em&gt; a lawyer.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI-ness Check for a Thesis
&lt;/h2&gt;

&lt;p&gt;Universities now run AI-content detection on submissions, and my cousin needed a self-check. Honest framing first: &lt;strong&gt;no tool guarantees passing any detector, and AI-detecting-AI has real false positives.&lt;/strong&gt; What works is humbler — locate the most machine-flavored paragraphs and get sentence-level rewrite directions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl text chat &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"Analyze the input for AI-generation markers: mechanical parallel structures, stock transitions, vague claims with no concrete detail. Rate each paragraph High/Medium/Low and give specific humanization suggestions, down to the sentence."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;chapter3.txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two paragraphs came back High — both were AI output she'd barely edited. She rewrote them herself using the suggestions.&lt;/p&gt;

&lt;h2&gt;
  
  
  2-Hour Lecture → Obsidian Notes
&lt;/h2&gt;

&lt;p&gt;Different command, same philosophy. &lt;code&gt;bl vision describe&lt;/code&gt; takes a local video file directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl vision describe &lt;span class="nt"&gt;--video&lt;/span&gt; ./lecture.mp4 &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"This is a course lecture. Output Markdown study notes: chapters in teaching order, each with core arguments, key examples, and any formulas or code. End with a takeaway list. Use Obsidian-compatible syntax."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Minutes later: chaptered notes. I watched 25 minutes of the video instead of 120. Dedicated summarizer tools are more polished (timestamps, browser extensions) but subscription-based; at two videos a month, pay-per-call wins and the note format is whatever my prompt says.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bill
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;bl usage stats --days 7&lt;/code&gt; at the end of the week: everything above, under $0.50, mostly inside the free tier. &lt;code&gt;bl usage free&lt;/code&gt; shows remaining free quota before you fire off a big batch — worth a glance.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use This (and When Not)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-text-analysis%2Fbefore-after-en-1280x720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-text-analysis%2Fbefore-after-en-1280x720.png" width="800" alt="Pasting into chat vs piping through the terminal: 500 reviews, 40 minutes vs 3 evenings" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use it when the work is &lt;strong&gt;high-volume, repetitive, and needs structured output&lt;/strong&gt; — reviews, tickets, surveys, contract triage, lecture backlogs. Skip it if you analyze one text a month (chat tab is fine) or need zero-error output (AI is the triage layer, not the signature).&lt;/p&gt;

&lt;p&gt;If you've got a pile of unread text of your own, the free tier is enough to run everything in this post: &lt;a href="https://bailian.console.aliyun.com/?source_channel=hh_github" rel="noopener noreferrer"&gt;sign up here&lt;/a&gt;, and the distance between "unread" and "read, with a checklist" is one for loop.&lt;/p&gt;

&lt;p&gt;What's the biggest batch-text job you've been putting off? Tell me in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>cli</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Automated My Meeting Minutes, Contract Drafts, and Reports With a CLI — Here's the Whole Setup</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Tue, 04 Aug 2026 03:08:23 +0000</pubDate>
      <link>https://dev.to/zackzhang/i-automated-my-meeting-minutes-contract-drafts-and-reports-with-a-cli-heres-the-whole-setup-47ec</link>
      <guid>https://dev.to/zackzhang/i-automated-my-meeting-minutes-contract-drafts-and-reports-with-a-cli-heres-the-whole-setup-47ec</guid>
      <description>&lt;p&gt;Every Monday I used to lose half a day to paperwork that isn't my actual job: minutes from client calls, yet another statement of work, compressing a six-page memo for my manager, and the delicate "we're going to be late" email.&lt;/p&gt;

&lt;p&gt;Last week I moved all of it into my terminal. This is the full setup — every command included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use a chat tab?
&lt;/h2&gt;

&lt;p&gt;I did, for months. The problem isn't quality, it's &lt;em&gt;repetition&lt;/em&gt;: paste the transcript, re-explain the format, copy the result, times ten files. And the meeting bots (Otter, Fireflies, Fathom — all genuinely good) only cover meetings inside their ecosystems. My phone recordings from on-site interviews? Nobody's job.&lt;/p&gt;

&lt;p&gt;Two properties fix this, and both are terminal-native:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prompts become files&lt;/strong&gt; — my minutes template and contract clause list live in &lt;code&gt;--system&lt;/code&gt; strings I wrote once&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files are first-class inputs&lt;/strong&gt; — recordings, CSVs, parameter sheets go straight into commands; ten inputs is a &lt;code&gt;for&lt;/code&gt; loop&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setup (2 minutes)
&lt;/h2&gt;

&lt;p&gt;Node.js 18+, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; bailian-cli
bl auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI is &lt;code&gt;bl&lt;/code&gt;, Alibaba Cloud Model Studio's command-line tool. &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;Grab a free API key here&lt;/a&gt; — the free tier covered my whole week. Docs on the &lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github&amp;amp;" rel="noopener noreferrer"&gt;Model Studio CLI page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-office-docs%2Fpipeline-office-en-1280x720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-office-docs%2Fpipeline-office-en-1280x720.png" width="800" alt="Office paperwork pipeline: recordings, parameter files and CSVs flow through transcribe and generate commands into minutes, contracts and reports" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Recording → minutes, two commands
&lt;/h2&gt;

&lt;p&gt;Transcribe (local path works, it uploads for you — &lt;code&gt;--diarization&lt;/code&gt; separates speakers, and you &lt;em&gt;want&lt;/em&gt; that for multi-person calls):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech recognize &lt;span class="nt"&gt;--url&lt;/span&gt; workshop-0728.m4a &lt;span class="nt"&gt;--language&lt;/span&gt; en &lt;span class="nt"&gt;--diarization&lt;/span&gt; &lt;span class="nt"&gt;--speaker-count&lt;/span&gt; 4 &lt;span class="nt"&gt;--out&lt;/span&gt; transcript.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate, with the format pinned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl text chat &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"You are a minutes assistant. From the transcript produce formal minutes: attendees, discussion summary by topic, decisions, and action items with owner and due date. Mark anything not present in the transcript as [TBC]. Never invent details."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;transcript.json&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lesson #1: my first run skipped &lt;code&gt;--diarization&lt;/code&gt; and the minutes attributed a decision to the wrong person.&lt;br&gt;
Lesson #2: &lt;em&gt;"Never invent details"&lt;/em&gt; is load-bearing. Without it, the model helpfully fabricated a deadline nobody said out loud. With it, I got an honest &lt;code&gt;[TBC]&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ten contract drafts in one loop
&lt;/h2&gt;

&lt;p&gt;Eighty percent of my SOW never changes. So: one parameter file per client in &lt;code&gt;contracts/&lt;/code&gt;, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in &lt;/span&gt;contracts/&lt;span class="k"&gt;*&lt;/span&gt;.txt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;bl text chat &lt;span class="nt"&gt;--max-tokens&lt;/span&gt; 8000 &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"You are a contract drafting assistant. From the given parameters draft a software development services agreement with these clauses in order: parties, scope of work, timeline and milestones, payment terms, acceptance criteria, intellectual property, confidentiality, maintenance, liability, dispute resolution. Formal register. Output Markdown."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"draft-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="nv"&gt;$f&lt;/span&gt; .txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;.md"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lesson #3: the default 4096-token output cap truncated a long draft mid-liability-clause. &lt;code&gt;--max-tokens 8000&lt;/code&gt; fixed it.&lt;/p&gt;

&lt;p&gt;Obligatory honesty: these are &lt;strong&gt;drafts for legal review, not signable contracts&lt;/strong&gt;. My lawyer adjusted wording in three clauses and shipped it. Reviewing beats writing from scratch — that's the entire win, and it's enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of the pile
&lt;/h2&gt;

&lt;p&gt;Same pattern everywhere — format in &lt;code&gt;--system&lt;/code&gt;, content in &lt;code&gt;--message&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl text chat &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-turbo &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Summarize this memo in under 200 words. You must preserve all deadlines and responsible departments: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;compliance-memo.txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl text chat &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"You are a retail data analyst. Structure: overview, monthly trends, anomalies, actionable recommendations. Every claim must cite specific figures from the data. No unsupported statements."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"12 months of sales data follows: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;sales-2025.csv&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl text chat &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Rewrite this email to be professional, courteous and concise while keeping the meaning. Explain each change and why: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;draft-email.txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lesson #4: summaries go to &lt;code&gt;qwen-turbo&lt;/code&gt; (the cheap tier — fractions of a cent, totally sufficient); contracts and reports stay on the default model. Budget model for volume, better model for precision.&lt;/p&gt;

&lt;p&gt;Lesson #5: &lt;em&gt;"every claim must cite specific figures"&lt;/em&gt; turned the report from fluent filler into an actual analysis — it even flagged the March return-rate spike unprompted.&lt;/p&gt;

&lt;h2&gt;
  
  
  The week's ledger
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-office-docs%2Fbefore-after-en-1280x720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-office-docs%2Fbefore-after-en-1280x720.png" width="800" alt="Before: about six hours of manual paperwork per week. After: about forty minutes through the terminal pipeline" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Minutes from a 90-min recording&lt;/td&gt;
&lt;td&gt;~1.5 h&lt;/td&gt;
&lt;td&gt;~20 min (mostly transcription wait)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ten contract drafts&lt;/td&gt;
&lt;td&gt;Half a day&lt;/td&gt;
&lt;td&gt;Minutes + legal review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summaries / formulas / emails&lt;/td&gt;
&lt;td&gt;10–30 min each&lt;/td&gt;
&lt;td&gt;1–2 min each&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Spend check (one-time &lt;code&gt;bl auth login --console&lt;/code&gt; needed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl usage free &lt;span class="nt"&gt;--sort&lt;/span&gt; remaining
bl usage stats &lt;span class="nt"&gt;--days&lt;/span&gt; 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;~40 text calls, mostly inside the free tier. Coffee money at list rates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest scorecard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Great for&lt;/strong&gt;: recurring paperwork — SOWs, minutes, monthly reports. The prompt files compound; they're assets, not chats.&lt;br&gt;
&lt;strong&gt;Skip it if&lt;/strong&gt;: you draft two contracts a year and live entirely inside Zoom's ecosystem. The built-in bots are your shorter path.&lt;br&gt;
&lt;strong&gt;Never its job&lt;/strong&gt;: legal judgment, final responsibility for numbers. It converts "write from scratch" into "review and edit" — accountability stays human.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bailian.console.aliyun.com/?source_channel=hh_github" rel="noopener noreferrer"&gt;Free tier is here&lt;/a&gt; if you want to try. Start with whichever task annoys you most — mine was Monday's minutes.&lt;/p&gt;

&lt;p&gt;What's the paperwork task you'd automate first? Curious what other people's worst offenders are. 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>cli</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Moved My Launch Copy Workflow into the Terminal (One Brief, One Loop, Every Platform)</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Fri, 31 Jul 2026 05:50:24 +0000</pubDate>
      <link>https://dev.to/zackzhang/i-moved-my-launch-copy-workflow-into-the-terminal-one-brief-one-loop-every-platform-44gj</link>
      <guid>https://dev.to/zackzhang/i-moved-my-launch-copy-workflow-into-the-terminal-one-brief-one-loop-every-platform-44gj</guid>
      <description>&lt;p&gt;I shipped a side project last month, and the code was honestly the easy part. What ate my week was the launch copy: a Product Hunt tagline, an X thread, a LinkedIn post, a Reddit post that wouldn't read like an ad, plus a stack of SEO articles. Same product — five completely different voices.&lt;/p&gt;

&lt;p&gt;Here's the workflow I ended up with: every platform voice is a &lt;code&gt;.txt&lt;/code&gt; file, the product brief is another file, and one loop command generates the whole matrix in ~30 seconds. Honest breakdown below, including where it falls short.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with the chat-tab workflow
&lt;/h2&gt;

&lt;p&gt;My first approach was the obvious one: a chat tab, one piece at a time. It broke down in three ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Voice drift&lt;/strong&gt; — thread #5 didn't sound like thread #1, because I phrased my request slightly differently each time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaporating prompts&lt;/strong&gt; — the "Reddit voice" I tuned last week was gone with the session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy-paste tax&lt;/strong&gt; — at volume, the mechanical work became the actual job&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The root cause isn't the model. It's that a chat session is &lt;em&gt;volatile storage&lt;/em&gt;, and platform voice is something you want &lt;em&gt;persisted&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Voices as files, generation as a loop
&lt;/h2&gt;

&lt;p&gt;The tool is &lt;code&gt;bl&lt;/code&gt;, the CLI for Alibaba Cloud Model Studio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; bailian-cli
bl auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Node 18+. You'll need an API key — &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;free to grab here&lt;/a&gt;, and the free tier covers everything in this post.)&lt;/p&gt;

&lt;p&gt;The structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;launch-copy/
├── brief.md            # product brief: value props, audience, pricing
├── voices/
│   ├── ph.txt          # Product Hunt: tagline + maker comment, banned hype words
│   ├── x-thread.txt    # X: 6-tweet thread, hook first
│   ├── linkedin.txt    # story-driven, no emoji walls
│   ├── reddit.txt      # plain text, zero marketing speak
│   └── seo.txt         # 800-word keyword article
└── out/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in &lt;/span&gt;voices/&lt;span class="k"&gt;*&lt;/span&gt;.txt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;bl text chat &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;brief.md&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"out/&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; .txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;.md"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--system&lt;/code&gt; carries the voice, &lt;code&gt;--message&lt;/code&gt; carries the brief. Both read from files, output lands in &lt;code&gt;out/&lt;/code&gt;. That's the entire architecture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-copywriting%2Fpipeline-3layers-en-1280x720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-copywriting%2Fpipeline-3layers-en-1280x720.png" width="800" alt="Copy pipeline in the terminal: brief and voice files through one loop into per-platform drafts" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three lessons from a month of real use
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Lock the output format inside the voice file.&lt;/strong&gt; My first Product Hunt draft came back with "revolutionary" in it. I added &lt;code&gt;banned words: revolutionary, game-changing, disrupt&lt;/code&gt; to &lt;code&gt;ph.txt&lt;/code&gt; — clean ever since. Fix it once in the file, and it stays fixed. That's the fundamental win over chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Temperature is a per-genre dial.&lt;/strong&gt; Taglines at default settings were dead ("Learn smarter"). At &lt;code&gt;--temperature 1.2&lt;/code&gt; I got shortlist-worthy lines; at 1.8 it drifted off-product. Press releases went the other way: &lt;code&gt;--temperature 0.3&lt;/code&gt; gave me identical structure across three runs. You can't touch this dial in most chat UIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Split models by stakes.&lt;/strong&gt; SEO volume work runs on the budget tier (&lt;code&gt;--model qwen-turbo --max-tokens 1500&lt;/code&gt;) — a fraction of a cent per 800-word article. Front-facing copy (taglines, the launch thread) stays on the default flagship model. One flag, an order of magnitude in cost.&lt;/p&gt;

&lt;p&gt;Bonus: covers without leaving the terminal —&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl image generate &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Cozy desk scene, warm lamp light, open notebook next to a phone showing a study app, flat illustration, warm colors"&lt;/span&gt; &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-image-2.0-pro &lt;span class="nt"&gt;--size&lt;/span&gt; 3:4 &lt;span class="nt"&gt;--n&lt;/span&gt; 2 &lt;span class="nt"&gt;--out-dir&lt;/span&gt; ./covers/ &lt;span class="nt"&gt;--watermark&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;Full launch run: ~60 text calls + 4 images.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-copywriting%2Fbefore-after-en-1280x720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fai-copywriting%2Fbefore-after-en-1280x720.png" width="800" alt="Before: ~40 min per launch set in chat tabs. After: 30 seconds per set in the terminal" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl usage free
bl usage stats &lt;span class="nt"&gt;--days&lt;/span&gt; 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most of it fit in the free tier. Priced at list rates, the entire token bill wouldn't buy a coffee — versus $39-49/month per seat for the usual copy SaaS. And retries become psychologically free: tweaking one word in a voice file and re-running costs fractions of a cent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn't do
&lt;/h2&gt;

&lt;p&gt;Honesty section. The output is &lt;strong&gt;draft tier, not publish tier&lt;/strong&gt; — fact-checking and de-AI-flavoring stay human (my routine: batch in the terminal, polish the keepers in a chat window or by hand). If you write two pieces a week, a chat tab is genuinely more comfortable. And picking the winning tagline out of ten candidates is still your job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Start small: install the CLI (&lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github&amp;amp;" rel="noopener noreferrer"&gt;docs&lt;/a&gt;), and save your single best-tuned platform voice as your first &lt;code&gt;.txt&lt;/code&gt; file. The moment that file exists, your copy workflow starts compounding.&lt;/p&gt;

&lt;p&gt;What does your launch-copy workflow look like — chat tabs, workflow platforms, or something scripted? Would love to compare notes in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>cli</category>
      <category>indiehackers</category>
    </item>
    <item>
      <title>Your best AI agent lives in a console you don't own. I moved mine into Git.</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Fri, 31 Jul 2026 02:22:05 +0000</pubDate>
      <link>https://dev.to/zackzhang/your-best-ai-agent-lives-in-a-console-you-dont-own-i-moved-mine-into-git-2b88</link>
      <guid>https://dev.to/zackzhang/your-best-ai-agent-lives-in-a-console-you-dont-own-i-moved-mine-into-git-2b88</guid>
      <description>&lt;p&gt;Quick show and tell. Last month I realized something uncomfortable about my most-used AI agent: I couldn't take it anywhere.&lt;/p&gt;

&lt;p&gt;It's a research agent I'd tuned for weeks — a dozen prompt iterations, two skills, an MCP data source, knowledge files, hand-picked tool permissions. All of that lives as scattered console pages on one cloud platform, under one account. If I switch accounts or platforms, I walk away with screenshots.&lt;/p&gt;

&lt;p&gt;We'd never accept this for code (Git), dependencies (lockfiles), or infra (Terraform). So why accept it for agents?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fopenagentpack%2Fconsole-vs-git-en.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fopenagentpack%2Fconsole-vs-git-en.png" width="800" alt="Config scattered across consoles vs one declaration managed in Git" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I tried
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/modelstudioai/OpenAgentPack" rel="noopener noreferrer"&gt;OpenAgentPack&lt;/a&gt; — open source (Apache-2.0, beta). One &lt;code&gt;agents.yaml&lt;/code&gt; declares the whole agent stack; a Terraform-style workflow pushes it to the cloud.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @openagentpack/cli   &lt;span class="c"&gt;# Node.js 22+&lt;/span&gt;

&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-agents &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;my-agents
agents init          &lt;span class="c"&gt;# wizard writes a starter agents.yaml&lt;/span&gt;
agents validate      &lt;span class="c"&gt;# offline check, zero API calls&lt;/span&gt;
agents plan          &lt;span class="c"&gt;# preview create / update / delete&lt;/span&gt;
agents apply &lt;span class="nt"&gt;-y&lt;/span&gt;      &lt;span class="c"&gt;# execute in dependency order&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's a full run:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fopenagentpack%2Fplan-apply-demo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fopenagentpack%2Fplan-apply-demo.gif" width="759" alt="agents plan to apply, terminal recording" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The declaration covers model, instructions, tools, skills, MCP servers, environments, and credential &lt;em&gt;references&lt;/em&gt; — secrets stay in &lt;code&gt;.env&lt;/code&gt; as &lt;code&gt;${VAR_NAME}&lt;/code&gt;, never in the file. So the YAML commits cleanly to Git.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;assistant&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;General-purpose&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;coding&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;assistant"&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;qwen3.7-max&lt;/span&gt;
    &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;You are a coding assistant.&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dev&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;builtin&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;bash&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;read&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;glob&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;grep&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Three things that sold me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;plan&lt;/code&gt; is a real three-way diff.&lt;/strong&gt; It reconciles your declared config, a local state file (remote IDs + content hashes), and what actually exists remotely. Change one field → one update in the plan. Someone hand-edits the console → flagged as drift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. My first mistake got caught offline.&lt;/strong&gt; &lt;code&gt;validate&lt;/code&gt; stopped an indentation slip before a single API call went out. Fail-fast where it's cheap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Acceptance testing is built in.&lt;/strong&gt; &lt;code&gt;agents playground&lt;/code&gt; spins up a local WebUI and runs &lt;em&gt;real&lt;/em&gt; sessions from the same declaration. I re-ran my standard research task after migrating and compared outputs against the old setup. Same structure, same rigor. You can also flip &lt;code&gt;--provider&lt;/code&gt; (bailian / qoder / ark / claude) and benchmark the same scenario across backends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It's &lt;strong&gt;beta&lt;/strong&gt; — the schema may change before 1.0. I've only moved test agents so far.&lt;/li&gt;
&lt;li&gt;Provider parity is explicitly &lt;em&gt;not&lt;/em&gt; promised: every capability is labeled &lt;code&gt;native&lt;/code&gt; / &lt;code&gt;emulated&lt;/code&gt; / &lt;code&gt;unsupported&lt;/code&gt; per provider. Read that matrix before you migrate anything real.&lt;/li&gt;
&lt;li&gt;State is a local file today; team-level state sharing is on you (early-Terraform vibes).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I think this matters
&lt;/h2&gt;

&lt;p&gt;"Agents as code" feels like where "infrastructure as code" was a decade ago: obvious in hindsight, awkward to live without once you've tried it. Your prompts, workflows, and judgment deserve a form you actually own.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/modelstudioai/OpenAgentPack" rel="noopener noreferrer"&gt;github.com/modelstudioai/OpenAgentPack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trying the Bailian provider? You'll need a &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;DASHSCOPE_API_KEY&lt;/a&gt; — free to create on &lt;a href="https://bailian.console.aliyun.com/?source_channel=hh_github" rel="noopener noreferrer"&gt;Alibaba Cloud Model Studio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Curious if anyone else is versioning their agents — what's your setup?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Browsing LLM Provider Docs — Install Them Into Your Agent Instead</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Wed, 29 Jul 2026 09:59:57 +0000</pubDate>
      <link>https://dev.to/zackzhang/stop-browsing-llm-provider-docs-install-them-into-your-agent-instead-3m5</link>
      <guid>https://dev.to/zackzhang/stop-browsing-llm-provider-docs-install-them-into-your-agent-instead-3m5</guid>
      <description>&lt;p&gt;I run a few side projects on LLM APIs, and the most annoying part of my week isn't debugging — it's &lt;strong&gt;looking things up&lt;/strong&gt;. Pricing tiers split across input/output/thinking tokens. Rate limits buried three levels deep. Sample code that never matches the exact model I'm using. Four different portals (docs, console, model catalog, API reference) with four different layouts.&lt;/p&gt;

&lt;p&gt;And none of that navigation muscle memory transfers between providers. Every platform organizes things differently, and they all ship new models and price changes every few weeks.&lt;/p&gt;

&lt;p&gt;Here's the setup that made me stop browsing entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern: local docs, agent reads them
&lt;/h2&gt;

&lt;p&gt;If you've used Context7, you know the idea — inject current docs into your AI assistant's context instead of letting it hallucinate from stale training data. That solves the &lt;strong&gt;open-source library&lt;/strong&gt; side. But pricing, rate limits, and parameter schemas for a model &lt;em&gt;platform&lt;/em&gt; don't live in any repo an MCP can pull.&lt;/p&gt;

&lt;p&gt;Alibaba Cloud's Model Studio team shipped an Agent Skill applying the same idea to their platform: &lt;strong&gt;bailian-docs-llm-wiki&lt;/strong&gt;. One install, and the platform's full documentation plus a structured snapshot of the model catalog become local files your agent reads directly.&lt;/p&gt;

&lt;p&gt;Three layers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Used for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;models/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Structured catalog data, pulled from the console gateway API&lt;/td&gt;
&lt;td&gt;Pricing, rate limits, context windows, sample code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wiki/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Synthesized concept/comparison pages&lt;/td&gt;
&lt;td&gt;Concepts, architecture choices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;raw/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Original official docs&lt;/td&gt;
&lt;td&gt;API details, error codes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fdocs-wiki%2Fthree-layers-en-1280x720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fdocs-wiki%2Fthree-layers-en-1280x720.png" width="750" alt="Three-layer local knowledge base with conflict precedence" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;models/&lt;/code&gt; layer is the differentiator: it's not scraped HTML — it's the same data endpoint that powers the catalog UI. QPM limits, tiered prices, parameter definitions, and official sample code are all structured fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add modelstudioai/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Node.js ≥ 18. Pick &lt;code&gt;bailian-docs-llm-wiki&lt;/code&gt; at the prompt — zero config after that; questions touching the platform's docs, models, or pricing activate it automatically. Works in Claude Code, Qwen Code, Cursor — anything that supports Agent Skills. Queries read local files, so they cost nothing and need no API key. You'll want a key once you actually run models (free tier for new accounts): &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;get an API key&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it replaces, chore by chore
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pricing and rate limits.&lt;/strong&gt; Ask &lt;em&gt;"What does qwen3-max cost for input and output? What's the rate limit?"&lt;/em&gt; — tiered prices, QPM, and context window come back together, with the source file path cited. I checked the file the first time. Numbers matched.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fdocs-wiki%2Fbefore-after-en-1280x720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwan27.oss-cn-beijing.aliyuncs.com%2Fbailian_cli_operation%2Fdocs-wiki%2Fbefore-after-en-1280x720.png" width="750" alt="Five levels of portal clicks vs one question" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-family model filtering.&lt;/strong&gt; &lt;em&gt;"Which models support function calling with 128K+ context?"&lt;/em&gt; — the catalog UI can't filter like that; the skill greps &lt;code&gt;models.jsonl&lt;/code&gt;, one model per line, exact field matching. The inverse question is the one I actually ask most — most of us route easy jobs to cheap models and save expensive ones for hard problems: &lt;em&gt;"which budget model is good enough for this batch classification job?"&lt;/em&gt; Price is just another field to filter on. Terminal users can skip the agent entirely (examples from the skill's own docs):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'select(.contextWindow&amp;gt;=1000000)'&lt;/span&gt; models.jsonl
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'"function-calling"'&lt;/span&gt; models.jsonl | jq &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'{model,family,contextWindow}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sample code and parameters, in-editor.&lt;/strong&gt; The &lt;code&gt;samples&lt;/code&gt; field carries official examples in curl/Python/Node.js/Java; &lt;code&gt;predictConfig&lt;/code&gt; carries parameter names, defaults, and ranges aligned with the platform playground. Ask in your coding agent, paste, adjust — and have the agent run the sample right there to verify before wiring it into your project. The whole loop stays inside the editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error codes and concepts.&lt;/strong&gt; Error codes get grepped from the raw official docs locally — no more fighting a docs site's search box. Concept questions ("RAG options on this platform?") hit pre-synthesized comparison pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Catching up on updates.&lt;/strong&gt; When I hear a new model dropped, I re-run the install command to refresh the snapshot, then ask &lt;em&gt;"what's new in the model list?"&lt;/em&gt; Note the boundary: it's a &lt;strong&gt;snapshot you refresh&lt;/strong&gt;, not a push subscription. For me that's the right trade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it doesn't make things up
&lt;/h2&gt;

&lt;p&gt;Three constraints baked into the skill's rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Answers must come from actual local files — no filling gaps from model memory for APIs, params, error codes, or prices.&lt;/li&gt;
&lt;li&gt;Every answer cites a file path you can open and verify.&lt;/li&gt;
&lt;li&gt;Conflict precedence: &lt;code&gt;models/&lt;/code&gt; (gateway data) &amp;gt; &lt;code&gt;raw/&lt;/code&gt; (official docs) &amp;gt; &lt;code&gt;wiki/&lt;/code&gt; (synthesized). Low-quality synthesized pages get bypassed automatically.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Not zero hallucination risk — but "verifiable by opening a file" beats "I think I found the right page."&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest scope
&lt;/h2&gt;

&lt;p&gt;Built for people working with Alibaba Cloud Model Studio or evaluating Qwen models. If your stack lives entirely on other providers, the skill deliberately refuses out-of-scope questions rather than improvising — correct behavior, but it won't help you there. Free tier if you want to poke at it: &lt;a href="https://bailian.console.aliyun.com/?source_channel=hh_github" rel="noopener noreferrer"&gt;sign up&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What's your approach to keeping provider docs in your agent's context — Context7, llms.txt, something homegrown? Would love to compare notes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>agentskills</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Ran My Whole Audio Workflow From the Terminal for a Week</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Mon, 27 Jul 2026 07:53:02 +0000</pubDate>
      <link>https://dev.to/zackzhang/i-ran-my-whole-audio-workflow-from-the-terminal-for-a-week-39ek</link>
      <guid>https://dev.to/zackzhang/i-ran-my-whole-audio-workflow-from-the-terminal-for-a-week-39ek</guid>
      <description>&lt;p&gt;My audio workflow used to look like this: draft a script in ChatGPT, paste it into a TTS website, download the MP3, upload a meeting recording to a transcription tool, copy the transcript into a translator, download again. Five tabs, three accounts, the same file uploaded three times.&lt;/p&gt;

&lt;p&gt;Gemini Notebook (the renamed NotebookLM, now 50+ languages) removes all of that — but it also removes the knobs. You can't pick the voice, can't shape the tone, can't chain the output into the next step. ElevenLabs synthesizes beautifully, Otter.ai transcribes live meetings, Descript edits podcasts — each excellent, each a silo.&lt;/p&gt;

&lt;p&gt;So I spent a week doing the same tasks through one CLI instead. Here's what I ran and what came back.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/modelstudioai" rel="noopener noreferrer"&gt;
        modelstudioai
      &lt;/a&gt; / &lt;a href="https://github.com/modelstudioai/cli" rel="noopener noreferrer"&gt;
        cli
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Official Model Studio CLI（阿里云百炼 CLI）built for AI Agent frameworks, exposing models, search, multimodal, and workflow capabilities as structured tool calls.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/450c8513dcb1d20730dc0736cf96e2e481846e336efed5b5eebaa2d4dcf83d5b/68747470733a2f2f696d672e616c6963646e2e636f6d2f696d6765787472612f69312f4f31434e30316b47674f337a314e33304f494e67556f475f2121363030303030303030313531332d322d7470732d313931352d3832312e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/450c8513dcb1d20730dc0736cf96e2e481846e336efed5b5eebaa2d4dcf83d5b/68747470733a2f2f696d672e616c6963646e2e636f6d2f696d6765787472612f69312f4f31434e30316b47674f337a314e33304f494e67556f475f2121363030303030303030313531332d322d7470732d313931352d3832312e706e67" alt="Aliyun Model Studio CLI"&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;The official command-line interface for Aliyun Model Studio (DashScope) AI Platform&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/bailian-cli" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2128764d677f47a236abd78215e6d80fd004012030897e94567ec65b87e287ca/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6261696c69616e2d636c693f636f6c6f723d303936396461266c6162656c3d6e706d" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/06d1b03fde64345a922186d51e0faf59f6840b9afd7567e2bf1a0ec8e10ed586/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f64652d25334525334431382e31372d627269676874677265656e" alt="Node.js"&gt;&lt;/a&gt;
&lt;a href="https://www.typescriptlang.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e244253e0e787de9b97bd2b32bfa9d5f7e518539dabe25615db1e955cc9a0cde/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d7374726963742d333137386336" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a href="https://github.com/modelstudioai/cli/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/39a434c39c97856247fc55ebc90e8cc1cb9871558a37bf1bf83cbaca3be89d69/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c7565" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github&amp;amp;" rel="nofollow noopener noreferrer"&gt;Aliyun Model Studio CLI Site&lt;/a&gt; · &lt;a href="https://github.com/modelstudioai/cli/blob/main/README.zh.md" rel="noopener noreferrer"&gt;中文文档&lt;/a&gt; · &lt;a href="https://help.aliyun.com/zh/model-studio/" rel="nofollow noopener noreferrer"&gt;API Documentation&lt;/a&gt; · &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="nofollow noopener noreferrer"&gt;Get API Key&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chat with Qwen, generate images &amp;amp; videos, understand images, call agents,&lt;/em&gt;
&lt;em&gt;manage memory, search the web — all from your terminal.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Built for AI Agents. Every command works as a structured tool call.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Equip your AI Agent out-of-the-box with these capabilities, composable across complex tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text chat&lt;/strong&gt; — Qwen3.7-max: major gains in agentic coding, frontend coding, and vibe coding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal (Omni)&lt;/strong&gt; — Full omni-modal support across text + image + audio + video&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image generation &amp;amp; editing&lt;/strong&gt; — Qwen-Image 2.0: pro text rendering, photorealism, strong semantic adherence, multi-image composition&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video generation &amp;amp; editing&lt;/strong&gt; — happyhorse-1.1 series: text-/image-/reference-to-video and natural-language video editing (up to 9-image reference)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speech synthesis &amp;amp; recognition&lt;/strong&gt; — CosyVoice streaming TTS, voice cloning from 5–20s samples; FunAudio-ASR covers 30 languages including 7…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/modelstudioai/cli" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Setup (2 minutes, actually)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github" rel="noopener noreferrer"&gt;Bailian CLI&lt;/a&gt; is Alibaba Cloud's Model Studio CLI. Its &lt;code&gt;bl speech&lt;/code&gt; subcommand covers TTS (CosyVoice model), ASR (Paraformer model), and speech translation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; bailian-cli
bl auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grab a free API key from the &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;console&lt;/a&gt; — the free tier covered everything below. Verify with &lt;code&gt;bl --version&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1: Can It Do Comedy?
&lt;/h2&gt;

&lt;p&gt;I started with the hardest TTS test I could think of — delivery, not just pronunciation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech tts &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"Let me tell you about the daily life of a programmer. Stand-up meetings, Jira tickets, and the eternal question: who broke the build this time?"&lt;/span&gt; &lt;span class="nt"&gt;--voice&lt;/span&gt; humorous &lt;span class="nt"&gt;--format&lt;/span&gt; mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First I ran it with a neutral voice, and the punchline landed like a weather report. With &lt;code&gt;--voice humorous&lt;/code&gt;, the output had an actual beat before "who broke the build this time?" and a tonal lift on the question. I also noticed the em dash in my text produced a longer pause than a comma — punctuation is a timing control, which I did not expect.&lt;/p&gt;

&lt;p&gt;Not open-mic-ready. Completely fine for a podcast cold open.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 2: Audiobook Voice, Ad Voice, Kid Voice
&lt;/h2&gt;

&lt;p&gt;Same command, different &lt;code&gt;--voice&lt;/code&gt;, wildly different output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gentle&lt;/strong&gt;, for prose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech tts &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"It was an autumn evening. The setting sun painted the sky in shades of amber."&lt;/span&gt; &lt;span class="nt"&gt;--voice&lt;/span&gt; gentle &lt;span class="nt"&gt;--format&lt;/span&gt; mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Slow, warm, measured. One gotcha: I first fed it a long run-on sentence and the voice rushed through without breathing. Splitting into shorter sentences brought the pauses back. Speechify and Audible's AI narration do this well in a web UI; the CLI version becomes interesting when you loop it over 50 chapter files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Energetic&lt;/strong&gt;, for ad copy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech tts &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"Black Friday Mega Sale! Everything 50% off — limited time only!"&lt;/span&gt; &lt;span class="nt"&gt;--voice&lt;/span&gt; energetic &lt;span class="nt"&gt;--format&lt;/span&gt; mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"50% off" came out as a natural "fifty percent off," not digit-by-digit. My first draft had no exclamation marks and sounded flat even in this style — write the copy the way you want it shouted. Brand-critical campaign? Book a studio. A/B-testing ten versions of promo copy? This is a for-loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Childlike&lt;/strong&gt;, for a story:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech tts &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"Once upon a time, in a big forest, there lived a little rabbit. Every morning, it would look up at the sun and say: Good morning, Mr. Sun!"&lt;/span&gt; &lt;span class="nt"&gt;--voice&lt;/span&gt; childlike &lt;span class="nt"&gt;--format&lt;/span&gt; mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I tried &lt;code&gt;gentle&lt;/code&gt; first — came out as a bedtime narrator, not a character. &lt;code&gt;childlike&lt;/code&gt; brightened it into a proper storybook rabbit. Won't fool anyone into hearing a real kid, but for a prototype where each character is just a different flag in a script, it works. Production audiobooks still want the actor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 3: Podcast Intro and a Quote Clip
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech tts &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"Hey everyone, welcome to Tech Discovery. I'm your host, and today we're diving into how AI is changing everyday life."&lt;/span&gt; &lt;span class="nt"&gt;--voice&lt;/span&gt; podcast-host &lt;span class="nt"&gt;--format&lt;/span&gt; mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Greeting energy up front, conversational settle by sentence two. Keeping the script under ~40 words kept the pacing tight; my longer clause-heavy draft dragged in the middle. This is the Gemini Notebook scenario with the opposite trade: it gives you a polished episode with zero decisions, this gives you building blocks with all the decisions.&lt;/p&gt;

&lt;p&gt;Quote clip for social:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech tts &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"The real innovation isn't in the model — it's in how we orchestrate it."&lt;/span&gt; &lt;span class="nt"&gt;--voice&lt;/span&gt; authoritative &lt;span class="nt"&gt;--format&lt;/span&gt; mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Works under ~20 words. I tried a 40-word excerpt and the gravitas turned into a lecture. The voice amplifies a strong line; it can't rescue a weak one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 4: The Meeting Recording
&lt;/h2&gt;

&lt;p&gt;An hour-long call, four people, and somebody has to write the minutes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech asr &lt;span class="nt"&gt;--input&lt;/span&gt; meeting.mp3 &lt;span class="nt"&gt;--speaker-diarization&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; transcript.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What came back, structurally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Speaker 1] Priority this week is closing out the export feature; staging updates this afternoon.
[Speaker 2] I'll take the docs — first draft by Thursday.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things I had to learn the hard way. Without &lt;code&gt;--speaker-diarization&lt;/code&gt;, the transcript is one undifferentiated wall of text — the flag gets you Speaker 1 / Speaker 2 labels, and suddenly who-owns-what reads right off the file. And the punctuation restoration surprised me: the ums and filler got broken into readable sentences, so the output is markdown you can actually read. The minutes themselves are step two — I hand &lt;code&gt;transcript.md&lt;/code&gt; to a chat model and ask for the summary, decisions, and action items with owners; since the input is already clean and speaker-labeled, that's a one-liner in the same script. Crosstalk segments come back rough, so I skim important minutes against the recording. Otter.ai still owns the live-during-the-meeting case — this only processes recordings after the fact. But the output is a file, and files pipe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 5: Chapters for Show Notes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech asr &lt;span class="nt"&gt;--input&lt;/span&gt; lecture.mp3 &lt;span class="nt"&gt;--output&lt;/span&gt; chapters.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What came back is a timestamped chapter structure — &lt;code&gt;## 00:21:45 From tools to workflows&lt;/code&gt; — accurate to the sentence, so finding a topic no longer means scrubbing the progress bar. Two manual touches before shipping: the occasional boundary lands mid-thought where two topics blend, so I nudged a couple of cut points, and the auto titles read like plain summaries — I rewrote them with hooks for the show notes. Clean topic transitions produce clean boundaries; a meandering speaker produces a draft you'll adjust. Still beats scrubbing an hour of audio by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 6: Translation, and My One Real Mistake
&lt;/h2&gt;

&lt;p&gt;Chinese voice memo → English audio for a collaborator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech translate &lt;span class="nt"&gt;--input&lt;/span&gt; voice-memo.wav &lt;span class="nt"&gt;--source&lt;/span&gt; zh &lt;span class="nt"&gt;--target&lt;/span&gt; en &lt;span class="nt"&gt;--output&lt;/span&gt; translated.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two artifacts out: translated text + synthesized English audio. Names, dates, requests all survived. Idioms went literal — anything legal or public-facing still needs a human pass.&lt;/p&gt;

&lt;p&gt;The mistake came with a bilingual interview. I ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech translate &lt;span class="nt"&gt;--input&lt;/span&gt; interview.mp3 &lt;span class="nt"&gt;--source&lt;/span&gt; zh &lt;span class="nt"&gt;--target&lt;/span&gt; en &lt;span class="nt"&gt;--output&lt;/span&gt; transcript_en.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The English segments came back mangled — I'd forced everything through one language assumption. The fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech translate &lt;span class="nt"&gt;--input&lt;/span&gt; interview.mp3 &lt;span class="nt"&gt;--source&lt;/span&gt; auto &lt;span class="nt"&gt;--target&lt;/span&gt; en &lt;span class="nt"&gt;--output&lt;/span&gt; transcript_en.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--source auto&lt;/code&gt; detects the language per segment, and the transcript cleaned right up. Mid-sentence language switches still come out with rough edges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 7: Chaining It
&lt;/h2&gt;

&lt;p&gt;Every &lt;code&gt;bl&lt;/code&gt; call is an independent process — no session, no memory, you re-specify the voice each time. Annoying interactively; exactly right in a script, because nothing hidden influences the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl speech translate &lt;span class="nt"&gt;--input&lt;/span&gt; meeting.mp3 &lt;span class="nt"&gt;--source&lt;/span&gt; auto &lt;span class="nt"&gt;--target&lt;/span&gt; en &lt;span class="nt"&gt;--output&lt;/span&gt; transcript_en.md
bl speech asr &lt;span class="nt"&gt;--input&lt;/span&gt; meeting.mp3 &lt;span class="nt"&gt;--speaker-diarization&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; transcript.md
&lt;span class="c"&gt;# distill transcript.md into summary.txt (chat-model pass or manual pick), then:&lt;/span&gt;
bl speech tts &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;summary.txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--voice&lt;/span&gt; podcast-host &lt;span class="nt"&gt;--format&lt;/span&gt; mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recording in, narrated English brief out. Each stage debuggable in isolation. That week of experiments cost about a dollar total — per Bailian's official pricing (July 2026), TTS runs ~¥0.034 (≈ half a US cent) per minute of audio, ASR ~¥3.5 (≈ $0.50) per hour, speech translation ~¥0.5 (≈ $0.07) per minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Would I Keep Using It?
&lt;/h2&gt;

&lt;p&gt;For the weekly grind — batch voiceovers, recorded meetings, bilingual interviews — yes; the file-shuttling between tabs is gone and the whole flow lives in a script I can rerun. For live meeting transcription I'd still open Otter.ai, for voice cloning or exact tonal work it's ElevenLabs or an actor, and if you touch audio once a month, a web tool with a preview button is simply less friction than a terminal.&lt;/p&gt;

&lt;p&gt;Start here: &lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github" rel="noopener noreferrer"&gt;install the CLI&lt;/a&gt;, get an &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;API key&lt;/a&gt;, run one &lt;code&gt;bl speech tts&lt;/code&gt;. The &lt;a href="https://bailian.console.aliyun.com/?source_channel=hh_github" rel="noopener noreferrer"&gt;console&lt;/a&gt; shows what else the platform does.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What about you?&lt;/strong&gt; Have you tried chaining audio tasks — TTS, transcription, translation — in a single scripted workflow? Team dedicated-tool or team pipeline? Drop your setup below.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;All scenarios are based on real prompts. Command syntax reflects the current CLI version — check the &lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github" rel="noopener noreferrer"&gt;official docs&lt;/a&gt; for updates.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>10 AI Glasses Scenarios I Tested With Just a Terminal</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Mon, 27 Jul 2026 07:50:00 +0000</pubDate>
      <link>https://dev.to/zackzhang/10-ai-glasses-scenarios-i-tested-with-just-a-terminal-1c1i</link>
      <guid>https://dev.to/zackzhang/10-ai-glasses-scenarios-i-tested-with-just-a-terminal-1c1i</guid>
      <description>&lt;p&gt;WAIC 2026 wrapped up in Shanghai last week. Every booth had hardware — AI glasses, brain-wave sleep devices, conversational labs. Specs everywhere: weight, brightness, battery.&lt;/p&gt;

&lt;p&gt;But nobody answered the question I actually came with: &lt;strong&gt;what can these glasses do for me, today?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I went looking and found something interesting. The application layer that "agent glasses" promise — it's already buildable. Not next year, not after a firmware update. Right now, with a CLI tool and a phone camera standing in for the hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install the Bailian CLI (requires Node.js &amp;gt;= 18)&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; bailian-cli

&lt;span class="c"&gt;# Authenticate&lt;/span&gt;
bl auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grab a free API key from the &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;Model Studio console&lt;/a&gt; — the free tier covers everything below. Setup takes about five minutes.&lt;/p&gt;

&lt;p&gt;Two commands do all the heavy lifting:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bl vision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upload an image + a question, get a visual analysis&lt;/td&gt;
&lt;td&gt;Food, contracts, plants, gym equipment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bl chat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Send text (optionally with a file or persona), get a response&lt;/td&gt;
&lt;td&gt;Planning, analysis, recommendations, chat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Health: Eat, train, track
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Food calorie recognition
&lt;/h3&gt;

&lt;p&gt;Point your camera at a plate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl vision &lt;span class="nt"&gt;--image&lt;/span&gt; lunch.jpg &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Identify the food, estimate calories and key macronutrients (protein, carbs, fat)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I shot a plate of shredded pork with fish sauce over rice. Got ~650 kcal, protein/carb/fat ratios. Not lab-precise — but good enough to log a meal without manually searching a food database.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI fitness coach
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl vision &lt;span class="nt"&gt;--image&lt;/span&gt; treadmill.jpg &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Identify this equipment and generate a fat-loss plan: 3 sessions/week, 500 kcal per session"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recognized the treadmill, produced a structured weekly plan — exercise type, duration, intensity, target heart-rate zone. Beats wandering between machines at the gym.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Body metrics analysis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl chat &lt;span class="nt"&gt;--file&lt;/span&gt; health-7days.json &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Analyze 7-day health data trends (heart rate, steps, sleep, blood oxygen, stress). Flag anomalies and suggest improvements."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uploaded a week of smartwatch data. It caught a deep-sleep dip on days 3 and 5, correlated it with elevated stress scores, suggested an earlier wind-down. Whether that's medically actionable is a different question — but as a pattern-spotting tool, genuinely useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Smart diet manager
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl vision &lt;span class="nt"&gt;--image&lt;/span&gt; dinner-plate.jpg &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Identify each dish, calculate total calories and macro ratios"&lt;/span&gt;
bl chat &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Based on a fat-loss goal, suggest dietary adjustments for this meal"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vision identifies the food, chat adjusts the plan. Turns "I should eat better" into a concrete, per-meal instruction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Family: The third eye at home
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5. Parenting assistant
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl vision &lt;span class="nt"&gt;--image&lt;/span&gt; baby-blocks.jpg &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Describe the child's activity and assess developmental stage"&lt;/span&gt;
bl chat &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Log today's feeding, nap, and play observations. Generate a weekly growth summary."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Photographed my one-year-old stacking blocks. The model identified it as fine motor skill development and logged the milestone. Not a pediatrician — but as a memory aid for sleep-deprived parents, it beats scribbling in a notebook.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Gift selection assistant
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl vision &lt;span class="nt"&gt;--image&lt;/span&gt; kids-room.jpg &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Analyze this scene for gift-giving clues: interests, ages, existing items"&lt;/span&gt;
bl chat &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Based on the scene analysis, recommend 3 gift options with reasoning and price range"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shot my kid's room. It spotted a half-finished Lego castle and a nearly empty skincare bottle. Inferred: a Lego expansion set for the kid, skincare restock for my wife, a family board game as a wildcard. More thoughtful than my default ("just get a gift card").&lt;/p&gt;

&lt;h2&gt;
  
  
  Business: Scan, assess, decide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7. Contract risk scanner
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl vision &lt;span class="nt"&gt;--image&lt;/span&gt; lease-contract.jpg &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"OCR this contract page and extract the full text"&lt;/span&gt;
bl chat &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Review this contract clause by clause. Flag any risky terms (excessive penalties, unusual terms, hidden fees). Assign risk levels and suggest mitigations."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scanned a residential lease. It flagged a termination penalty clause as "high risk" (two months' rent — above local norms). My lawyer later confirmed it was worth negotiating.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Hotel search &amp;amp; booking
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl chat &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Trip: May 20-22, 2 nights, near Shanghai Bund, budget hotel, total budget 1000 RMB. Find and recommend suitable hotels."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three options with price, location, rating, amenities — plus a comparison table and a booking recommendation. No camera needed. What I'd normally spend 20 minutes on across three booking sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Companion: From tool to partner
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9. Visual Q&amp;amp;A
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl vision &lt;span class="nt"&gt;--image&lt;/span&gt; plant.jpg &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"What plant is this? What's its name (scientific and common)? How do I care for it?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Held up a succulent I'd been slowly killing for months. It identified it as an Echeveria, told me I was overwatering, and gave a care card: bright indirect light, water when soil is fully dry, every 2-3 weeks. The plant is now thriving.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Companion robot
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl chat &lt;span class="nt"&gt;--persona&lt;/span&gt; &lt;span class="s2"&gt;"You are XiaoZhi, a warm and cheerful companion robot. You pick up on emotional cues and proactively suggest activities or games."&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"I'm so happy today! Let's hang out!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A chatbot with a persona. Not groundbreaking on its own — but in the context of agent glasses with a visual feed and calendar, the potential is a persistent, context-aware companion that knows what you're looking at and what you're doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Log a meal's calories&lt;/td&gt;
&lt;td&gt;Search food database, estimate portions&lt;/td&gt;
&lt;td&gt;Snap a photo, get instant estimate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start a gym routine&lt;/td&gt;
&lt;td&gt;Google, cobble together a plan&lt;/td&gt;
&lt;td&gt;Photograph equipment, state goal, get a structured plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review a contract&lt;/td&gt;
&lt;td&gt;Read every line, miss the buried clause&lt;/td&gt;
&lt;td&gt;Scan the page, get flagged risks with levels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pick a gift&lt;/td&gt;
&lt;td&gt;Wander a store, guess&lt;/td&gt;
&lt;td&gt;Photograph the room, get targeted recommendations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identify a plant&lt;/td&gt;
&lt;td&gt;Reverse image search, then find a care guide&lt;/td&gt;
&lt;td&gt;One command: name + care instructions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Book a hotel within budget&lt;/td&gt;
&lt;td&gt;Open 3 tabs, filter, compare&lt;/td&gt;
&lt;td&gt;State constraints, get a comparison table&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern: &lt;strong&gt;input gets simpler (a photo or a sentence), output gets more structured (tables, plans, ranked recommendations).&lt;/strong&gt; The AI doesn't make the decision for you — it does the tedious processing so you can decide faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is this for?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Early adopters who bought AI glasses and are underwhelmed.&lt;/strong&gt; The hardware is here; the application layer is what's missing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developers building for the agent glasses ecosystem.&lt;/strong&gt; Qwen opened the door to third-party Skills. The CLI is the fastest way to prototype what a Skill could do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone who doesn't have glasses yet but wants a preview.&lt;/strong&gt; Every scenario runs with a phone camera and a terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone whose daily routine includes repetitive information tasks.&lt;/strong&gt; If you do it manually every week, there's probably a &lt;code&gt;bl&lt;/code&gt; command for it.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;WAIC 2026 made one thing clear: the AI hardware race is on. But hardware without applications is just expensive plastic. The real question isn't "which glasses are lightest" — it's "what can the glasses do for me that my phone can't?"&lt;/p&gt;

&lt;p&gt;These 10 use cases don't answer that fully. But they show the application layer is already buildable today. The glasses just make the input frictionless — the intelligence is already there, waiting to be invoked.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github" rel="noopener noreferrer"&gt;Install the CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;Get a free API key&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;What use case would you build first? Have you tried any CLI-based AI tools in your daily routine? Drop a comment — I'm curious what people come up with.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Generated 50 Sales Reports with One CLI Command — Here's How</title>
      <dc:creator>张洲诚（Zack.ZHANG）</dc:creator>
      <pubDate>Mon, 20 Jul 2026 10:20:58 +0000</pubDate>
      <link>https://dev.to/zackzhang/i-generated-50-sales-reports-with-one-cli-command-heres-how-21f4</link>
      <guid>https://dev.to/zackzhang/i-generated-50-sales-reports-with-one-cli-command-heres-how-21f4</guid>
      <description>&lt;p&gt;Mid-year review season. You know the drill.&lt;/p&gt;

&lt;p&gt;My team owed leadership a polished Q2 deck, plus every regional sales lead needed their own weekly report. Total count: about 50 reports. Same structure, different data.&lt;/p&gt;

&lt;p&gt;The first deck I did the honest way — PowerPoint, three full days. Not because I can't use templates, but because the "raw data → insight → visual story" pipeline is brutally long. Each chart means copying numbers from Excel, fixing formatting, writing analysis. One slide averages 40 minutes. Twenty slides = two working days gone.&lt;/p&gt;

&lt;p&gt;Then I looked at the remaining 49. That math doesn't work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The GUI tool problem
&lt;/h2&gt;

&lt;p&gt;I tried the obvious solutions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gamma&lt;/strong&gt; ($20/mo): Fast AI generation, but no batch mode — each deck requires manual input and manual export&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beautiful.ai&lt;/strong&gt; ($12/mo): Great design, but can't read my raw Excel data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WPS AI&lt;/strong&gt; (~$4/mo): Can read data, inconsistent quality, no batch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The common issue: &lt;strong&gt;GUI tools don't support scripting.&lt;/strong&gt; One deck saves time. Fifty decks means doing it fifty times by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CLI approach
&lt;/h2&gt;

&lt;p&gt;I found Bailian CLI on GitHub — a command-line tool that calls large models directly from the terminal, reads files as context, and can be looped in a script. Here's what my workflow ended up looking like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;dashscope-cli
bl configure &lt;span class="nt"&gt;--api-key&lt;/span&gt; YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Free API key from the &lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;Bailian console&lt;/a&gt; — new users get complimentary credits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Generate an outline
&lt;/h2&gt;

&lt;p&gt;The worst part of building a deck isn't layout — it's "what goes on slide one."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl chat &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-plus &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Generate a PPT outline for Q2 sales performance review, covering:
1. Performance overview (revenue, profit, YoY/QoQ)
2. Regional comparison (East/South/North/Southwest)
3. Growth attribution (which product lines drove growth)
4. Risks and anomalies
5. Next quarter action plan
Include 2-3 key points and visualization suggestions per module."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;30 seconds → structured outline with chart recommendations (stacked bars for revenue composition, heatmaps for growth distribution). Previously this took 30 minutes on a whiteboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Data-driven content
&lt;/h2&gt;

&lt;p&gt;The key differentiator — feeding in the actual data file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bl chat &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-max &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--file&lt;/span&gt; sales_q2.xlsx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Based on this Q2 sales data, generate executive-facing PPT content:
1. Extract 3 core conclusions (with data support)
2. Identify 2-3 anomalies or notable trends
3. Recommend next-quarter actions
4. Write out each slide's title and bullet points
Emphasize YoY growth trends and regional differences."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It reads the actual numbers, analyzes them, and outputs specific conclusions — not template filler. For example: "East China Q2 revenue grew 23% YoY, driven by enterprise SaaS, while North China saw -5% negative growth — renewal rate decline needs attention."&lt;/p&gt;

&lt;p&gt;GUI tools can't do this. Gamma and Beautiful.ai only work with text you type in; they won't read your source files.&lt;/p&gt;

&lt;p&gt;One complete executive deck: ~1 hour (including manual tweaks and layout). Down from three days.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Batch it
&lt;/h2&gt;

&lt;p&gt;Same structure, different data per region. Textbook scripting scenario:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;region &lt;span class="k"&gt;in &lt;/span&gt;east south north southwest central northeast northwest&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;bl chat &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-plus &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--file&lt;/span&gt; &lt;span class="s2"&gt;"data/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_q2.xlsx"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Based on &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; region Q2 sales data, generate weekly report content:
1. Regional performance summary
2. Top 5 customer contribution analysis
3. YoY and QoQ changes
4. Items requiring HQ support
Output as structured PPT page content."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--output&lt;/span&gt; &lt;span class="s2"&gt;"output/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_weekly_report.md"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seven regions, 8–10 minutes total. Structured Markdown output → batch import into deck template.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Time for 50 reports&lt;/th&gt;
&lt;th&gt;Data accuracy&lt;/th&gt;
&lt;th&gt;Repeatability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fully manual&lt;/td&gt;
&lt;td&gt;~25 hours (30 min each)&lt;/td&gt;
&lt;td&gt;Copy-paste errors likely&lt;/td&gt;
&lt;td&gt;Redo from scratch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GUI tools&lt;/td&gt;
&lt;td&gt;~12 hours (15 min each)&lt;/td&gt;
&lt;td&gt;Manual data entry&lt;/td&gt;
&lt;td&gt;Semi-automated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI script&lt;/td&gt;
&lt;td&gt;~10 min + 1 hr layout&lt;/td&gt;
&lt;td&gt;Reads source data directly&lt;/td&gt;
&lt;td&gt;Fully repeatable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Next quarter? Swap the data files, run the same script. Zero rewrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond decks
&lt;/h2&gt;

&lt;p&gt;The same pattern works for anything "given materials → structured document":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Business plan&lt;/span&gt;
bl chat &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-max &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Draft a business plan outline for an enterprise analytics SaaS..."&lt;/span&gt;

&lt;span class="c"&gt;# Data analysis report&lt;/span&gt;
bl chat &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-max &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--file&lt;/span&gt; user_behavior_june.csv &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Write a product data report: DAU, retention, conversion, anomalies..."&lt;/span&gt;

&lt;span class="c"&gt;# Excel formulas&lt;/span&gt;
bl chat &lt;span class="nt"&gt;--model&lt;/span&gt; qwen-plus &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Write an XLOOKUP formula that..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meeting minutes, contract drafts, quarterly summaries — same logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;th&gt;Batch support&lt;/th&gt;
&lt;th&gt;File input&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gamma&lt;/td&gt;
&lt;td&gt;$20/mo&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;One-off polished decks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beautiful.ai&lt;/td&gt;
&lt;td&gt;$12/mo&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Design-first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WPS AI&lt;/td&gt;
&lt;td&gt;~$4/mo&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;WPS ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bailian CLI&lt;/td&gt;
&lt;td&gt;Pay-per-token&lt;/td&gt;
&lt;td&gt;Native scripting&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Batch + data-driven&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Using qwen-plus: one deck ~$0.05–0.07, 50 regional reports ~$2–4, daily misc ~$1–2/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CLI has a learning curve — not as plug-and-play as GUI tools&lt;/li&gt;
&lt;li&gt;Output is content structure; final .pptx layout still needs human work&lt;/li&gt;
&lt;li&gt;Quality depends on prompt quality&lt;/li&gt;
&lt;li&gt;Complex visualizations still need manual handling&lt;/li&gt;
&lt;li&gt;If you only make one deck occasionally and care about design polish, Gamma/Beautiful.ai are better&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CLI's edge: &lt;strong&gt;batch processing + data-driven generation + programmability.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;If mid-year reporting season is crushing you too, consider a scripting approach. Core idea: &lt;strong&gt;hand the repetitive content generation to the machine, keep the aesthetic judgment and business decisions for yourself.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bailian.console.aliyun.com/cli?source_channel=cli_github" rel="noopener noreferrer"&gt;Install the CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bailian.console.aliyun.com/cn-beijing/?source_channel=key_github&amp;amp;tab=app#/api-key" rel="noopener noreferrer"&gt;Free API key&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
