Skip to content
Open
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
24 changes: 12 additions & 12 deletions extensions/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -342,73 +342,73 @@ __metadata:

"@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Fassistant-extension%40workspace%3Aassistant-extension":
version: 0.1.10
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=16006d&locator=%40janhq%2Fassistant-extension%40workspace%3Aassistant-extension"
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=66cb59&locator=%40janhq%2Fassistant-extension%40workspace%3Aassistant-extension"
dependencies:
rxjs: "npm:^7.8.1"
ulidx: "npm:^2.3.0"
peerDependencies:
react: 19.0.0
checksum: 10c0/58a966e7f4aabfe7ee6c34958ca4b90c0de1d1210be9397e8f3fa77dbb4d744c4bc9814647652abd747cdbce630a0035be5e1eb748e38c354199110a5f3dc42f
checksum: 10c0/cdb6b88ccc0796ddb9517f81d172caa64ad71975595fe2205d52cf97157b51b438235b0f7e5c49285531804aeb0b5455aca6e23cadd2a7e412c99f3f71fa2294
languageName: node
linkType: hard

"@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Fconversational-extension%40workspace%3Aconversational-extension":
version: 0.1.10
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=16006d&locator=%40janhq%2Fconversational-extension%40workspace%3Aconversational-extension"
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=66cb59&locator=%40janhq%2Fconversational-extension%40workspace%3Aconversational-extension"
dependencies:
rxjs: "npm:^7.8.1"
ulidx: "npm:^2.3.0"
peerDependencies:
react: 19.0.0
checksum: 10c0/58a966e7f4aabfe7ee6c34958ca4b90c0de1d1210be9397e8f3fa77dbb4d744c4bc9814647652abd747cdbce630a0035be5e1eb748e38c354199110a5f3dc42f
checksum: 10c0/cdb6b88ccc0796ddb9517f81d172caa64ad71975595fe2205d52cf97157b51b438235b0f7e5c49285531804aeb0b5455aca6e23cadd2a7e412c99f3f71fa2294
languageName: node
linkType: hard

"@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Fdownload-extension%40workspace%3Adownload-extension":
version: 0.1.10
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=16006d&locator=%40janhq%2Fdownload-extension%40workspace%3Adownload-extension"
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=66cb59&locator=%40janhq%2Fdownload-extension%40workspace%3Adownload-extension"
dependencies:
rxjs: "npm:^7.8.1"
ulidx: "npm:^2.3.0"
peerDependencies:
react: 19.0.0
checksum: 10c0/58a966e7f4aabfe7ee6c34958ca4b90c0de1d1210be9397e8f3fa77dbb4d744c4bc9814647652abd747cdbce630a0035be5e1eb748e38c354199110a5f3dc42f
checksum: 10c0/cdb6b88ccc0796ddb9517f81d172caa64ad71975595fe2205d52cf97157b51b438235b0f7e5c49285531804aeb0b5455aca6e23cadd2a7e412c99f3f71fa2294
languageName: node
linkType: hard

"@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Fllamacpp-extension%40workspace%3Allamacpp-extension":
version: 0.1.10
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=16006d&locator=%40janhq%2Fllamacpp-extension%40workspace%3Allamacpp-extension"
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=66cb59&locator=%40janhq%2Fllamacpp-extension%40workspace%3Allamacpp-extension"
dependencies:
rxjs: "npm:^7.8.1"
ulidx: "npm:^2.3.0"
peerDependencies:
react: 19.0.0
checksum: 10c0/58a966e7f4aabfe7ee6c34958ca4b90c0de1d1210be9397e8f3fa77dbb4d744c4bc9814647652abd747cdbce630a0035be5e1eb748e38c354199110a5f3dc42f
checksum: 10c0/cdb6b88ccc0796ddb9517f81d172caa64ad71975595fe2205d52cf97157b51b438235b0f7e5c49285531804aeb0b5455aca6e23cadd2a7e412c99f3f71fa2294
languageName: node
linkType: hard

"@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Frag-extension%40workspace%3Arag-extension":
version: 0.1.10
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=16006d&locator=%40janhq%2Frag-extension%40workspace%3Arag-extension"
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=66cb59&locator=%40janhq%2Frag-extension%40workspace%3Arag-extension"
dependencies:
rxjs: "npm:^7.8.1"
ulidx: "npm:^2.3.0"
peerDependencies:
react: 19.0.0
checksum: 10c0/58a966e7f4aabfe7ee6c34958ca4b90c0de1d1210be9397e8f3fa77dbb4d744c4bc9814647652abd747cdbce630a0035be5e1eb748e38c354199110a5f3dc42f
checksum: 10c0/cdb6b88ccc0796ddb9517f81d172caa64ad71975595fe2205d52cf97157b51b438235b0f7e5c49285531804aeb0b5455aca6e23cadd2a7e412c99f3f71fa2294
languageName: node
linkType: hard

