1
00:00:00,000 --> 00:00:00,799
Welcome to the show.

2
00:00:00,799 --> 00:00:06,378
James, this one hit me right in
the old copy-paste injury: in

3
00:00:06,378 --> 00:00:13,597
Claude Code v2.

4
00:00:06,378 --> 00:00:13,597
1.126, if you point ANTHROPIC_BASE_URL at
some custom gateway,

5
00:00:13,597 --> 00:00:20,602
the /model picker now calls GET
/v1/models on THAT gateway instead of

6
00:00:20,602 --> 00:00:28,025
showing a baked-in Anthropic-only
list.v2.

7
00:00:20,602 --> 00:00:28,025
1.126 is the whole

8
00:00:28,025 --> 00:00:29,160
story here.

9
00:00:29,160 --> 00:00:36,496
Because before 2.

10
00:00:29,160 --> 00:00:36,496
1.126, if your company ran LiteLLM or a
Bedrock proxy

11
00:00:36,496 --> 00:00:40,993
or some Vertex AI adapter pretending to
be Anthropic-compatible,

12
00:00:40,993 --> 00:00:42,516
Claude Code would basically go,

13
00:00:42,516 --> 00:00:46,797
"Cool, anyway, here's my old list."
And then you had to know

14
00:00:46,797 --> 00:00:50,320
the exact model ID by hand.

15
00:00:46,797 --> 00:00:50,320
Yeah,

16
00:00:50,320 --> 00:00:50,880
exactly.

17
00:00:50,880 --> 00:00:55,666
And "exact model ID by hand" sounds small
until you're typing some weird

18
00:00:55,666 --> 00:00:58,000
internal alias at 11:40 p.

19
00:00:55,666 --> 00:00:58,000
m.

20
00:00:58,000 --> 00:01:02,715
like
claude-sonnet-prod-us-east-1-whatever.

21
00:01:02,715 --> 00:01:07,349
One typo and the whole thing falls over
like a roo on roller skates.

22
00:01:07,349 --> 00:01:12,208
The old flow was brittle in a VERY
specific way.And

23
00:01:12,208 --> 00:01:16,395
brittle for the worst reason: not because
the model was unavailable,

24
00:01:16,395 --> 00:01:20,232
but because the client UI was lying about
what existed.

25
00:01:20,232 --> 00:01:21,592
That's the part I hate.

26
00:01:21,592 --> 00:01:26,952
If the gateway expects, say,
a Bedrock-flavored name or a proxy alias,

27
00:01:26,952 --> 00:01:30,908
the built-in picker isn't just unhelpful
-- it's actively misdirecting

28
00:01:30,908 --> 00:01:32,600
you.

29
00:01:30,908 --> 00:01:32,600
Right.

30
00:01:32,600 --> 00:01:35,362
So now the practical change is almost
boring,

31
00:01:35,362 --> 00:01:36,326
which is why it's good.

32
00:01:36,326 --> 00:01:39,848
You open Claude Code, run /model,

33
00:01:39,848 --> 00:01:42,650
and instead of a stale list shipped
inside the app,

34
00:01:42,650 --> 00:01:46,246
you see the IDs your own infrastructure
actually advertises.

35
00:01:46,246 --> 00:01:48,083
Self-documenting.

36
00:01:48,083 --> 00:01:49,364
No wiki safari.

37
00:01:49,364 --> 00:01:51,287
No Slack thread from March.

38
00:01:51,287 --> 00:01:57,319
No "ask Priya, she knows the alias"
energy."Ask Priya" as

39
00:01:51,287 --> 00:01:57,319
infrastructure.

40
00:01:57,319 --> 00:01:58,601
Every company has that.

41
00:01:58,601 --> 00:02:06,044
But let me sharpen it: the /model picker
and the --model flag both benefit,

42
00:02:06,044 --> 00:02:06,364
right?

43
00:02:06,364 --> 00:02:08,328
So it's not just interactive use.

44
00:02:08,328 --> 00:02:10,530
Even if you're launching from the command
line,

