feat: Add support for SiliconFlow provider charge and knowledge base improvements

This commit is contained in:
kangfenmao 2025-02-08 23:53:28 +08:00
parent e1a04030b5
commit cb3db57d2f
7 changed files with 32 additions and 11 deletions

View File

@ -165,6 +165,7 @@ export class WindowService {
const oauthProviderUrls = [ const oauthProviderUrls = [
'https://account.siliconflow.cn/oauth', 'https://account.siliconflow.cn/oauth',
'https://cloud.siliconflow.cn/expensebill',
'https://aihubmix.com/oauth', 'https://aihubmix.com/oauth',
'https://aihubmix.com/topup' 'https://aihubmix.com/topup'
] ]

View File

@ -1,6 +1,7 @@
export const DEFAULT_TEMPERATURE = 1.0 export const DEFAULT_TEMPERATURE = 1.0
export const DEFAULT_CONTEXTCOUNT = 5 export const DEFAULT_CONTEXTCOUNT = 5
export const DEFAULT_MAX_TOKENS = 4096 export const DEFAULT_MAX_TOKENS = 4096
export const DEFAULT_KNOWLEDGE_DOCUMENT_COUNT = 6
export const FONT_FAMILY = export const FONT_FAMILY =
"Ubuntu, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif" "Ubuntu, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif"

View File

@ -1,5 +1,6 @@
import { WarningOutlined } from '@ant-design/icons' import { WarningOutlined } from '@ant-design/icons'
import { TopView } from '@renderer/components/TopView' import { TopView } from '@renderer/components/TopView'
import { DEFAULT_KNOWLEDGE_DOCUMENT_COUNT } from '@renderer/config/constant'
import { getEmbeddingMaxContext } from '@renderer/config/embedings' import { getEmbeddingMaxContext } from '@renderer/config/embedings'
import { isEmbeddingModel } from '@renderer/config/models' import { isEmbeddingModel } from '@renderer/config/models'
import { useKnowledge } from '@renderer/hooks/useKnowledge' import { useKnowledge } from '@renderer/hooks/useKnowledge'
@ -59,7 +60,7 @@ const PopupContainer: React.FC<Props> = ({ base: _base, resolve }) => {
const newBase = { const newBase = {
...base, ...base,
name: values.name, name: values.name,
documentCount: values.documentCount, documentCount: values.documentCount || DEFAULT_KNOWLEDGE_DOCUMENT_COUNT,
chunkSize: values.chunkSize, chunkSize: values.chunkSize,
chunkOverlap: values.chunkOverlap chunkOverlap: values.chunkOverlap
} }
@ -89,6 +90,7 @@ const PopupContainer: React.FC<Props> = ({ base: _base, resolve }) => {
onCancel={onCancel} onCancel={onCancel}
afterClose={onClose} afterClose={onClose}
destroyOnClose destroyOnClose
maskClosable={false}
centered> centered>
<Form form={form} layout="vertical"> <Form form={form} layout="vertical">
<Form.Item <Form.Item

View File

@ -22,7 +22,7 @@ import { isProviderSupportAuth, isProviderSupportCharge } from '@renderer/servic
import { useAppDispatch } from '@renderer/store' import { useAppDispatch } from '@renderer/store'
import { setModel } from '@renderer/store/assistants' import { setModel } from '@renderer/store/assistants'
import { Model, ModelType, Provider } from '@renderer/types' import { Model, ModelType, Provider } from '@renderer/types'
import { aihubmixCharge } from '@renderer/utils/oauth' import { providerCharge } from '@renderer/utils/oauth'
import { Avatar, Button, Card, Checkbox, Divider, Flex, Input, Popover, Space, Switch } from 'antd' import { Avatar, Button, Card, Checkbox, Divider, Flex, Input, Popover, Space, Switch } from 'antd'
import Link from 'antd/es/typography/Link' import Link from 'antd/es/typography/Link'
import { groupBy, isEmpty } from 'lodash' import { groupBy, isEmpty } from 'lodash'
@ -272,12 +272,14 @@ const ProviderSetting: FC<Props> = ({ provider: _provider }) => {
</Space.Compact> </Space.Compact>
{apiKeyWebsite && ( {apiKeyWebsite && (
<SettingHelpTextRow style={{ justifyContent: 'space-between' }}> <SettingHelpTextRow style={{ justifyContent: 'space-between' }}>
<HStack gap={10}> <HStack gap={5}>
<SettingHelpLink target="_blank" href={apiKeyWebsite}> <SettingHelpLink target="_blank" href={apiKeyWebsite}>
{t('settings.provider.get_api_key')} {t('settings.provider.get_api_key')}
</SettingHelpLink> </SettingHelpLink>
{isProviderSupportCharge(provider) && ( {isProviderSupportCharge(provider) && (
<SettingHelpLink onClick={aihubmixCharge}>{t('settings.provider.charge')}</SettingHelpLink> <SettingHelpLink onClick={() => providerCharge(provider.id)}>
{t('settings.provider.charge')}
</SettingHelpLink>
)} )}
</HStack> </HStack>
<SettingHelpText>{t('settings.provider.api_key.tip')}</SettingHelpText> <SettingHelpText>{t('settings.provider.api_key.tip')}</SettingHelpText>

View File

@ -1,4 +1,5 @@
import type { ExtractChunkData } from '@llm-tools/embedjs-interfaces' import type { ExtractChunkData } from '@llm-tools/embedjs-interfaces'
import { DEFAULT_KNOWLEDGE_DOCUMENT_COUNT } from '@renderer/config/constant'
import { getEmbeddingMaxContext } from '@renderer/config/embedings' import { getEmbeddingMaxContext } from '@renderer/config/embedings'
import AiProvider from '@renderer/providers/AiProvider' import AiProvider from '@renderer/providers/AiProvider'
import { FileType, KnowledgeBase, KnowledgeBaseParams, Message } from '@renderer/types' import { FileType, KnowledgeBase, KnowledgeBaseParams, Message } from '@renderer/types'
@ -90,13 +91,13 @@ export const getKnowledgeReferences = async (base: KnowledgeBase, message: Messa
}) })
) )
const documentCount = base.documentCount || 6 const documentCount = base.documentCount || DEFAULT_KNOWLEDGE_DOCUMENT_COUNT
const references = await Promise.all( const references = await Promise.all(
take(_searchResults, documentCount).map(async (item, index) => { take(_searchResults, documentCount).map(async (item, index) => {
const baseItem = base.items.find((i) => i.uniqueId === item.metadata.uniqueLoaderId) const baseItem = base.items.find((i) => i.uniqueId === item.metadata.uniqueLoaderId)
return { return {
id: index, id: index + 1,
content: item.pageContent, content: item.pageContent,
sourceUrl: await getKnowledgeSourceUrl(item), sourceUrl: await getKnowledgeSourceUrl(item),
type: baseItem?.type type: baseItem?.type

View File

@ -21,6 +21,6 @@ export function isProviderSupportAuth(provider: Provider) {
} }
export function isProviderSupportCharge(provider: Provider) { export function isProviderSupportCharge(provider: Provider) {
const supportProviders = ['aihubmix'] const supportProviders = ['silicon', 'aihubmix']
return supportProviders.includes(provider.id) return supportProviders.includes(provider.id)
} }

View File

@ -58,11 +58,25 @@ export const oauthWithAihubmix = async (setKey) => {
window.addEventListener('message', messageHandler) window.addEventListener('message', messageHandler)
} }
export const aihubmixCharge = async () => { export const providerCharge = async (provider: string) => {
const chargeUrl = `https://aihubmix.com/topup?client_id=cherry_studio_oauth&lang=${getLanguageCode()}&aff=SJyh` const chargeUrlMap = {
silicon: {
url: 'https://cloud.siliconflow.cn/expensebill',
width: 900,
height: 700
},
aihubmix: {
url: `https://aihubmix.com/topup?client_id=cherry_studio_oauth&lang=${getLanguageCode()}&aff=SJyh`,
width: 720,
height: 900
}
}
const { url, width, height } = chargeUrlMap[provider]
window.open( window.open(
chargeUrl, url,
'oauth', 'oauth',
'width=720,height=900,toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,alwaysOnTop=yes,alwaysRaised=yes' `width=${width},height=${height},toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,alwaysOnTop=yes,alwaysRaised=yes`
) )
} }