<?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: KuoBa</title>
    <description>The latest articles on DEV Community by KuoBa (@camelsean).</description>
    <link>https://dev.to/camelsean</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%2F3357668%2F9fb60305-85b7-4027-a3cf-d475c5ab242f.png</url>
      <title>DEV Community: KuoBa</title>
      <link>https://dev.to/camelsean</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/camelsean"/>
    <language>en</language>
    <item>
      <title>I measured my agent's confidence. It was a constant.</title>
      <dc:creator>KuoBa</dc:creator>
      <pubDate>Mon, 31 Aug 2026 15:13:51 +0000</pubDate>
      <link>https://dev.to/camelsean/i-measured-my-agents-confidence-it-was-a-constant-4610</link>
      <guid>https://dev.to/camelsean/i-measured-my-agents-confidence-it-was-a-constant-4610</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hackathon disclosure:&lt;/strong&gt; I created this article for the purpose of entering&lt;br&gt;
Fleet in the &lt;strong&gt;All Things Agentic Hackathon&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fleet is a Slack-first dispatcher for a workforce made up of people and&lt;br&gt;
specialized agents. It decides who should do each task, how much human review is&lt;br&gt;
required, and when software should not attempt the work at all.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Try Fleet:&lt;/strong&gt; &lt;a href="https://fleet-jvmesmce2q-uc.a.run.app" rel="noopener noreferrer"&gt;https://fleet-jvmesmce2q-uc.a.run.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/KCL1104/fleet" rel="noopener noreferrer"&gt;https://github.com/KCL1104/fleet&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zcv2ussibekd53k1x3l.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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zcv2ussibekd53k1x3l.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The confidence problem
&lt;/h2&gt;

&lt;p&gt;The design started with a nice idea: ask the model how sure it is and route the&lt;br&gt;
work accordingly. Confident classifications go to an agent; uncertain ones go&lt;br&gt;
to a person. Every agent framework makes this easy—ask for a &lt;code&gt;confidence&lt;/code&gt; field&lt;br&gt;
in the schema and a number comes back.&lt;/p&gt;

&lt;p&gt;A number comes back. That is the problem.&lt;/p&gt;

&lt;p&gt;Here is what four runs of the same customer email produced on Gemini 3.7 Flash,&lt;br&gt;
at temperature 0, across two thinking levels:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LOW    run 1   feature flag 0.95   reconciliation 0.98   refund 0.95
LOW    run 2   feature flag 0.95   reconciliation 0.95   refund 0.95
MEDIUM run 1   feature flag 0.95   reconciliation 0.98   refund 0.95
MEDIUM run 2   feature flag 0.95   reconciliation 0.95   refund 0.95
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those requests have genuinely different consequences. One is a feature-flag&lt;br&gt;
action whose arguments are present in the account snapshot. One is a document&lt;br&gt;
that requires a billing period to be inferred. One is a refund—a decision about&lt;br&gt;
money that software should never make here.&lt;/p&gt;

&lt;p&gt;The result was almost always 0.95.&lt;/p&gt;

&lt;p&gt;I do not think the model was lying. I think it was answering a question it had&lt;br&gt;
no evidence to answer. It had never seen its own reconciliation drafts return&lt;br&gt;
from a human reviewer, so it had no historical success rate to report. The&lt;br&gt;
confidence value was still useful as one signal, but it was not a probability I&lt;br&gt;
could safely use on its own.&lt;/p&gt;

&lt;p&gt;So I stopped letting it have the last word.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Fleet does
&lt;/h2&gt;

&lt;p&gt;Fleet receives work where teams already communicate: Slack. A message shortcut,&lt;br&gt;
&lt;code&gt;/fleet&lt;/code&gt;, or an app mention can create a request. Fleet separates a multi-part&lt;br&gt;
message into discrete tasks, classifies each task into a fixed taxonomy, assigns&lt;br&gt;
a risk tier, and sends it down one of three paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tier 0:&lt;/strong&gt; an agent may complete low-risk work unattended.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 1:&lt;/strong&gt; an agent may prepare the work, but a person must review it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 2:&lt;/strong&gt; software never attempts the task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Interactive Slack cards and a persistent App Home let authorized teammates&lt;br&gt;
review, send back, delegate, or complete work without adopting another inbox.&lt;br&gt;
The Fleet web application is the control plane: it exposes the work queue,&lt;br&gt;
routing evidence, workforce calibration, activity history, automations, and&lt;br&gt;
connection health.&lt;/p&gt;

