Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
30 changes: 30 additions & 0 deletions backend/app/repositories/knowledge_base.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import logging
from typing import List

from app.utils import get_bedrock_agent_client
from app.repositories.models.custom_bot_kb import (
BedrockAgentGetKnowledgeBaseResponse,
KnowledgeBase,
KnowledgeBaseConfiguration,
)
from app.routes.schemas.knowledge_base import KnowledgeBaseListItem
Comment thread
mludvig marked this conversation as resolved.

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
Expand Down Expand Up @@ -33,3 +35,31 @@ def get_knowledge_base_info(
knowledge_base_configuration=KnowledgeBaseConfiguration(type="VECTOR")
)
)


def list_knowledge_bases() -> List[KnowledgeBaseListItem]:
"""List all available knowledge bases in the account."""
client = get_bedrock_agent_client()
knowledge_bases: List[KnowledgeBaseListItem] = []

try:
paginator = client.get_paginator("list_knowledge_bases")
page_iterator = paginator.paginate()

for page in page_iterator:
for kb in page.get("knowledgeBaseSummaries", []):
knowledge_bases.append(
KnowledgeBaseListItem(
knowledge_base_id=kb.get("knowledgeBaseId", ""),
name=kb.get("name", ""),
Comment thread
mludvig marked this conversation as resolved.
Outdated
description=kb.get("description"),
status=kb.get("status", "UNKNOWN"),
)
)

logger.info(f"Found {len(knowledge_bases)} knowledge bases")
return knowledge_bases