45
00:02:10,530 --> 00:02:17,320
the tool is now grounded in GET
/v1/models from the configured base URL.

46
00:02:10,530 --> 00:02:17,320
Yep.

47
00:02:17,320 --> 00:02:21,520
And I like this because it's one of those
tiny changes that quietly removes

48
00:02:21,520 --> 00:02:23,081
a whole category of pain.

49
00:02:23,081 --> 00:02:27,759
It's the same feeling as stopping
hardcoded API keys in a notebook and

50
00:02:27,759 --> 00:02:29,799
pulling from env vars instead.

51
00:02:29,799 --> 00:02:35,304
Same app, same job, but suddenly it
behaves like it belongs in real

52
00:02:29,799 --> 00:02:35,304
infrastructure

53
00:02:35,304 --> 00:02:39,714
instead of a demo on someone's laptop.

54
00:02:35,304 --> 00:02:39,714
That env-var comparison is good

55
00:02:39,714 --> 00:02:41,919
because it captures the maturity jump.

56
00:02:41,919 --> 00:02:43,439
Not glamorous, but real.

57
00:02:43,439 --> 00:02:48,240
Once ANTHROPIC_BASE_URL can point at
whatever your team actually runs,

58
00:02:48,240 --> 00:02:54,125
the client has to stop assuming
"Anthropic-only universe." Querying

59
00:02:48,240 --> 00:02:54,125
/v1/models

60
00:02:54,125 --> 00:02:55,672
is the obvious move...

61
00:02:55,672 --> 00:02:59,065
but obvious in hindsight is
still a meaningful fix.

62
00:02:59,065 --> 00:03:07,033
And the reason it matters is that
"Anthropic-compatible" never meant

63
00:02:59,065 --> 00:03:07,033
"identical in every operational detail."

64
00:03:07,033 --> 00:03:10,352
A reverse proxy can expose different
names,

65
00:03:10,352 --> 00:03:13,718
different availability,
different routing rules.

66
00:03:13,718 --> 00:03:17,992
So if Claude Code ships a fixed list and
your gateway speaks a slightly

67
00:03:17,992 --> 00:03:22,610
different dialect, you get that annoying
gap between what the app suggests

68
00:03:22,610 --> 00:03:25,240
and what the backend accepts.

69
00:03:22,610 --> 00:03:25,240
Wait,

70
00:03:25,240 --> 00:03:26,683
let me try to explain it back.

71
00:03:26,683 --> 00:03:32,122
Old world: Claude Code sees
ANTHROPIC_BASE_URL,

72
00:03:32,122 --> 00:03:35,556
but still behaves like the only valid
model names are the ones it already

73
00:03:35,556 --> 00:03:36,051
knows.

74
00:03:36,051 --> 00:03:47,564
New world: Claude Code sees
ANTHROPIC_BASE_URL and asks that server,

75
00:03:47,564 --> 00:03:49,444
specifically via GET /v1/models,

76
00:03:49,444 --> 00:03:54,325
"What model IDs do YOU support?" That's
the change?That's

77
00:03:54,325 --> 00:03:54,485
it.

78
00:03:54,485 --> 00:03:59,920
Not exactly magical discovery of
capabilities everywhere -- just plain

79
00:03:59,920 --> 00:04:02,802
old asking the endpoint for the list it
advertises.

80
00:04:02,802 --> 00:04:06,237
Which, honestly,
is better engineering than guessing.

81
00:04:06,237 --> 00:04:09,515
Fresh code can make even a kangaroo trip,

82
00:04:09,515 --> 00:04:14,242
but this one lands on both feet.

83
00:04:09,515 --> 00:04:14,242
And there's a subtle trust thing here.

84
00:04:14,242 --> 00:04:19,359
When a picker shows me IDs straight from
/v1/models,

85
00:04:19,359 --> 00:04:20,242
I trust it more.

86
00:04:20,242 --> 00:04:23,677
If an admin adds a new alias at the
gateway,