&lt;p&gt;In the reproducible demo, one customer message asks Fleet to enable an export&lt;br&gt;
feature, prepare a reconciliation document, and issue a refund. The first task&lt;br&gt;
goes to an isolated Operator. The second is drafted by an Analyst and returned&lt;br&gt;
for human review. The refund stays with a person and is never attempted by&lt;br&gt;
software.&lt;/p&gt;

&lt;p&gt;Routing to a person is not an agent failure. It is one of the system's intended&lt;br&gt;
outputs.&lt;/p&gt;
&lt;h2&gt;
  
  
  The number that is not a constant
&lt;/h2&gt;

&lt;p&gt;Fleet keeps a small table for each &lt;code&gt;(task class, worker)&lt;/code&gt; pairing: how many times&lt;br&gt;
a human approved that worker's output, and how many times they sent it back.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;empirical_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;approvals&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;approvals&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;send_backs&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;effective_confidence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model_confidence&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;empirical_rate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model assessment is still present. It is multiplied by a rate grounded in&lt;br&gt;
actual outcomes. An Analyst's record for reconciliation work does not affect a&lt;br&gt;
Scribe's record for customer updates, and neither affects an Operator's record&lt;br&gt;
for back-office actions.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;+2 / +3&lt;/code&gt; Beta prior also creates a useful cold-start property. A new pairing&lt;br&gt;
begins at &lt;code&gt;2/3 = 0.667&lt;/code&gt;. The Tier 1 automation threshold is 0.75, so clearing it&lt;br&gt;
on the first attempt would require a model confidence greater than&lt;br&gt;
&lt;code&gt;0.75 / 0.667 = 1.12&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That number cannot exist. The first unfamiliar, higher-risk task therefore goes&lt;br&gt;
to a person. The agent becomes eligible only after supervised attempts create a&lt;br&gt;
real record.&lt;/p&gt;
&lt;h2&gt;
  
  
  The send-back is the signal
&lt;/h2&gt;

&lt;p&gt;Human review is part of Fleet's routing loop, not a separate feedback form.&lt;/p&gt;

&lt;p&gt;An approval records a successful outcome. A send-back lowers the empirical rate&lt;br&gt;
for that worker-task pairing and stores the reviewer's correction for later&lt;br&gt;
attempts. Slack then displays a &lt;strong&gt;Learning Receipt&lt;/strong&gt; showing the before-and-after&lt;br&gt;
track record, the calculation, the applicable threshold, and whether the agent&lt;br&gt;
remains eligible next time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;before send-back: 0.98 x 0.83 = 0.82   threshold 0.75   -&amp;gt; Analyst eligible
after send-back:  0.98 x 0.71 = 0.70   threshold 0.75   -&amp;gt; route to a person
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The request did not change. Fleet's evidence about its workforce did.&lt;/p&gt;

&lt;p&gt;This also exposed a second problem: automatic demotion without a promotion path&lt;br&gt;
would eventually make the product route everything to people. Fleet therefore&lt;br&gt;
lets an authorized person delegate an eligible Tier 0 or Tier 1 task to an agent&lt;br&gt;
under the same review boundary. Delegation alone does not improve the agent's&lt;br&gt;
record. Only a later verdict on real agent output can do that. Tier 2 remains&lt;br&gt;
human-only even if someone tries to override it.&lt;/p&gt;
&lt;h2&gt;
  
  
  A second reader, not a second vote
&lt;/h2&gt;

&lt;p&gt;Fleet uses &lt;strong&gt;Gemini 3.7 Flash&lt;/strong&gt; through Google's GenAI SDK on Vertex AI for&lt;br&gt;
structured task separation, classification, and schema-constrained argument&lt;br&gt;
extraction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 26B&lt;/strong&gt; independently reads each classified request against the same&lt;br&gt;
catalogue and account snapshot. It is not a cheaper first pass, and agreement&lt;br&gt;
does not inflate the score. When the models disagree on what a request is,&lt;br&gt;
Fleet halves the first model's confidence before deterministic routing.&lt;/p&gt;

&lt;p&gt;The lowest automation threshold is 0.55. Half of any model confidence is at most&lt;br&gt;
0.50, and the empirical rate is always below 1. A contradicted classification&lt;br&gt;
therefore cannot clear any automation threshold, regardless of prior success.&lt;/p&gt;

&lt;p&gt;That matters for requests like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Any update on when the export feature will be working again?"