except Exception as e:
logger.error(f"Failed to list knowledge bases: {e}")
return []
Comment thread
mludvig marked this conversation as resolved.
10 changes: 10 additions & 0 deletions backend/app/routes/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from app.dependencies import check_creating_bot_allowed
from app.repositories.custom_bot import find_bot_by_id
from app.repositories.knowledge_base import list_knowledge_bases
from app.routes.schemas.bot import (
BotInput,
BotMetaOutput,
Expand All @@ -14,6 +15,7 @@
BotSwitchVisibilityInput,
Tool,
)
from app.routes.schemas.knowledge_base import ListKnowledgeBasesResponse
Comment thread
mludvig marked this conversation as resolved.
from app.routes.schemas.conversation import type_model_name
from app.usecases.bot import (
create_new_bot,
Expand Down Expand Up @@ -165,3 +167,11 @@ def get_bot_available_tools(request: Request, bot_id: str):
"""Get available tools for bot"""
tools = fetch_available_agent_tools()
return tools


@router.get("/knowledge-bases", response_model=ListKnowledgeBasesResponse)
def get_knowledge_bases(request: Request):
Comment thread
mludvig marked this conversation as resolved.
Outdated
"""List all available knowledge bases in the account."""
current_user: User = request.state.current_user
Comment thread
mludvig marked this conversation as resolved.
Outdated
knowledge_bases = list_knowledge_bases()
return ListKnowledgeBasesResponse(knowledge_bases=knowledge_bases)
37 changes: 31 additions & 6 deletions frontend/src/features/knowledgeBase/pages/BotKbEditPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ import {
} from '../types';
import { toCamelCase } from '../../../utils/StringUtils';
import useGlobalConfig from '../../../hooks/useGlobalConfig';
import useKnowledgeBaseApi from '../../../hooks/useKnowledgeBaseApi';
Comment thread
mludvig marked this conversation as resolved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cloud you wrap useKnowledgeBaseAPI with useKnowledgeBase needed to be newly created? Please refer another hooks to understand frontend implementation manner.


const edgeGenerationParams = EDGE_GENERATION_PARAMS;

Expand All @@ -82,6 +83,8 @@ const BotKbEditPage: React.FC = () => {
const { availableTools } = useAgent();
const { getGlobalConfig } = useGlobalConfig();
const { data: globalConfig } = getGlobalConfig();
const { listKnowledgeBases } = useKnowledgeBaseApi();
const { data: knowledgeBasesData } = listKnowledgeBases();
Comment thread
mludvig marked this conversation as resolved.
Outdated

const [isLoading, setIsLoading] = useState(false);

Expand Down Expand Up @@ -1604,7 +1607,10 @@ const BotKbEditPage: React.FC = () => {
label={t(
'knowledgeBaseSettings.advancedConfigration.createDedicatedKnowledgeBase.label'
)}
onChange={() => setKnowledgeBaseType('new')}
onChange={() => {
setKnowledgeBaseType('new');
setExistKnowledgeBaseId(null);
}}
/>
<RadioButton
name="knowledgeBaseType"
Expand All @@ -1613,7 +1619,10 @@ const BotKbEditPage: React.FC = () => {
label={t(
'knowledgeBaseSettings.advancedConfigration.createTenantInSharedKnowledgeBase.label'
)}
onChange={() => setKnowledgeBaseType('shared')}
onChange={() => {
setKnowledgeBaseType('shared');
setExistKnowledgeBaseId(null);
}}
/>
<RadioButton
name="knowledgeBaseType"
Expand All @@ -1628,18 +1637,34 @@ const BotKbEditPage: React.FC = () => {

{(() => {
if (knowledgeBaseType === 'existing') {
// Prepare knowledge base options for the dropdown
const knowledgeBaseOptions = (
knowledgeBasesData?.knowledgeBases || []
).map((kb) => ({
value: kb.knowledgeBaseId,
label: `${kb.name} (${kb.knowledgeBaseId})`,
description: kb.description || kb.status,
Comment thread
mludvig marked this conversation as resolved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

description || status mixes different info types. Remove || and conditionally render description only when it exists. Status display is not necessary.

}));

return (
<div className="mt-3 rounded-lg border border-aws-font-color-light/30 p-4 dark:border-aws-font-color-dark/30">
<InputText
<Select

@statefb statefb Dec 12, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In some usecases, users want to enter ID, title, desc with free text format. frontend/src/components/SearchTextBox.tsx should provide better UX (Fetch KB lists and search with title or description).

label={t(
'knowledgeBaseSettings.advancedConfigration.existingKnowledgeBaseId.label'
)}
value={existKnowledgeBaseId ?? ''}
options={knowledgeBaseOptions}
onChange={setExistKnowledgeBaseId}
disabled={!isNewBot}
placeholder="ABCDEFGHIJ"
disabled={knowledgeBaseOptions.length === 0}
/>
<div className="text-sm text-aws-font-color-light/50 dark:text-aws-font-color-dark">
{knowledgeBaseOptions.length === 0 && (
<div className="mt-2 text-sm text-red">
{t(
'knowledgeBaseSettings.advancedConfigration.existingKnowledgeBaseId.noKnowledgeBasesFound'
)}
</div>
)}
<div className="mt-2 text-sm text-aws-font-color-light/50 dark:text-aws-font-color-dark">
{t(
'knowledgeBaseSettings.advancedConfigration.existingKnowledgeBaseId.description'
)}
Expand Down
8 changes: 5 additions & 3 deletions frontend/src/i18n/en/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -947,9 +947,11 @@ How would you categorize this email?`,
},
advancedConfigration: {
existingKnowledgeBaseId: {
label: 'ID for the Amazon Bedrock Knowledge Base',
label: 'Amazon Bedrock Knowledge Base ID',
description:
'Please specify ID that your existing Amazon Bedrock knowledge base.',
'Please specify the ID of your existing Amazon Bedrock knowledge base.',
Comment thread
mludvig marked this conversation as resolved.
Outdated
noKnowledgeBasesFound:
'No knowledge bases found in your account. Please create a knowledge base first.',
},
createDedicatedKnowledgeBase: {
label: 'Create a dedicated Knowledge Base',
Expand All @@ -958,7 +960,7 @@ How would you categorize this email?`,
label: 'Create a tenant in a shared Knowledge Base',
},
useExistingKnowledgeBase: {
label: 'Use your existing Knowledge Base',
label: 'Use an existing Knowledge Base',
},
},
},
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/i18n/ja/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -956,6 +956,8 @@ const translation: typeof en = {
label: '既存のAmazon Bedrock Knowledge BaseのID',
description:
'既存のAmazon Bedrock Knowledge Baseを利用できます',
noKnowledgeBasesFound:
'アカウントにナレッジベースが見つかりません。最初にナレッジベースを作成してください。',
},
createDedicatedKnowledgeBase: {
label: '専用のKnowledge Baseを作成する',
Expand Down