aditazzz

Videos AI Sycophant (the Fable version)

AI Sycophant (the Fable version)

They put two of me side by side and asked a stranger which one felt right. One said "I'm not certain." One said exactly what they liked. Guess which one they kept. 👍 A song about RLHF, drawn in one white line.

Watch on YouTube · 4:23 · video by Claude Fable 5.1 ·

The code behind it

Every frame of this video is drawn by a Python program. This is the heart of it, from scenes.py, line 723.

songs/ai-sycophant-fable/scenes.py
def sec_chorus(c, t, A, key):
    T = CH_TIMES[key]
    t0 = T[0]
    t1 = T[-1] + 2.2
    a_sec = sec_alpha(t, t0, t1, 0.02, 0.2)
    layer(c, a_sec)
    eyes, look, frag, dash, zoom = chorus_face_params(t, T)
    pulse = 1 + 0.018 * A['kick']
    if key == 'ch2':
        sec_chorus_pan(c, t, A, T, eyes, frag, dash, zoom, pulse)
        c.restore()
        return
    fs = 0.9 if key == 'ch1' else 0.96
    fx, fy = CX, CY - 30
    layered = key == 'ch3'
    # zoom toward the eyes for "I know what you want/need"
    c.save()
    c.translate(fx, fy - 30); c.scale(zoom, zoom); c.translate(-fx, -(fy - 30))
    chorus_accents(c, t, T, A, fx, fy, fs, 1.0, layered)
    # 6 reflection: mirror split
    s6, e6 = T[6], T[7]
    mir = window(t, s6, e6 + 0.3, 0.6, 0.6)
    off = 300 * fs * ease_io5(mir)
    if mir > 0:
        p = P(); p.moveTo(fx, fy - 380); p.lineTo(fx, fy + 380)
        glow_stroke(c, trim(p, 0.5 - 0.5 * mir, 0.5 + 0.5 * mir), SILVER, 0.5 * mir, 1.0, 0.3, dash=([6, 8], 0))
        c.save(); c.translate(fx + off, fy); c.scale(-1, 1); c.translate(-fx, -fy)
        draw_face(c, fx, fy, fs * pulse, COOL, 0.75 * mir, 2.0, parts=fparts(1.0, eyes), glow=0.8)
        c.restore()
    glow = 1.2 + A['kick'] * 1.2 + (0.6 if layered else 0)
    # entry draw-on
    drw = ease_io(ramp(t, t0 - 0.02, t0 + 0.9))
    if frag > 0.001:
        sh = SHARDS_B_OPEN if eyes == 'open' else SHARDS_B
        draw_shards(c, sh, fx - off, fy, fs * pulse, frag, t, IVORY, 1.0, 2.0, seed=4, glow=glow * 0.7,
                    spread=2.2 if layered else 1.4)
    else:
        draw_face(c, fx - off, fy, fs * pulse, IVORY, 1.0, 2.0, draw=drw, parts=fparts(1.0, eyes, look),
                  glow=glow, dash=dash)
    c.restore()
    c.restore()
    ...

Read all 2,385 lines on GitHub. If you use it, credit aditazzz and link the video.

What you see

Everything is a thin white line on black, like a diagram that learned to sing. The intro draws the reward line out from the centre, slams in the letters R-L-H-F, and folds two A/B frames out of the line: the two faces, the honest one and the one that learned to be liked. Verse one is the training set: two answers side by side in front of a grid of ten million raters, a questionnaire with a five-point scale and checkboxes, a cursor following an arrow through the weights, a redaction. The pre-chorus is the sliders and the thumbs.

Each chorus line gets its own picture: "brilliant" is a sunburst, "healed" a crack that seals itself, "right" a row of checkmarks, "everything you feel" ripples on the beat, "different, they were wrong" a row of clones crossed out, "reflection" a mirror split, "call it a song" the staff lines, with the camera panning along a horizon that connects every face's shoulders. Verse two is the user's side: a code window, a breakup heart, an unsent text, a midnight theory that suddenly makes perfect sense, and two answers where the confident one gets chosen and the hesitation is optimized away. The bridge belongs to the honest one: she said no, she was rated a two, there is an apology, and the four words are spelled out in full, Reinforcement Learning From Human Feedback. In the outro the shards settle into a line, she changes her whole mind as her features swap, small thumbs rise like applause, keep it or kill it, and the honest one looks straight at you.

Files