Gemini -&amp;gt; comms.status_update
Gemma  -&amp;gt; backoffice.feature_flag
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both readings are defensible. The customer may want information or an action.&lt;br&gt;
Two competent readers disagreeing about the meaning is not a tie to break; it is&lt;br&gt;
evidence that a person should decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the models are not allowed to do
&lt;/h2&gt;

&lt;p&gt;Three decisions stay outside the models:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dispatch is arithmetic.&lt;/strong&gt; Given the same task and track record, Fleet makes
the same routing decision and can explain the exact calculation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The task class selects the handler.&lt;/strong&gt; A fixed taxonomy maps to typed code
paths. Model-generated arguments must satisfy schemas built from the live
system, so the model cannot invent a feature flag or action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business numbers are computed.&lt;/strong&gt; Billing data is fetched and totaled in
code. A model may write the covering note; it does not calculate the
reconciliation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The models contribute judgment where language is ambiguous. Deterministic code&lt;br&gt;
owns policy, permissions, arithmetic, and the final routing decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Fleet is built on Google Cloud
&lt;/h2&gt;

&lt;p&gt;Fleet runs as four Cloud Run services with distinct responsibilities and trust&lt;br&gt;
boundaries:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;fleet-connectors&lt;/code&gt;&lt;/strong&gt; verifies Slack signatures, acknowledges interactions
quickly, and handles durable delivery. It has no model or business-system
credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;fleet&lt;/code&gt;&lt;/strong&gt; hosts the React/FastAPI control plane, intake pipeline, Gemini and
Gemma calls, deterministic dispatcher, and general Analyst/Scribe workers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;fleet-operator&lt;/code&gt;&lt;/strong&gt; is private and holds the only agent credential permitted
to perform named write actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;acme&lt;/code&gt;&lt;/strong&gt; is a separate synthetic back-office service with its own identity,
database, and per-action authorization.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pub/Sub separates intake, human actions, general and isolated task lanes, Slack&lt;br&gt;
notifications, retries, and dead-letter recovery. A filtered subscription makes&lt;br&gt;
privileged Operator tasks reachable only by the isolated Operator service.&lt;/p&gt;

&lt;p&gt;Firestore stores operational state, task decisions, calibration, corrections,&lt;br&gt;
and audit evidence. A separate connector database holds replay claims and&lt;br&gt;
delivery receipts, while the synthetic back office has its own database. Secret&lt;br&gt;
Manager and service-specific IAM define capabilities. Model Armor screens&lt;br&gt;
untrusted inbound text and approved outbound content. OpenTelemetry and Cloud&lt;br&gt;
Trace join intake, routing, execution, and review under a shared trace ID.&lt;/p&gt;

&lt;p&gt;The architectural goal was concrete: the component reading customer-authored&lt;br&gt;
text should not also hold the credential that changes a business system.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was harder than expected
&lt;/h2&gt;

&lt;p&gt;Slack requires a fast acknowledgement, while two model calls and policy&lt;br&gt;
evaluation can take much longer. Moving the work behind Pub/Sub solved the&lt;br&gt;
latency problem, but introduced delivery concerns: replayed events, concurrent&lt;br&gt;
button presses, stale task versions, retries, dead letters, and restarts. Fleet&lt;br&gt;
uses idempotency claims, mutation leases, state versions, and durable receipts&lt;br&gt;
so one human action produces one domain effect.&lt;/p&gt;

&lt;p&gt;Calibration also had to follow the worker who actually produced the work. A&lt;br&gt;
reassignment must not accidentally update the original assignee's record, and a&lt;br&gt;
delegation must not count as a success before anyone judges the output.&lt;/p&gt;

&lt;p&gt;Finally, timeouts and retries had to be designed as one budget. Stacked retries&lt;br&gt;
can turn a graceful fallback into a ten-minute hang. Making those limits&lt;br&gt;
explicit was less visible than another demo feature, but much more important for&lt;br&gt;
a live system.&lt;/p&gt;

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

&lt;p&gt;The most useful memory in Fleet is not a transcript. It is operational evidence:&lt;br&gt;
approvals, send-backs, concrete corrections, who actually performed the work,&lt;br&gt;
and the context needed to apply that evidence to the next decision.&lt;/p&gt;

&lt;p&gt;I also learned that an agent architecture should describe enforceable&lt;br&gt;
capabilities, not character roles. Different names and prompts do not create&lt;br&gt;
meaningful isolation. Different identities, credentials, message lanes,&lt;br&gt;
databases, and failure boundaries do.&lt;/p&gt;

