From c02e5720c28373fa53cba8b236ae24bfe02aa4a6 Mon Sep 17 00:00:00 2001 From: Arvin Xu Date: Wed, 10 Jun 2026 16:57:57 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(model-bank):=20add=20claude-fa?= =?UTF-8?q?ble-5=20to=20Anthropic=20models=20(#15639)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ feat(model-bank): add claude-fable-5 to Anthropic models Co-Authored-By: Claude Fable 5 * 🐛 fix(agent): allow adding directory topics on web when agent targets a bound device Co-Authored-By: Claude Fable 5 --------- Co-authored-by: Claude Fable 5 --- packages/model-bank/src/aiModels/anthropic.ts | 31 +++++++++++++++++++ .../ByProjectMode/GroupItem.tsx | 7 ++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/model-bank/src/aiModels/anthropic.ts b/packages/model-bank/src/aiModels/anthropic.ts index e79ee23cc8..04d93f903a 100644 --- a/packages/model-bank/src/aiModels/anthropic.ts +++ b/packages/model-bank/src/aiModels/anthropic.ts @@ -1,6 +1,37 @@ import { type AIChatModelCard } from '../types/aiModel'; const anthropicChatModels: AIChatModelCard[] = [ + { + abilities: { + functionCall: true, + reasoning: true, + search: true, + structuredOutput: true, + vision: true, + }, + contextWindowTokens: 1_000_000, + description: + "Claude Fable 5 is Anthropic's most capable model — a new tier above Opus for the most demanding reasoning and long-horizon agentic work.", + displayName: 'Claude Fable 5', + enabled: true, + id: 'claude-fable-5', + maxOutput: 128_000, + pricing: { + units: [ + { name: 'textInput_cacheRead', rate: 1, strategy: 'fixed', unit: 'millionTokens' }, + { name: 'textInput', rate: 10, strategy: 'fixed', unit: 'millionTokens' }, + { name: 'textOutput', rate: 50, strategy: 'fixed', unit: 'millionTokens' }, + { name: 'textInput_cacheWrite', rate: 12.5, strategy: 'fixed', unit: 'millionTokens' }, + ], + }, + releasedAt: '2026-06-09', + settings: { + disabledParams: ['temperature', 'top_p'], + extendParams: ['disableContextCaching', 'enableAdaptiveThinking', 'opus47Effort'], + searchImpl: 'params', + }, + type: 'chat', + }, { abilities: { functionCall: true, diff --git a/src/routes/(main)/agent/_layout/Sidebar/Topic/TopicListContent/ByProjectMode/GroupItem.tsx b/src/routes/(main)/agent/_layout/Sidebar/Topic/TopicListContent/ByProjectMode/GroupItem.tsx index 8772f4d662..462365b930 100644 --- a/src/routes/(main)/agent/_layout/Sidebar/Topic/TopicListContent/ByProjectMode/GroupItem.tsx +++ b/src/routes/(main)/agent/_layout/Sidebar/Topic/TopicListContent/ByProjectMode/GroupItem.tsx @@ -7,6 +7,7 @@ import { useTranslation } from 'react-i18next'; import { isDesktop } from '@/const/version'; import { useCommitWorkingDirectory } from '@/features/ChatInput/ControlBar/useCommitWorkingDirectory'; import { useAgentStore } from '@/store/agent'; +import { agentByIdSelectors } from '@/store/agent/selectors'; import { useChatStore } from '@/store/chat'; import TopicItem from '../../List/Item'; @@ -24,6 +25,7 @@ const GroupItem = memo(({ group, activeTopicId, activeT ); const agentId = useAgentStore((s) => s.activeAgentId); + const agencyConfig = useAgentStore(agentByIdSelectors.getAgencyConfigById(agentId ?? '')); const { commitAgentDefault } = useCommitWorkingDirectory(agentId ?? ''); const handleAddTopic = useCallback(async () => { @@ -35,7 +37,10 @@ const GroupItem = memo(({ group, activeTopicId, activeT useChatStore.getState().switchTopic(null, { skipRefreshMessage: true }); }, [workingDirectory, agentId, commitAgentDefault]); - const canAddTopic = isDesktop && !!workingDirectory; + // Web can add a topic in a directory too when the agent targets a bound + // device — the write goes to `workingDirByDevice`, no Electron dependency. + const isDeviceMode = agencyConfig?.executionTarget === 'device' && !!agencyConfig?.boundDeviceId; + const canAddTopic = (isDesktop || isDeviceMode) && !!workingDirectory; return (