"@janhq/core@file:../../core/package.tgz::locator=%40janhq%2Fvector-db-extension%40workspace%3Avector-db-extension":
version: 0.1.10
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=16006d&locator=%40janhq%2Fvector-db-extension%40workspace%3Avector-db-extension"
resolution: "@janhq/core@file:../../core/package.tgz#../../core/package.tgz::hash=66cb59&locator=%40janhq%2Fvector-db-extension%40workspace%3Avector-db-extension"
dependencies:
rxjs: "npm:^7.8.1"
ulidx: "npm:^2.3.0"
peerDependencies:
react: 19.0.0
checksum: 10c0/58a966e7f4aabfe7ee6c34958ca4b90c0de1d1210be9397e8f3fa77dbb4d744c4bc9814647652abd747cdbce630a0035be5e1eb748e38c354199110a5f3dc42f
checksum: 10c0/cdb6b88ccc0796ddb9517f81d172caa64ad71975595fe2205d52cf97157b51b438235b0f7e5c49285531804aeb0b5455aca6e23cadd2a7e412c99f3f71fa2294
languageName: node
linkType: hard

Expand Down
18 changes: 13 additions & 5 deletions web-app/src/containers/Capabilities.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ const Capabilities = ({ capabilities }: CapabilitiesProps) => {
{filteredCapabilities.map((capability: string, capIndex: number) => {
let icon = null

// Embedding models get special treatment with a distinct visual style
const isEmbedding = capability === 'embeddings'

if (capability === 'vision') {
icon = <IconEye className="size-4" />
} else if (capability === 'tools') {
Expand All @@ -44,24 +47,29 @@ const Capabilities = ({ capabilities }: CapabilitiesProps) => {
icon = null
}

// Special badge style for embedding models
const badgeClass = isEmbedding
? 'flex items-center gap-1 px-1.5 h-5 bg-amber-500/10 border border-amber-500/20 rounded text-amber-600 dark:text-amber-400 justify-center last:mr-1 hover:bg-amber-500/20 transition-all text-[10px] font-medium'
: 'flex items-center gap-1 size-5 bg-main-view-fg/5 rounded text-main-view-fg/50 justify-center last:mr-1 hover:text-main-view-fg transition-all'

return (
<Fragment key={`capability-${capIndex}`}>
{icon && (
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<span
className="flex items-center gap-1 size-5 bg-main-view-fg/5 rounded text-main-view-fg/50 justify-center last:mr-1 hover:text-main-view-fg transition-all"
title={capability}
>
<span className={badgeClass} title={capability}>
{icon}
{isEmbedding && <span>Embedding</span>}
</span>
</TooltipTrigger>
<TooltipContent>
<p>
{capability === 'web_search'
? 'Web Search'
: capability}
: capability === 'embeddings'
? 'Embedding Model (for RAG/vectors, not chat)'
: capability}
</p>
</TooltipContent>
</Tooltip>
Expand Down
3 changes: 3 additions & 0 deletions web-app/src/containers/DropdownModelProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,9 @@ const DropdownModelProvider = ({
if (!provider.active) return

provider.models.forEach((modelItem) => {
// Skip embedding models - they can't be used for chat
if (modelItem.embedding) return

// Skip models that require API key but don't have one (except llamacpp)
if (
provider &&
Expand Down
8 changes: 7 additions & 1 deletion web-app/src/services/providers/tauri.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export class TauriProvidersService extends DefaultProvidersService {

const runtimeProviders: ModelProvider[] = []
for (const [providerName, value] of EngineManager.instance().engines) {
const models = await value.list().then(list => list.filter(e => !e.embedding)) ?? []
const models = await value.list() ?? []
const provider: ModelProvider = {
active: false,
persist: true,
Expand Down Expand Up @@ -88,12 +88,18 @@ export class TauriProvidersService extends DefaultProvidersService {
}
}

// Add embeddings capability for embedding models
if (model.embedding && !capabilities.includes(ModelCapabilities.EMBEDDINGS)) {
capabilities = [...capabilities, ModelCapabilities.EMBEDDINGS]
}

return {
id: model.id,
model: model.id,
name: model.name,
description: model.description,
capabilities,
embedding: model.embedding, // Preserve embedding flag for filtering in UI
provider: providerName,
settings: Object.values(modelSettings).reduce(
(acc, setting) => {
Expand Down
2 changes: 2 additions & 0 deletions web-app/src/types/modelProviders.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ type Model = {
format?: string
capabilities?: string[]
settings?: Record<string, ProviderSetting>
/** Whether this model is an embedding model (e.g., BERT-based) */
embedding?: boolean
}

/**
Expand Down
Loading
Loading