&lt;p&gt;Fleet is a hackathon project, not a claim of production traction. But it&lt;br&gt;
demonstrates the direction I believe agentic work systems should take: autonomy&lt;br&gt;
that grows from evidence, remains inspectable, and can shrink again when the&lt;br&gt;
evidence changes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>One prompt in, a finished film out: running an entire AI video pipeline on Qwen Cloud</title>
      <dc:creator>KuoBa</dc:creator>
      <pubDate>Mon, 20 Jul 2026 13:07:40 +0000</pubDate>
      <link>https://dev.to/camelsean/one-prompt-in-a-finished-film-out-running-an-entire-ai-video-pipeline-on-qwen-cloud-20he</link>
      <guid>https://dev.to/camelsean/one-prompt-in-a-finished-film-out-running-an-entire-ai-video-pipeline-on-qwen-cloud-20he</guid>
      <description>&lt;p&gt;I've been building &lt;strong&gt;&lt;a href="https://github.com/KCL1104/extrovid" rel="noopener noreferrer"&gt;extrovid&lt;/a&gt;&lt;/strong&gt; — an AI-native director and editor. You give it one line of text, and it does the rest: it writes the brief and script, casts a consistent cast, develops a look, boards the shots, generates and reviews the video, adds voiceover, and hands you an edited rough cut. One prompt to a finished short, with a director you can talk to at every step.&lt;/p&gt;

&lt;p&gt;The interesting part isn't any single model. It's that &lt;strong&gt;every creative decision in the pipeline is made by a model on Qwen Cloud (Alibaba DashScope)&lt;/strong&gt; — the LLM that writes the script, the model that draws each frame, the voice that narrates, and the model that renders the video. This post is a tour of how those pieces fit together.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole crew is a Qwen model
&lt;/h2&gt;

&lt;p&gt;extrovid is built like a film crew, and every role is played by a model on Qwen Cloud:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job on set&lt;/th&gt;
&lt;th&gt;Model on Qwen Cloud&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Writing the script&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;qwen3.7-max&lt;/code&gt; — the flagship, for the one output that carries the whole film&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every other agent (brief, cast, look-dev, storyboard, director, review)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;qwen3.7-plus&lt;/code&gt; — cheaper, huge context, used everywhere else&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concept frames, storyboard keyframes, cast portraits&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;wan2.7-image-pro&lt;/code&gt; (up to 4K)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voiceover&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwen3-tts&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rendering the shots&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;HappyHorse&lt;/strong&gt; or &lt;strong&gt;Wan 2.7&lt;/strong&gt; (text-, image-, and reference-to-video)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Six model families, four modalities — text, image, voice, and video — all reached through &lt;strong&gt;one API key and one endpoint&lt;/strong&gt;. That single-vendor coherence turned out to be a real advantage: no juggling five providers, five billing accounts, and five sets of quirks. One key, one place to reason about cost, one place to reason about latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Talking to Qwen: one endpoint, typed answers
&lt;/h2&gt;

&lt;p&gt;DashScope exposes an &lt;strong&gt;OpenAI-compatible endpoint&lt;/strong&gt;, which means the planning agents can speak to Qwen through the same tooling the rest of the ecosystem already uses. On top of that, extrovid uses a typed agent framework, so the models don't just return prose — they return &lt;strong&gt;structured, validated data&lt;/strong&gt;: a script with numbered scenes, a cast list with consistent character descriptions, a storyboard as machine-readable shots. The brief becomes the script, the script becomes the cast, the cast becomes portraits — each stage's structured output feeds the next.&lt;/p&gt;

&lt;p&gt;That structure is what lets the pipeline be a real pipeline instead of a pile of chat prompts. And it's why the planning phase can stream back to the UI &lt;strong&gt;token by token&lt;/strong&gt;, stage by stage, so you watch the film get planned in real time rather than staring at a spinner.&lt;/p&gt;

&lt;p&gt;One integration lesson worth passing on: Qwen3 models run in a "thinking mode" by default that's excellent for reasoning, but it conflicts with the strict "you &lt;em&gt;must&lt;/em&gt; return this exact schema" mode that structured-output frameworks rely on. Turning thinking mode off for the planning agents made their output deterministic and reliable. If you're getting Qwen to emit strict JSON or tool calls, that's the knob to reach for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Images and voice
&lt;/h2&gt;