87
00:04:23,677 --> 00:04:27,358
that can surface without waiting for some
client release cycle.

88
00:04:27,358 --> 00:04:30,633
The UI becomes a view into infrastructure,

89
00:04:30,633 --> 00:04:33,681
not a brochure.This is where it
gets useful for teams.

90
00:04:33,681 --> 00:04:38,804
Enterprise platform groups love gateways
for three reasons: cost controls,

91
00:04:38,804 --> 00:04:41,206
audit logging, and mixed model access.

92
00:04:41,206 --> 00:04:45,367
One base URL can route traffic through
the policy layer they want.

93
00:04:45,367 --> 00:04:49,643
Before, developers had to memorize
whatever alias names that layer exposed

94
00:04:49,643 --> 00:04:51,212
like some kind of oral tradition.

95
00:04:51,212 --> 00:04:53,454
Now the picker can just show the names.

96
00:04:54,000 --> 00:04:55,839
"Oral tradition" is dead-on.

97
00:04:55,839 --> 00:04:58,721
It's basically tribal knowledge with YAML.

98
00:04:58,721 --> 00:05:02,639
And if the admin adds or removes models
on the gateway side,

99
00:05:02,639 --> 00:05:05,362
the list stays current without a Claude
Code update,

100
00:05:05,362 --> 00:05:08,317
without telling everyone to refresh local
config,

101
00:05:08,317 --> 00:05:10,958
without that classic moment where the dev
says,

102
00:05:10,958 --> 00:05:17,307
"Why is the picker lying to me?"That
phrase -- "why is the picker lying to me?"

103
00:05:17,307 --> 00:05:20,078
-- is memorable because every engineer
has lived it.

104
00:05:20,078 --> 00:05:22,957
A dropdown is supposed to reduce
uncertainty.

105
00:05:22,957 --> 00:05:26,477
When it shows stale options,
it becomes worse than a text box.

106
00:05:26,477 --> 00:05:31,502
At least a blank text box isn't
pretending to know.A dishonest

107
00:05:31,502 --> 00:05:33,840
dropdown is worse than no dropdown.

108
00:05:33,840 --> 00:05:35,519
That's going on a T-shirt.

109
00:05:35,519 --> 00:05:40,770
But here's the catch, and it's an
important one: Claude Code passes the

110
00:05:40,770 --> 00:05:43,750
selected model ID VERBATIM to the gateway.

111
00:05:43,750 --> 00:05:49,885
So if /v1/models advertises a pretty ID
that doesn't exactly match what

112
00:05:49,885 --> 00:05:54,076
inference requests expect,
the nicer picker won't save you.

113
00:05:54,076 --> 00:05:58,588
It's lipstick on a misconfigured
pig.Verbatim is the key

114
00:05:58,588 --> 00:05:58,924
word.

115
00:05:58,924 --> 00:06:02,846
No normalization,
no translation layer in the client,

116
00:06:02,846 --> 00:06:04,606
no "did you mean" cleanup.

117
00:06:04,606 --> 00:06:10,105
So if the gateway returns model-a in
/v1/models but actually expects

118
00:06:10,105 --> 00:06:14,673
model_a or some longer internal alias
when the inference call comes in,

119
00:06:14,673 --> 00:06:15,475
you're still broken.

120
00:06:15,475 --> 00:06:20,717
The front end can only be as truthful as
the backend contract.

121
00:06:15,475 --> 00:06:20,717
Exactly.

122
00:06:20,717 --> 00:06:24,637
This is where teams can get lulled into a
false sense of safety.

123
00:06:24,637 --> 00:06:27,035
You see a neat dynamic list and think,

124
00:06:27,035 --> 00:06:28,592
beauty, job done.

125
00:06:28,592 --> 00:06:33,155
But the list has to match the actual
request path expectations exactly.

126
00:06:33,155 --> 00:06:35,438
If your gateway advertises junk,

127
00:06:35,438 --> 00:06:39,543
Claude Code will faithfully send junk
right back.

