Skip to content

Commit 4ed12d1

Browse files
committed
feat: 增加限时公益模型,可以免费体验更强的模型
1 parent 5706d52 commit 4ed12d1

File tree

7 files changed

+57
-8
lines changed

7 files changed

+57
-8
lines changed

messages/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -935,7 +935,8 @@
935935
"header": {
936936
"configApiKey": "Configure API KEY",
937937
"clearChat": "Clear Chat",
938-
"selectPrompt": "Select Prompt"
938+
"selectPrompt": "Select Prompt",
939+
"noModel": "AI model not selected"
939940
},
940941
"clipboard": {
941942
"image": {

messages/ja.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,8 @@
899899
"configApiKey": "API KEY の設定",
900900
"clearChat": "チャットをクリア",
901901
"configPrompt": "マスクの設定",
902-
"selectPrompt": "マスクを選択"
902+
"selectPrompt": "マスクを選択",
903+
"noModel": "AI モデルが選択されていません"
903904
},
904905
"clipboard": {
905906
"image": {

messages/zh.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -913,7 +913,8 @@
913913
"configApiKey": "配置 API KEY",
914914
"clearChat": "清空聊天",
915915
"configPrompt": "配置 Prompt",
916-
"selectPrompt": "选择 Prompt"
916+
"selectPrompt": "选择 Prompt",
917+
"noModel": "未选择 AI 模型"
917918
},
918919
"clipboard": {
919920
"image": {

src/app/core/record/chat/chat-header.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
"use client"
22

3-
import { BotMessageSquare, Drama } from "lucide-react"
3+
import { BotMessageSquare, BotOff, Drama } from "lucide-react"
44
import usePromptStore from "@/stores/prompt"
55
import useSettingStore from "@/stores/setting"
66
import { NewChat } from "./new-chat"
77
import { RemoveChat } from "./remove-chat"
8+
import { useTranslations } from "next-intl"
89

910
export function ChatHeader() {
11+
const t = useTranslations('record.chat.header')
1012
const { currentPrompt } = usePromptStore()
1113
const { primaryModel, aiModelList } = useSettingStore()
1214

@@ -18,13 +20,17 @@ export function ChatHeader() {
1820
</div>
1921
<div className="flex items-center justify-center gap-1">
2022
{
21-
primaryModel &&
23+
aiModelList?.find(model => model.key === primaryModel) ?
2224
<>
2325
<BotMessageSquare className="!size-4" />
2426
<span className="line-clamp-1 flex-1 md:flex-none">
2527
{aiModelList?.find(model => model.key === primaryModel)?.model}
2628
({aiModelList?.find(model => model.key === primaryModel)?.title})
2729
</span>
30+
</> :
31+
<>
32+
<BotOff className="!size-4" />
33+
<span>{t('noModel')}</span>
2834
</>
2935
}
3036
</div>

src/app/core/record/chat/model-select.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,22 @@ import { TooltipButton } from "@/components/tooltip-button"
2626

2727
export function ModelSelect() {
2828
const [list, setList] = useState<AiConfig[]>([])
29-
const { primaryModel, setPrimaryModel, aiModelList } = useSettingStore()
29+
const { primaryModel, setPrimaryModel, aiModelList, initSettingData } = useSettingStore()
3030
const [open, setOpen] = React.useState(false)
3131
const t = useTranslations('record.chat.input.modelSelect')
3232

33+
3334
async function modelSelectChangeHandler(key: string) {
3435
setPrimaryModel(key)
3536
const store = await Store.load('store.json');
3637
store.set('primaryModel', key)
3738
}
3839

40+
function handleSetOpen(isOpen: boolean) {
41+
setOpen(isOpen)
42+
initSettingData()
43+
}
44+
3945
// 监听 aiModelList 变化,实时更新本地列表
4046
useEffect(() => {
4147
if (aiModelList && aiModelList.length > 0) {
@@ -47,7 +53,7 @@ export function ModelSelect() {
4753
}, [aiModelList])
4854

4955
return (
50-
<Popover open={open} onOpenChange={setOpen}>
56+
<Popover open={open} onOpenChange={handleSetOpen}>
5157
<PopoverTrigger asChild>
5258
<div className="hidden md:block">
5359
<TooltipButton

src/app/core/setting/ai/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export default function AiPage() {
4040
} = useSettingStore()
4141

4242
// 过滤掉默认模型,只显示用户自定义模型
43-
const userCustomModels = aiModelList.filter(model => !noteGenModelKeys.includes(model.key))
43+
const userCustomModels = aiModelList.filter(model => !noteGenModelKeys.includes(model.key) && model.title !== 'NoteGen Limited')
4444
const [apiKey, setApiKey] = useState<string>('')
4545
const [baseURL, setBaseURL] = useState<string>('')
4646
const [model, setModel] = useState<string>('')

src/stores/setting.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { getVersion } from '@tauri-apps/api/app'
44
import { AiConfig } from '@/app/core/setting/config'
55
import { GitlabInstanceType } from '@/lib/gitlab.types'
66
import { noteGenDefaultModels, noteGenModelKeys } from '@/app/model-config'
7+
import { fetch } from '@tauri-apps/plugin-http'
8+
import { v4 as uuid } from 'uuid';
79

810
export enum GenTemplateRange {
911
All = 'all',
@@ -210,6 +212,38 @@ const useSettingStore = create<SettingState>((set, get) => ({
210212
set({ imageMethodModel: 'note-gen-vlm' })
211213
}
212214

215+
// 获取 NoteGen 限时免费模型
216+
const apiKey = noteGenDefaultModels[0].apiKey
217+
const headers = {
218+
'Content-Type': 'application/json',
219+
'Authorization': `Bearer ${apiKey}`
220+
}
221+
const res = await fetch('http://api.notegen.top/v1/models', {
222+
method: 'GET',
223+
headers
224+
})
225+
226+
const resModels = await res.json()
227+
228+
if (resModels.data && resModels.data.length > 0) {
229+
finalAiModelList = finalAiModelList.filter(model => model.title !== 'NoteGen Limited')
230+
const limitFreeModels = resModels.data.filter((model: any) => {
231+
return noteGenDefaultModels.every(item => item.model !== model.id)
232+
}).map((model: any) => ({
233+
apiKey,
234+
baseURL: "http://api.notegen.top/v1",
235+
"key": uuid(),
236+
"model": model.id,
237+
"modelType": "chat",
238+
"temperature": 0.7,
239+
"title": "NoteGen Limited",
240+
"topP": 1
241+
}))
242+
finalAiModelList.unshift(...limitFreeModels)
243+
await store.set('aiModelList', finalAiModelList)
244+
set({ aiModelList: finalAiModelList })
245+
}
246+
213247
Object.entries(get()).forEach(async ([key, value]) => {
214248
const res = await store.get(key)
215249

0 commit comments

Comments
 (0)