The Day Kling Raised Its Prices — Maintaining a Pipeline That Depends on External AI Models (Notes on Migrating to Veo and Seedance)

One day, without warning, the pricing tier of the video generation AI I had been using disappeared, and a $150 trial package became a $700 minimum. This is the record of migrating to Veo within four days and then moving again to Seedance. Laid out with the actual logs, it shows that a prompt is nothing more than a calibration to a specific model, and that the same sentence changes its meaning when the engine changes.

The Day Kling Raised Its Prices — Maintaining a Pipeline That Depends on External AI Models (Notes on Migrating to Veo and Seedance)

On the evening of August 4, 2026, I opened the pricing page of Kling AI, which I had been using in the production pipeline for my YouTube channel “Sounds of Rain in Old Japan” (the full picture is here), and could not believe my eyes. The line of trial resource packages I had been buying — most recently 1,500 units for three months at $150.15 (tax included) — was gone. All that remained was a plan with a $700 minimum.

Sounds of Rain in Old Japan is a channel with no revenue. What is more, when I checked the invoices against the admin console at the time, I had used only 40.5% of the first one-month package (1,000 units, $98), and only 20% of this three-month package by its expiry. I had already been buying more than I could use up, and with a $700 minimum on top of that, it was not an amount at which I could casually keep producing. That same day I began investigating a migration to Google Veo 3.1, completed the migration the same day, and yet two days later I was evaluating Seedance because of a different problem — I ended up switching video engines twice in four days.

This article is the record of those migrations. But what I want to write about is not “which model is better.” It is a more general fact that each migration drove home: a prompt is not a specification; it is a calibration to the quirks of a specific model, and when you switch models it stops fitting at all.

Migration 1: Kling → Veo (one day)

When I looked into Veo’s pricing, what I found was, if anything, good news.

KlingVeo 3.1 Lite
Effective unit price$0.112/sec (v3-omni pro 1080p)$0.08/sec
Generation time6–15 minutes91 seconds
Output resolution1076×1924 (an odd size, for some reason)Exactly 1080×1920

What worried me most about using Veo was not the price but camera movement. The lifeline of this channel’s videos is that they are “a fixed viewpoint, in which almost nothing moves,” and months of trial and error to make Kling hold the camera still had been baked into the prompts (do not zoom, do not pan, do not slide, do not drift… a litany of negations like an exorcism. Even so, the days went like “the camera stopped, but now the eaves have started to melt”).

Veo had an API parameter called last_frame. It pins the final frame of the clip to the same still image as the starting image, and months of incantations were replaced by a single function argument. Camera drift measured with the same still image and the same prompt was 0.00 pixels over 192 frames. The camera does not move.

The migration was completed the same day. That would have been the end of it, if only…

An unexpected degradation, discovered hours later

On the day of the migration itself, I noticed it while watching the generated video. The steam rising from a pot in the scene was standing still. Kling had naturally animated steam, flames, and the flicker of candles without being asked, but Veo animated only the rain and the cat, and completely ignored the steam.

What I found when I looked into it was a fundamental difference in the character of the two models.

Veo moves only what is listed in the prompt. Kling infers plausible environmental motion (steam, flames, flicker) on its own and adds it.

And here was the trap. My prompt contains the sentence Nothing else moves. This was a safety device I wrote in the Kling days, meaning “do not invent motion on your own.” Under Veo, however, the same sentence was being interpreted as “even if there is steam or flame, freeze it.”

Not a single character of the prompt had changed, yet its meaning had. When I listed the steam explicitly, motion in that region increased 4.1 times. From then on the prompt needed a “list of things that should move” (steam, smoke, flame, and mist each named individually) and a rule that “things that look like they might move in the wind (noren curtains, laundry) are named and held still.” With Kling, if you said nothing it did the sensible thing; with Veo, you have to say everything that moves and everything that stays still. That was the difference as I came to feel it.

On Veo, the rain did not fall

On August 6, when I had moved the long-form pipeline to Veo as well and made a 30-minute video, a more serious problem appeared. The lines of rain were not falling. Some of the rain lines drawn in the still image were not animated, producing an effect that looked like rain stuck to glass. The video that came out looked as if the far side of the raised entry step (agarikamachi) were completely covered in glass. No matter how I tuned the prompt, I could not solve this problem of “stopped rain lines.”

On a channel whose entire product is rain, not being able to render rain is fatal.

Migration 2: Veo → Seedance (default engine, two hours after disappointment)

The next candidate was ByteDance’s Seedance. The first thing I checked here was not quality but the terms of service. Where the rights to the generated output belong, and what the indemnification clause says when something goes wrong, are items I believe should be confirmed before the unit price.

