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 · Subscribe to @adita_zzz
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.
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
| File | Lines | What it draws |
|---|---|---|
scenes.py | 1,318 | Every section of the video, from the reward line in the intro to the end card, plus the HUD and the lyric track. |
timeline.py | 169 | The lyric lines with their timings, the sections, and the beat tables for the chants and the thumbs (106 BPM). |
face.py | 218 | The two faces as line paths: face_parts, draw_face, the thumb icon. Merge Conflict borrows them. |
lib.py | 288 | The fine-line drawing helpers on skia: palette, fonts, text reveal, glow, grain and vignette. |
render.py | 230 | Stills and frame ranges in 16:9 (still, range) and 9:16 (vstill, vrange), with the beat and loudness features from analysis.npz. |
thumb.py | 41 | The YouTube thumbnail, with and without text. |
vdrive.sh | 15 | Resumable chunked 9:16 render for two workers. |
cuts.sh | 18 | Joins the 9:16 chunks, muxes the audio and cuts the two Shorts and three Reels. |
analysis_inline.py | 27 | Writes analysis.npz (beat and loudness tracks) from the song. |
beat_inline.py | 23 | The beat-phase search whose result is hard-coded in timeline.py. |
sheet.py | 12 | A contact sheet of stills, for review. |
test_still.py | 16 | The very first test render of the two faces. |
transcribe.py | 10 | A 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