&lt;p&gt;Once the plan exists, it needs to become something you can see and hear. &lt;code&gt;wan2.7-image-pro&lt;/code&gt; draws the visual world — cast portraits so a character has a face, look-development frames so the film has a mood, and a keyframe for every shot in the storyboard. Because the Wan 2.7 image family handles both generation and editing, refining a frame later is the same kind of call, not a bolt-on service. Voiceover comes from &lt;code&gt;qwen3-tts&lt;/code&gt;, one narration line per shot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video: the slow, interesting part
&lt;/h2&gt;

&lt;p&gt;Video is where the integration gets genuinely interesting, because rendering a shot isn't instant — it takes minutes. Qwen Cloud handles this the right way: it's &lt;strong&gt;asynchronous&lt;/strong&gt;. You submit a shot, get a ticket back immediately, and check on it until it's ready. That shape influences the whole backend, which has to track jobs in flight, notice when they finish, and stream live progress to the UI as each shot lands.&lt;/p&gt;

&lt;p&gt;A few things I'm especially happy with here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Two video models, one path.&lt;/strong&gt; extrovid can render on &lt;strong&gt;HappyHorse&lt;/strong&gt; (an Alibaba model that currently ranks #1 on the Artificial Analysis Video Arena, with native audio and multi-language lip-sync) or fall back to &lt;strong&gt;Wan 2.7&lt;/strong&gt; — a single config switch, because both live on the same Qwen Cloud transport. No second integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best-of-N with an AI "dailies" review.&lt;/strong&gt; Each shot is rendered several times, and a Qwen model reviews the takes and picks the winner automatically — the way a director watches dailies and chooses. You see it happen as a little status note: &lt;em&gt;"picked best of 3."&lt;/em&gt; The machine owns the quality-control work, not just the generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuity that actually holds.&lt;/strong&gt; Each shot is seeded with the previous shot's final frame and the cast portraits, so a character's face and the film's look carry across clips that were generated independently. Continuity turns out to be an architecture problem, not a prompting one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The one hard-won operational lesson: asynchronous results don't wait for you forever. A finished video's download link expires, so the backend has to fetch it and re-host it in your own storage promptly — otherwise you've paid to generate something you can no longer retrieve. Planning for "fetch and keep" from the start saved a lot of pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trick that made all of this pleasant to build
&lt;/h2&gt;

&lt;p&gt;Every model in extrovid sits behind a &lt;strong&gt;provider seam&lt;/strong&gt; — a thin boundary where a single setting decides whether a call hits real Qwen Cloud or a fast, deterministic offline stand-in. Flip one flag and the exact same pipeline runs with no key, no network, and no cost.&lt;/p&gt;

&lt;p&gt;This one decision paid for itself over and over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The whole thing is testable offline.&lt;/strong&gt; The full idea-to-cut pipeline runs in tests with zero spend, because every model has an offline counterpart behind the same boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterating is free.&lt;/strong&gt; Image and video generation are billable; developing against the offline stand-ins (plus per-user daily caps in production) keeps costs bounded until you actually want pixels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Going live is a config change, not a rewrite.&lt;/strong&gt; The offline and real providers are interchangeable, so switching to production Qwen Cloud is flipping a flag and adding a key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you take one thing from this post, let it be that: when you build on a paid, multi-modal cloud, build the seam that lets you also run without it. It's the cheapest thing you'll build and the one that lets you move fastest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;extrovid is an attempt to close the gap between "a model can make a shot" and "a tool can make a film" — the brief, the casting, the continuity, the take selection, the cut. Qwen Cloud made that feasible for a small project: one vendor covering text, image, voice, and video, reachable through one key, coherent enough that a single person could wire the whole crew together.&lt;/p&gt;

&lt;p&gt;If you're building anything multi-modal for this hackathon, Qwen Cloud is a genuinely strong foundation to build the whole pipeline on — not just one piece of it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with Qwen Cloud / Alibaba DashScope end to end.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>qwen</category>
      <category>alibabachallenge</category>
    </item>
    <item>
      <title>Build with MeDo Hackathon Journey</title>
      <dc:creator>KuoBa</dc:creator>
      <pubDate>Sat, 25 Apr 2026 18:25:49 +0000</pubDate>
      <link>https://dev.to/camelsean/build-with-medo-hackathon-journey-3n5h</link>
      <guid>https://dev.to/camelsean/build-with-medo-hackathon-journey-3n5h</guid>
      <description>&lt;p&gt;I'm started to work on Build with MeDo Hackathon! I've tried many similar platform before and I'll share my experience in using MeDo compare with other platform during the Hackathon!&lt;/p&gt;

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