I learned one thing at this point. Our pipeline is a two-stage structure that uses separate models for image generation and video generation, and an indemnification that covers only one of the stages does not cover the deliverable. The deliverable is a single derivative work. When reading an indemnification clause, you have to think “per deliverable,” not “per process step,” and I think this is a way of reading terms that matters for every pipeline that combines multiple models.

Having checked the terms, I charged just $10 and tried it, and on seeing the first generation result I wrote this to the AI agent I was asking to write the prompts at the time.

There was an animation of water welling up from under the road like a fountain, so honestly this cannot be used.

Here is that “fountain” in the flesh. Water bursts and gushes out of the road in front of a smithy. Watching it absent-mindedly, I burst out laughing myself.

Disappointment… and then, two hours later

The content is perfect. I want to make Seedance the default engine.

After two hours of fixing the prompt, the quality of the generations suddenly became better by an order of magnitude. As I experimented with changing the prompt, I came to understand that Seedance, even when handed the same prompt as Kling, apparently has a completely different concept of how to receive it. So I substantially rearranged the descriptions I had embedded to suit Kling’s quirks for Seedance and regenerated, and the water no longer welled up from the road. A model I had once been about to reject with “this is hopeless…” was the default engine two hours later. I added a $50 resource package and switched both pipelines to Seedance.

The battle with water

One problem remained with Seedance. The video generation model believes that every horizontal surface is water.

Laying out the log of my exchanges with the AI agent from the evening into the night of August 7,

17:35 There is an unnatural, strong splash of water hitting the road. The flames are fine, but

17:57 C: the flames are fine, but ripples like those on a water surface spread across the road. It is an animation as if it mistook the road for water.

19:29 The cat’s movement is truly a faint breathing motion, and realistic. Better than Veo. But there is one large ripple standing on the stone-paved street outside as if it were a water surface, and that is the problem.

19:36 The stone pavement area has improved… but for some reason a flow of water has been added to the floor right in front of the cat.

Make the ripples smaller, fewer, somewhere else — four rounds of rewriting the constraints, and the water did not go away. Then at 19:42, I wrote this to the agent.

At this point, would it be better not to specify Ripple in the first place?

That was it. The log six minutes later reads:

19:48 It has become extremely natural. A perfect animation. Honestly, I am surprised at how high the level is. This is a major discovery.

Scene edo_nagaya_3, which I called "perfect" at 19:48. A cat sleeping on the engawa; outside, a rainy stone-paved street

This is that 19:48 scene. The water vanished from exactly that floor and that stone pavement — the “floor right in front of the cat” I mentioned at 19:29 and the “stone pavement area” at 19:36.

Naming a phenomenon in order to suppress it summons that phenomenon. To the model, the sentence “faint ripples on the wet stone pavement” is a request for ripples. I found that the adjectives had almost no effect, and the nouns were taken far more heavily. The only reliable way not to get ripples was not to write the word.

What is interesting is that this is the exact opposite of the rule for camera control.

  • Camera movement: list every movement you want to forbid (no zoom, no push-in, no pan…). Negation works.
  • Water: never mention it. Negation summons it.

Why this is so, I do not know. Both are rules of thumb, and both are now baked into the prompt-generation skill and supporting production. If I am honest, this is what the front line of practical generative AI work looks like.

One postscript. That week I extracted the lesson “write short for Seedance,” but this was a wrong generalization drawn from correct data. A few days later, a scene made with a minimal prompt became “a parade of ripples and splashes.” The real rule’s sweet spot was much narrower: just “do not name water.” An extremely short prompt did not suppress water; it gave the model the freedom to invent it. It took five takes on the rain of a single teahouse to figure that out.

What these four days showed

To sum up, this is what happened in these four days.

  1. An external factor (a pricing plan change) forced an engine migration
  2. On the new engine, the meaning of the prompt changed (Nothing else moves. went from a safety device to a bug)
  3. A quality problem forced another migration, and I rediscovered yet another calibration (the forbidden word: water)

Building a generative AI model into a pipeline means building a structure on a floor that keeps moving. Model prices change, tiers disappear, and behavior changes from version to version. And your prompt assets, being an accumulation of corrections to a specific model’s quirks, become invalid together with the model.

Even so, this pipeline survived two migrations in the four days after the price increase came to light, and the following week it had resumed production as if nothing had happened. That was possible because each stage of the pipeline is loosely coupled, the prompts are consolidated in one place as a “skill,” and a loop of human and AI agent that detects change and deals with it was running.

A system of this kind is not something you build, deliver, and are done with. It is something you keep maintaining as external models change. That is exactly why, when building AI agents or generative AI into a product, we believe from our own experience that it is important to work on the project long-term with engineers well versed in AI agents. Feel free to get in touch.

#Generative AI#Video Generation#AI Agents#Sounds of Rain in Old Japan