Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions components/ambient-api-server/plugins/agents/model.go
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ type Agent struct {
Prompt *string `json:"prompt" gorm:"type:text"`
RepoUrl *string `json:"repo_url"`
WorkflowId *string `json:"workflow_id"`
LlmModel string `json:"llm_model" gorm:"default:'sonnet'"`
LlmModel string `json:"llm_model" gorm:"default:'claude-sonnet-4-6'"`
LlmTemperature float64 `json:"llm_temperature" gorm:"default:0.7"`
LlmMaxTokens int32 `json:"llm_max_tokens" gorm:"default:4000"`
BotAccountName *string `json:"bot_account_name"`
Expand All @@ -41,7 +41,7 @@ func (l AgentList) Index() AgentIndex {
func (d *Agent) BeforeCreate(tx *gorm.DB) error {
d.ID = api.NewID()
if d.LlmModel == "" {
d.LlmModel = "sonnet"
d.LlmModel = "claude-sonnet-4-6"
}
if d.LlmTemperature == 0 {
d.LlmTemperature = 0.7
Expand Down
4 changes: 2 additions & 2 deletions components/ambient-api-server/plugins/sessions/integration_test.go
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -612,7 +612,7 @@ func TestSessionLlmDefaults(t *testing.T) {
Expect(resp.StatusCode).To(Equal(http.StatusCreated))

Expect(created.LlmModel).NotTo(BeNil(), "llm_model should be defaulted")
Expect(*created.LlmModel).To(Equal("sonnet"))
Expect(*created.LlmModel).To(Equal("claude-sonnet-4-6"))
Expect(created.LlmTemperature).NotTo(BeNil(), "llm_temperature should be defaulted")
Expect(*created.LlmTemperature).To(BeNumerically("~", 0.7, 0.001))
Expect(created.LlmMaxTokens).NotTo(BeNil(), "llm_max_tokens should be defaulted")
Expand All @@ -621,7 +621,7 @@ func TestSessionLlmDefaults(t *testing.T) {
fetched, resp, err := client.DefaultAPI.ApiAmbientV1SessionsIdGet(ctx, *created.Id).Execute()
Expect(err).NotTo(HaveOccurred())
Expect(resp.StatusCode).To(Equal(http.StatusOK))
Expect(*fetched.LlmModel).To(Equal("sonnet"))
Expect(*fetched.LlmModel).To(Equal("claude-sonnet-4-6"))
Expect(*fetched.LlmTemperature).To(BeNumerically("~", 0.7, 0.001))
Expect(*fetched.LlmMaxTokens).To(Equal(int32(4000)))
}
Expand Down
2 changes: 1 addition & 1 deletion components/ambient-api-server/plugins/sessions/model.go
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func (d *Session) BeforeCreate(tx *gorm.DB) error {
d.KubeCrName = &d.ID

if d.LlmModel == nil || *d.LlmModel == "" {
defaultModel := "sonnet"
defaultModel := "claude-sonnet-4-6"
d.LlmModel = &defaultModel
}
if d.LlmTemperature == nil {
Expand Down
39 changes: 20 additions & 19 deletions components/backend/handlers/models_test.go
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,17 @@ var _ = Describe("Models Handler", Label(test_constants.LabelUnit, test_constant

validManifestObj := types.ModelManifest{
Version: 2,
DefaultModel: "claude-sonnet-4-5",
DefaultModel: "claude-sonnet-4-6",
ProviderDefaults: map[string]string{
"anthropic": "claude-sonnet-4-5",
"anthropic": "claude-sonnet-4-6",
"google": "gemini-2.5-flash",
},
Models: []types.ModelEntry{
{ID: "claude-sonnet-4-5", Label: "Claude Sonnet 4.5", VertexID: "claude-sonnet-4-5@20250929", Provider: "anthropic", Available: true, FeatureGated: false},
{ID: "claude-opus-4-6", Label: "Claude Opus 4.6", VertexID: "claude-opus-4-6@default", Provider: "anthropic", Available: true, FeatureGated: true},
{ID: "claude-opus-4-5", Label: "Claude Opus 4.5", VertexID: "claude-opus-4-5@20251101", Provider: "anthropic", Available: true, FeatureGated: false},
{ID: "claude-haiku-4-5", Label: "Claude Haiku 4.5", VertexID: "claude-haiku-4-5@20251001", Provider: "anthropic", Available: true, FeatureGated: false},
{ID: "claude-sonnet-4-6", Label: "Claude Sonnet 4.6", VertexID: "claude-sonnet-4-6@default", Provider: "anthropic", Available: true, FeatureGated: false},
{ID: "gemini-2.5-flash", Label: "Gemini 2.5 Flash", VertexID: "gemini-2.5-flash", Provider: "google", Available: true, FeatureGated: false},
{ID: "gemini-2.5-pro", Label: "Gemini 2.5 Pro", VertexID: "gemini-2.5-pro", Provider: "google", Available: true, FeatureGated: true},
},
Expand Down Expand Up @@ -136,9 +137,9 @@ var _ = Describe("Models Handler", Label(test_constants.LabelUnit, test_constant
var resp types.ListModelsResponse
err := json.Unmarshal(httpTestUtils.GetResponseRecorder().Body.Bytes(), &resp)
Expect(err).NotTo(HaveOccurred())
// With no Unleash configured, IsModelEnabled returns true, so all 6 models pass
Expect(resp.Models).To(HaveLen(6))
Expect(resp.DefaultModel).To(Equal("claude-sonnet-4-5"))
// With no Unleash configured, IsModelEnabled returns true, so all 7 models pass
Expect(resp.Models).To(HaveLen(7))
Expect(resp.DefaultModel).To(Equal("claude-sonnet-4-6"))
})

It("should include model when workspace override is true", func() {
Expand Down Expand Up @@ -230,9 +231,9 @@ var _ = Describe("Models Handler", Label(test_constants.LabelUnit, test_constant
err := json.Unmarshal(httpTestUtils.GetResponseRecorder().Body.Bytes(), &resp)
Expect(err).NotTo(HaveOccurred())

// opus-4-6 excluded by override; the other 5 should still be present
// (default model + 4 non-default models via Unleash fallback which returns true when not configured)
Expect(resp.Models).To(HaveLen(5))
// opus-4-6 excluded by override; the other 6 should still be present
// (default model + 5 non-default models via Unleash fallback which returns true when not configured)
Expect(resp.Models).To(HaveLen(6))
ids := make([]string, len(resp.Models))
for i, m := range resp.Models {
ids[i] = m.ID
Expand Down Expand Up @@ -262,7 +263,7 @@ var _ = Describe("Models Handler", Label(test_constants.LabelUnit, test_constant

var foundDefault bool
for _, m := range resp.Models {
if m.ID == "claude-sonnet-4-5" && m.IsDefault {
if m.ID == "claude-sonnet-4-6" && m.IsDefault {
foundDefault = true
break
}
Expand Down Expand Up @@ -292,7 +293,7 @@ var _ = Describe("Models Handler", Label(test_constants.LabelUnit, test_constant
var resp types.ListModelsResponse
err = json.Unmarshal(httpTestUtils.GetResponseRecorder().Body.Bytes(), &resp)
Expect(err).NotTo(HaveOccurred())
Expect(resp.Models).To(HaveLen(5))
Expect(resp.Models).To(HaveLen(6))

for _, m := range resp.Models {
Expect(m.ID).NotTo(Equal("claude-opus-4-6"))
Expand Down Expand Up @@ -335,9 +336,9 @@ var _ = Describe("Models Handler", Label(test_constants.LabelUnit, test_constant
var resp types.ListModelsResponse
err := json.Unmarshal(httpTestUtils.GetResponseRecorder().Body.Bytes(), &resp)
Expect(err).NotTo(HaveOccurred())
// Cached manifest has 6 models and they go through flag filtering
Expect(resp.Models).To(HaveLen(6))
Expect(resp.DefaultModel).To(Equal("claude-sonnet-4-5"))
// Cached manifest has 7 models and they go through flag filtering
Expect(resp.Models).To(HaveLen(7))
Expect(resp.DefaultModel).To(Equal("claude-sonnet-4-6"))
})

It("should return 503 when JSON is malformed and no cache", func() {
Expand Down Expand Up @@ -376,8 +377,8 @@ var _ = Describe("Models Handler", Label(test_constants.LabelUnit, test_constant
for _, m := range resp.Models {
Expect(m.Provider).To(Equal("anthropic"), "All models should be anthropic")
}
Expect(resp.Models).To(HaveLen(4))
Expect(resp.DefaultModel).To(Equal("claude-sonnet-4-5"))
Expect(resp.Models).To(HaveLen(5))
Expect(resp.DefaultModel).To(Equal("claude-sonnet-4-6"))
})

It("should return only google models when provider=google", func() {
Expand Down Expand Up @@ -420,7 +421,7 @@ var _ = Describe("Models Handler", Label(test_constants.LabelUnit, test_constant
var resp types.ListModelsResponse
err := json.Unmarshal(httpTestUtils.GetResponseRecorder().Body.Bytes(), &resp)
Expect(err).NotTo(HaveOccurred())
Expect(resp.Models).To(HaveLen(6))
Expect(resp.Models).To(HaveLen(7))
})
})

Expand Down Expand Up @@ -459,10 +460,10 @@ var _ = Describe("Models Handler", Label(test_constants.LabelUnit, test_constant
manifest, err := LoadManifest(path)
Expect(err).NotTo(HaveOccurred())
Expect(manifest.Version).To(Equal(2))
Expect(manifest.DefaultModel).To(Equal("claude-sonnet-4-5"))
Expect(manifest.DefaultModel).To(Equal("claude-sonnet-4-6"))
Expect(manifest.ProviderDefaults).To(HaveLen(2))
Expect(manifest.ProviderDefaults["google"]).To(Equal("gemini-2.5-flash"))
Expect(manifest.Models).To(HaveLen(6))
Expect(manifest.Models).To(HaveLen(7))
})

It("should return error when file is missing", func() {
Expand Down Expand Up @@ -492,7 +493,7 @@ var _ = Describe("Models Handler", Label(test_constants.LabelUnit, test_constant
writeManifestFile(validManifest)
setupK8sWithOverrides()

result := isModelAvailable(context.Background(), K8sClient, "claude-sonnet-4-5", "", "test-ns")
result := isModelAvailable(context.Background(), K8sClient, "claude-sonnet-4-6", "", "test-ns")
Expect(result).To(BeTrue())
})

Expand Down
2 changes: 1 addition & 1 deletion components/backend/handlers/sessions.go
Original file line number Diff line number Diff line change
Expand Up @@ -682,7 +682,7 @@ func CreateSession(c *gin.Context) {

// Set defaults for LLM settings if not provided
llmSettings := types.LLMSettings{
Model: "claude-sonnet-4-5",
Model: "claude-sonnet-4-6",
Temperature: 0.7,
MaxTokens: 4000,
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import { NewSessionView } from '../new-session-view';

vi.mock('../runner-model-selector', () => ({
RunnerModelSelector: ({ onSelect }: { onSelect: (r: string, m: string) => void }) => (
<button data-testid="runner-model-selector" onClick={() => onSelect('claude-agent-sdk', 'claude-sonnet-4-5')}>
claude-agent-sdk · Claude Sonnet 4.5
<button data-testid="runner-model-selector" onClick={() => onSelect('claude-agent-sdk', 'claude-sonnet-4-6')}>
claude-agent-sdk · Claude Sonnet 4.6
</button>
),
getDefaultModel: () => 'claude-sonnet-4-5',
getDefaultModel: () => 'claude-sonnet-4-6',
}));

vi.mock('@/services/queries/use-runner-types', () => ({
Expand All @@ -27,10 +27,10 @@ vi.mock('@/services/queries/use-models', () => ({
useModels: () => ({
data: {
models: [
{ id: 'claude-sonnet-4-5', label: 'Claude Sonnet 4.5', provider: 'anthropic', isDefault: true },
{ id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', provider: 'anthropic', isDefault: false },
{ id: 'claude-sonnet-4-5', label: 'Claude Sonnet 4.5', provider: 'anthropic', isDefault: false },
{ id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', provider: 'anthropic', isDefault: true },
],
defaultModel: 'claude-sonnet-4-5',
defaultModel: 'claude-sonnet-4-6',
},
isLoading: false,
}),
Expand Down Expand Up @@ -98,7 +98,7 @@ describe('NewSessionView', () => {
expect.objectContaining({
prompt: 'Build a REST API',
runner: 'claude-agent-sdk',
model: 'claude-sonnet-4-5',
model: 'claude-sonnet-4-6',
})
);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ const mockRunnerTypes: RunnerType[] = [
const mockAnthropicModels: ListModelsResponse = {
models: [
{ id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5', provider: 'anthropic', isDefault: false },
{ id: 'claude-sonnet-4-5', label: 'Claude Sonnet 4.5', provider: 'anthropic', isDefault: true },
{ id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', provider: 'anthropic', isDefault: false },
{ id: 'claude-sonnet-4-5', label: 'Claude Sonnet 4.5', provider: 'anthropic', isDefault: false },
{ id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', provider: 'anthropic', isDefault: true },
{ id: 'claude-opus-4-5', label: 'Claude Opus 4.5', provider: 'anthropic', isDefault: false },
{ id: 'claude-opus-4-6', label: 'Claude Opus 4.6', provider: 'anthropic', isDefault: false },
],
defaultModel: 'claude-sonnet-4-5',
defaultModel: 'claude-sonnet-4-6',
};

const mockUseRunnerTypes = vi.fn(() => ({ data: mockRunnerTypes }));
Expand All @@ -49,7 +49,7 @@ describe('RunnerModelSelector', () => {
const defaultProps = {
projectName: 'test-project',
selectedRunner: 'claude-code',
selectedModel: 'claude-sonnet-4-5',
selectedModel: 'claude-sonnet-4-6',
onSelect: vi.fn(),
};

Expand All @@ -63,7 +63,7 @@ describe('RunnerModelSelector', () => {
render(<RunnerModelSelector {...defaultProps} />);
const button = screen.getByRole('button');
expect(button.textContent).toContain('Claude Code');
expect(button.textContent).toContain('Claude Sonnet 4.5');
expect(button.textContent).toContain('Claude Sonnet 4.6');
});

it('renders trigger button with unknown runner fallback', () => {
Expand Down
6 changes: 3 additions & 3 deletions components/manifests/base/core/models.json
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"version": 2,
"defaultModel": "claude-sonnet-4-5",
"defaultModel": "claude-sonnet-4-6",
"providerDefaults": {
"anthropic": "claude-sonnet-4-5",
"anthropic": "claude-sonnet-4-6",
"google": "gemini-2.5-flash"
},
"models": [
Expand Down Expand Up @@ -44,7 +44,7 @@
"vertexId": "claude-sonnet-4-6@default",
"provider": "anthropic",
"available": true,
"featureGated": true
"featureGated": false
},
{
"id": "gemini-2.5-flash",
Expand Down
2 changes: 1 addition & 1 deletion components/manifests/base/crds/agenticsessions-crd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ spec:
properties:
model:
type: string
default: "claude-3-7-sonnet-latest"
default: "claude-sonnet-4-6"
temperature:
type: number
default: 0.7
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ async def setup_sdk_authentication(context: RunnerContext) -> tuple[str, bool, s
model = context.get_env("LLM_MODEL")

# Default model differs: Vertex AI uses @date suffixes, Anthropic API does not
DEFAULT_MODEL = "claude-sonnet-4-5"
DEFAULT_VERTEX_MODEL = "claude-sonnet-4-5@20250929"
DEFAULT_MODEL = "claude-sonnet-4-6"
DEFAULT_VERTEX_MODEL = "claude-sonnet-4-6@default"

if api_key and not use_vertex:
os.environ["ANTHROPIC_API_KEY"] = api_key
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ async def test_default_model_when_none_specified(self, monkeypatch):
monkeypatch.delenv("ANTHROPIC_API_KEY", raising=False)
ctx = _make_context(ANTHROPIC_API_KEY="sk-key")
_, _, model = await setup_sdk_authentication(ctx)
assert model == "claude-sonnet-4-5"
assert model == "claude-sonnet-4-6"
assert "@" not in model # no Vertex date suffix for API key auth

@pytest.mark.asyncio
Expand Down
Loading