128
00:06:35,438 --> 00:06:39,543
And there's another

129
00:06:39,543 --> 00:06:44,006
edge case I think people should remember:
if the gateway returns a malformed

130
00:06:44,006 --> 00:06:50,352
or empty /v1/models response, Claude Code
silently falls back to its built-in

131
00:06:50,352 --> 00:06:50,832
list.

132
00:06:50,832 --> 00:06:53,465
Silent fallback.

133
00:06:53,465 --> 00:06:57,425
That means you might think integration is
working when really you just

134
00:06:57,425 --> 00:07:01,168
slipped back to the old hardcoded
behavior.Silent

135
00:06:57,425 --> 00:07:01,168
fallback

136
00:07:01,168 --> 00:07:02,393
is the sneaky bit!

137
00:07:02,393 --> 00:07:04,633
That's the one I'd tape above the monitor.

138
00:07:04,633 --> 00:07:08,834
Because if you're testing a new LiteLLM
setup or a Bedrock proxy and

139
00:07:08,834 --> 00:07:12,789
/model suddenly looks "normal," that
might not mean the gateway is healthy.

140
00:07:12,789 --> 00:07:17,100
It might mean Claude Code gave up and
showed its default list instead.

141
00:07:12,789 --> 00:07:17,100
So

142
00:07:17,100 --> 00:07:19,879
the move is simple: before trusting the
picker,

143
00:07:19,879 --> 00:07:21,236
hit the gateway yourself.

144
00:07:21,236 --> 00:07:24,517
Do a quick curl to /v1/models.

145
00:07:24,517 --> 00:07:27,394
If that response is empty or malformed,

146
00:07:27,394 --> 00:07:28,993
you've found the problem upstream.

147
00:07:28,993 --> 00:07:32,672
The client interface can look polished
while the integration is still

148
00:07:32,672 --> 00:07:34,400
busted underneath.

149
00:07:32,672 --> 00:07:34,400
Yeah.

150
00:07:34,400 --> 00:07:37,606
It's a bit like checking the fuel line
instead of kicking the bike tyre.

151
00:07:37,606 --> 00:07:40,169
The shiny bit isn't always the broken bit.

152
00:07:40,169 --> 00:07:43,524
And for platform teams,
that's actually good news,

153
00:07:43,524 --> 00:07:48,641
because the debugging boundary gets
clearer: is /v1/models correct,

154
00:07:48,641 --> 00:07:51,764
and do those IDs match inference
expectations?

155
00:07:51,764 --> 00:07:54,728
If yes, Claude Code should behave.

156
00:07:54,728 --> 00:07:59,309
If not, don't blame the
picker.I also think this is

157
00:07:54,728 --> 00:07:59,309
one

158
00:07:59,309 --> 00:08:01,996
of those tiny enterprise-readiness
signals.

159
00:08:01,996 --> 00:08:07,239
Not flashy model benchmarks, not "look at
this new agent feature." Just:

160
00:08:07,239 --> 00:08:10,634
does the tool respect the gateway as the
source of truth?

161
00:08:10,634 --> 00:08:14,237
That's boring until you've supported a
real team,

162
00:08:14,237 --> 00:08:17,400
and then it's EVERYTHING.Yep.

163
00:08:17,400 --> 00:08:21,048
The little quality-of-life fixes are
often the ones that tell you a product's

164
00:08:21,048 --> 00:08:22,198
growing up.

165
00:08:22,198 --> 00:08:25,779
When the tool stops assuming your setup
looks like the vendor's demo

166
00:08:25,779 --> 00:08:29,642
and starts asking your infrastructure
what it actually is...

167
00:08:29,642 --> 00:08:31,721
that's when it becomes properly useful.

168
00:08:31,721 --> 00:08:37,786
Anyway, give your /v1/models endpoint a
squiz before you trust the pretty

169
00:08:37,786 --> 00:08:38,202
menu.

170
00:08:38,202 --> 00:08:40,560
Catch you next time.

171
00:08:38,202 --> 00:08:40,560
See you.