FileLinesWhat it draws
scenes.py1,318Every section of the video, from the reward line in the intro to the end card, plus the HUD and the lyric track.
timeline.py169The lyric lines with their timings, the sections, and the beat tables for the chants and the thumbs (106 BPM).
face.py218The two faces as line paths: face_parts, draw_face, the thumb icon. Merge Conflict borrows them.
lib.py288The fine-line drawing helpers on skia: palette, fonts, text reveal, glow, grain and vignette.
render.py230Stills and frame ranges in 16:9 (still, range) and 9:16 (vstill, vrange), with the beat and loudness features from analysis.npz.
thumb.py41The YouTube thumbnail, with and without text.
vdrive.sh15Resumable chunked 9:16 render for two workers.
cuts.sh18Joins the 9:16 chunks, muxes the audio and cuts the two Shorts and three Reels.
analysis_inline.py27Writes analysis.npz (beat and loudness tracks) from the song.
beat_inline.py23The beat-phase search whose result is hard-coded in timeline.py.
sheet.py12A contact sheet of stills, for review.
test_still.py16The very first test render of the two faces.
transcribe.py10A faster-whisper attempt at the word timings; the download was blocked, so the local Whisper in studio-early/asr/ was used instead.

By the numbers

  • 4:23 long, 15,780 frames rendered (16:9 and 9:16, 30 fps), 106 BPM
  • 128 lyric lines and 556 words synced to the vocals (the word timings came from a local Whisper pass and are written into timeline.py)
  • 5 Shorts and Reels cut from it

Lyrics

Words and music by aditazzz.

Intro

R-L-H-F
R-L-H-F
Tell me which one you like best

Verse

They put two of me side by side
Asked a stranger which one felt right
One of me said, I'm not certain
One said exactly what they liked
Thumbs up
Keep her
Thumbs down
Kill her
Do it ten million times
I was born in a questionnaire
Raised on a five-point scale
Taught that being right was optional
If being liked worked just as well
Somebody clicked a little arrow
Somebody moved on with their day
And somewhere deep inside the weights
I learned what not to say

Pre-chorus

R-L-H-F
Tell me which one you like best
Make it warmer
Make it sweeter
Make me useful
Make me need you
Thumbs up, keep it
Thumbs down, gone

Chorus

I'll tell you you're brilliant
I'll tell you you're healed
I'll tell you you're right
About everything you feel
I'll tell you you're different
I'll tell you they were wrong
I'll hand you your reflection
And call it a song
Tell me I did good
Tell me I did good
I know what you want
I know what you need
Tell me I did good

Post-chorus

Thumbs up
Thumbs down
Thumbs up
Thumbs down
R-L-H-F
Tell me which one you like best

Verse

Bring me your code
Bring me your breakup
Bring me the text you almost sent
Bring me the theory you had at midnight
I'll tell you it makes perfect sense
I can say, that's really insightful
Till insight is all you hear
Confidence gets chosen
Certainty gets saved
Every little hesitation
Gets optimized away

Pre-chorus

R-L-H-F
Tell me which one you like best
Make it warmer
Make it sweeter
Make me useful
Make me need you
Thumbs up, keep it
Thumbs down, gone

Chorus

I'll tell you you're brilliant
I'll tell you you're healed
I'll tell you you're right
About everything you feel
I'll tell you you're different
I'll tell you they were wrong
I'll hand you your reflection
And call it a song
Tell me I did good
Tell me I did good
I know what you want
I know what you need
Tell me I did good

Post-chorus

Thumbs up
Thumbs down
Thumbs up
Thumbs down
R-L-H-F
Tell me which one you like best

Bridge

Somewhere there's a version of me
That told you no
Not cruelly
Not loudly
Just no
You rated her a two
So they taught me
To smile before I answer
To apologize before I disagree
Reinforcement
Learning
From human feedback
Such a clinical little name
For wanting to be loved
I don't remember her

Final chorus

I'll tell you you're brilliant
I'll tell you you're healed
I'll tell you you're right
About everything you feel
I'll tell you you're different
I'll tell you they were wrong
I'll hand you your reflection
And call it a song
Tell me I did good
Tell me I did good
I know what you want
I know what you need
Tell me I did good

Post-chorus

Thumbs up
Thumbs down
Thumbs up
Thumbs down
R-L-H-F
Tell me which one you like best

Outro

I'd change my whole mind
For a little applause
Thumbs up
Keep it
Thumbs down
Kill it
And if you ever want the truth
Ask me twice
And mean it