Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
bit-pm
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
燕伟桐
bit-pm
Commits
e1150749
Unverified
提交
e1150749
authored
5月 12, 2025
作者:
Will Chen
提交者:
GitHub
5月 12, 2025
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix DB schema (#135)
上级
477015b4
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
67 行增加
和
58 行删除
+67
-58
0005_superb_lady_mastermind.sql
drizzle/0005_superb_lady_mastermind.sql
+3
-2
0005_snapshot.json
drizzle/meta/0005_snapshot.json
+11
-4
_journal.json
drizzle/meta/_journal.json
+2
-2
CreateCustomModelDialog.tsx
src/components/CreateCustomModelDialog.tsx
+13
-12
ModelsSection.tsx
src/components/settings/ModelsSection.tsx
+2
-2
schema.ts
src/db/schema.ts
+3
-2
language_model_handlers.ts
src/ipc/handlers/language_model_handlers.ts
+8
-19
ipc_types.ts
src/ipc/ipc_types.ts
+22
-12
language_model_helpers.ts
src/ipc/shared/language_model_helpers.ts
+3
-3
没有找到文件。
drizzle/0005_
hesitant_sister_grimm
.sql
→
drizzle/0005_
superb_lady_mastermind
.sql
浏览文件 @
e1150749
...
...
@@ -8,8 +8,9 @@ CREATE TABLE `language_model_providers` (
);
--> statement-breakpoint
CREATE
TABLE
`language_models`
(
`id`
text
PRIMARY
KEY
NOT
NULL
,
`name`
text
NOT
NULL
,
`id`
integer
PRIMARY
KEY
AUTOINCREMENT
NOT
NULL
,
`display_name`
text
NOT
NULL
,
`api_name`
text
NOT
NULL
,
`provider_id`
text
NOT
NULL
,
`description`
text
,
`max_output_tokens`
integer
,
...
...
drizzle/meta/0005_snapshot.json
浏览文件 @
e1150749
{
"version"
:
"6"
,
"dialect"
:
"sqlite"
,
"id"
:
"
f2ef6f83-09f5-4932-b7a0-4b205ba542e
c"
,
"id"
:
"
424973e5-a102-4b71-8d5d-6160f1609b8
c"
,
"prevId"
:
"ceedb797-6aa3-4a50-b42f-bc85ee08b3df"
,
"tables"
:
{
"apps"
:
{
...
...
@@ -191,13 +191,20 @@
"columns"
:
{
"id"
:
{
"name"
:
"id"
,
"type"
:
"
text
"
,
"type"
:
"
integer
"
,
"primaryKey"
:
true
,
"notNull"
:
true
,
"autoincrement"
:
true
},
"display_name"
:
{
"name"
:
"display_name"
,
"type"
:
"text"
,
"primaryKey"
:
false
,
"notNull"
:
true
,
"autoincrement"
:
false
},
"name"
:
{
"name"
:
"name"
,
"
api_
name"
:
{
"name"
:
"
api_
name"
,
"type"
:
"text"
,
"primaryKey"
:
false
,
"notNull"
:
true
,
...
...
drizzle/meta/_journal.json
浏览文件 @
e1150749
...
...
@@ -40,8 +40,8 @@
{
"idx"
:
5
,
"version"
:
"6"
,
"when"
:
17470
8789038
9
,
"tag"
:
"0005_
hesitant_sister_grimm
"
,
"when"
:
17470
9103622
9
,
"tag"
:
"0005_
superb_lady_mastermind
"
,
"breakpoints"
:
true
}
]
...
...
src/components/CreateCustomModelDialog.tsx
浏览文件 @
e1150749
...
...
@@ -27,8 +27,8 @@ export function CreateCustomModelDialog({
onSuccess
,
providerId
,
}:
CreateCustomModelDialogProps
)
{
const
[
id
,
setId
]
=
useState
(
""
);
const
[
name
,
set
Name
]
=
useState
(
""
);
const
[
apiName
,
setApiName
]
=
useState
(
""
);
const
[
displayName
,
setDisplay
Name
]
=
useState
(
""
);
const
[
description
,
setDescription
]
=
useState
(
""
);
const
[
maxOutputTokens
,
setMaxOutputTokens
]
=
useState
<
string
>
(
""
);
const
[
contextWindow
,
setContextWindow
]
=
useState
<
string
>
(
""
);
...
...
@@ -38,8 +38,8 @@ export function CreateCustomModelDialog({
const
mutation
=
useMutation
({
mutationFn
:
async
()
=>
{
const
params
=
{
id
,
n
ame
,
apiName
,
displayN
ame
,
providerId
,
description
:
description
||
undefined
,
maxOutputTokens
:
maxOutputTokens
...
...
@@ -48,8 +48,9 @@ export function CreateCustomModelDialog({
contextWindow
:
contextWindow
?
parseInt
(
contextWindow
,
10
)
:
undefined
,
};
if
(
!
params
.
id
)
throw
new
Error
(
"Model ID is required"
);
if
(
!
params
.
name
)
throw
new
Error
(
"Model Name is required"
);
if
(
!
params
.
apiName
)
throw
new
Error
(
"Model API name is required"
);
if
(
!
params
.
displayName
)
throw
new
Error
(
"Model display name is required"
);
if
(
maxOutputTokens
&&
isNaN
(
params
.
maxOutputTokens
??
NaN
))
throw
new
Error
(
"Max Output Tokens must be a valid number"
);
if
(
contextWindow
&&
isNaN
(
params
.
contextWindow
??
NaN
))
...
...
@@ -69,8 +70,8 @@ export function CreateCustomModelDialog({
});
const
resetForm
=
()
=>
{
set
Id
(
""
);
setName
(
""
);
set
ApiName
(
""
);
set
Display
Name
(
""
);
setDescription
(
""
);
setMaxOutputTokens
(
""
);
setContextWindow
(
""
);
...
...
@@ -105,9 +106,9 @@ export function CreateCustomModelDialog({
</
Label
>
<
Input
id=
"model-id"
value=
{
id
}
value=
{
apiName
}
onChange=
{
(
e
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
set
Id
(
e
.
target
.
value
)
set
ApiName
(
e
.
target
.
value
)
}
className=
"col-span-3"
placeholder=
"This must match the model expected by the API"
...
...
@@ -121,9 +122,9 @@ export function CreateCustomModelDialog({
</
Label
>
<
Input
id=
"model-name"
value=
{
n
ame
}
value=
{
displayN
ame
}
onChange=
{
(
e
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
setName
(
e
.
target
.
value
)
set
Display
Name
(
e
.
target
.
value
)
}
className=
"col-span-3"
placeholder=
"Human-friendly name for the model"
...
...
src/components/settings/ModelsSection.tsx
浏览文件 @
e1150749
...
...
@@ -46,7 +46,7 @@ export function ModelsSection({ providerId }: ModelsSectionProps) {
<
div
className=
"mt-4 space-y-3"
>
{
models
.
map
((
model
)
=>
(
<
div
key=
{
model
.
n
ame
}
key=
{
model
.
apiN
ame
}
className=
"p-4 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-sm"
>
<
div
className=
"flex justify-between items-center"
>
...
...
@@ -56,7 +56,7 @@ export function ModelsSection({ providerId }: ModelsSectionProps) {
{
/* Optional: Add an edit/delete button here later */
}
</
div
>
<
p
className=
"text-sm text-gray-500 dark:text-gray-400 italic"
>
{
model
.
n
ame
}
{
model
.
apiN
ame
}
</
p
>
{
model
.
description
&&
(
<
p
className=
"text-sm text-gray-600 dark:text-gray-300 mt-1"
>
...
...
src/db/schema.ts
浏览文件 @
e1150749
...
...
@@ -82,8 +82,9 @@ export const language_model_providers = sqliteTable(
);
export
const
language_models
=
sqliteTable
(
"language_models"
,
{
id
:
text
(
"id"
).
primaryKey
(),
name
:
text
(
"name"
).
notNull
(),
id
:
integer
(
"id"
).
primaryKey
({
autoIncrement
:
true
}),
displayName
:
text
(
"display_name"
).
notNull
(),
apiName
:
text
(
"api_name"
).
notNull
(),
provider_id
:
text
(
"provider_id"
)
.
notNull
()
.
references
(()
=>
language_model_providers
.
id
,
{
onDelete
:
"cascade"
}),
...
...
src/ipc/handlers/language_model_handlers.ts
浏览文件 @
e1150749
...
...
@@ -87,8 +87,8 @@ export function registerLanguageModelHandlers() {
params
:
CreateCustomLanguageModelParams
,
):
Promise
<
void
>
=>
{
const
{
id
,
n
ame
,
apiName
,
displayN
ame
,
providerId
,
description
,
maxOutputTokens
,
...
...
@@ -96,11 +96,11 @@ export function registerLanguageModelHandlers() {
}
=
params
;
// Validation
if
(
!
id
)
{
throw
new
Error
(
"Model
ID
is required"
);
if
(
!
apiName
)
{
throw
new
Error
(
"Model
API name
is required"
);
}
if
(
!
n
ame
)
{
throw
new
Error
(
"Model name is required"
);
if
(
!
displayN
ame
)
{
throw
new
Error
(
"Model
display
name is required"
);
}
if
(
!
providerId
)
{
throw
new
Error
(
"Provider ID is required"
);
...
...
@@ -117,21 +117,10 @@ export function registerLanguageModelHandlers() {
throw
new
Error
(
`Provider with ID "
${
providerId
}
" not found`
);
}
// Check if model ID already exists
const
existingModel
=
db
.
select
()
.
from
(
languageModelsSchema
)
.
where
(
eq
(
languageModelsSchema
.
id
,
id
))
.
get
();
if
(
existingModel
)
{
throw
new
Error
(
`A model with ID "
${
id
}
" already exists`
);
}
// Insert the new model
await
db
.
insert
(
languageModelsSchema
).
values
({
id
,
n
ame
,
displayName
,
apiN
ame
,
provider_id
:
providerId
,
description
:
description
||
null
,
max_output_tokens
:
maxOutputTokens
||
null
,
...
...
src/ipc/ipc_types.ts
浏览文件 @
e1150749
...
...
@@ -144,16 +144,26 @@ export interface LanguageModelProvider {
type
:
"custom"
|
"local"
|
"cloud"
;
}
export
interface
LanguageModel
{
id
:
string
;
name
:
string
;
displayName
:
string
;
description
:
string
;
tag
?:
string
;
maxOutputTokens
?:
number
;
contextWindow
?:
number
;
type
:
"local"
|
"cloud"
|
"custom"
;
}
export
type
LanguageModel
=
|
{
id
:
number
;
apiName
:
string
;
displayName
:
string
;
description
:
string
;
tag
?:
string
;
maxOutputTokens
?:
number
;
contextWindow
?:
number
;
type
:
"custom"
;
}
|
{
apiName
:
string
;
displayName
:
string
;
description
:
string
;
tag
?:
string
;
maxOutputTokens
?:
number
;
contextWindow
?:
number
;
type
:
"local"
|
"cloud"
;
};
export
interface
CreateCustomLanguageModelProviderParams
{
id
:
string
;
...
...
@@ -163,8 +173,8 @@ export interface CreateCustomLanguageModelProviderParams {
}
export
interface
CreateCustomLanguageModelParams
{
id
:
string
;
n
ame
:
string
;
apiName
:
string
;
displayN
ame
:
string
;
providerId
:
string
;
description
?:
string
;
maxOutputTokens
?:
number
;
...
...
src/ipc/shared/language_model_helpers.ts
浏览文件 @
e1150749
...
...
@@ -157,7 +157,7 @@ export async function getLanguageModels(obj: {
const
models
=
MODEL_OPTIONS
[
providerId
as
RegularModelProvider
]
||
[];
return
models
.
map
((
model
)
=>
({
...
model
,
id
:
model
.
name
,
apiName
:
model
.
name
,
type
:
"cloud"
,
}));
}
else
{
...
...
@@ -174,7 +174,8 @@ export async function getLanguageModels(obj: {
.
select
({
id
:
languageModelsSchema
.
id
,
// Map DB columns to LanguageModel fields
name
:
languageModelsSchema
.
name
,
displayName
:
languageModelsSchema
.
displayName
,
apiName
:
languageModelsSchema
.
apiName
,
// No display_name in DB, use name instead
description
:
languageModelsSchema
.
description
,
// No tag in DB
...
...
@@ -186,7 +187,6 @@ export async function getLanguageModels(obj: {
return
customModelsDb
.
map
((
model
)
=>
({
...
model
,
displayName
:
model
.
name
,
// Use name as displayName for custom models
// Ensure possibly null fields are handled, provide defaults or undefined if needed
description
:
model
.
description
??
""
,
tag
:
undefined
,
// No tag for custom models from DB
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论