Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
bit-pm
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
燕伟桐
bit-pm
Commits
ee5865dc
Unverified
提交
ee5865dc
authored
5月 13, 2025
作者:
Will Chen
提交者:
GitHub
5月 13, 2025
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Precise custom model selection & simplify language model/provider log… (#147)
…ic (no merging)
上级
b45dff38
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
29 行增加
和
52 行删除
+29
-52
ModelPicker.tsx
src/components/ModelPicker.tsx
+10
-0
language_model_helpers.ts
src/ipc/shared/language_model_helpers.ts
+2
-43
token_utils.ts
src/ipc/utils/token_utils.ts
+16
-9
schemas.ts
src/lib/schemas.ts
+1
-0
没有找到文件。
src/components/ModelPicker.tsx
浏览文件 @
ee5865dc
...
...
@@ -84,6 +84,13 @@ export function ModelPicker() {
// For cloud models, look up in the modelsByProviders data
if
(
modelsByProviders
&&
modelsByProviders
[
selectedModel
.
provider
])
{
const
customFoundModel
=
modelsByProviders
[
selectedModel
.
provider
].
find
(
(
model
)
=>
model
.
type
===
"custom"
&&
model
.
id
===
selectedModel
.
customModelId
,
);
if
(
customFoundModel
)
{
return
customFoundModel
.
displayName
;
}
const
foundModel
=
modelsByProviders
[
selectedModel
.
provider
].
find
(
(
model
)
=>
model
.
apiName
===
selectedModel
.
name
,
);
...
...
@@ -227,9 +234,12 @@ export function ModelPicker() {
:
""
}
onClick=
{
()
=>
{
const
customModelId
=
model
.
type
===
"custom"
?
model
.
id
:
undefined
;
onModelSelect
({
name
:
model
.
apiName
,
provider
:
providerId
,
customModelId
,
});
setOpen
(
false
);
}
}
...
...
src/ipc/shared/language_model_helpers.ts
浏览文件 @
ee5865dc
...
...
@@ -191,35 +191,7 @@ export async function getLanguageModelProviders(): Promise<
}
}
// Merge lists: custom providers take precedence
const
mergedProvidersMap
=
new
Map
<
string
,
LanguageModelProvider
>
();
// Add all hardcoded providers first
for
(
const
hp
of
hardcodedProviders
)
{
mergedProvidersMap
.
set
(
hp
.
id
,
hp
);
}
// Add/overwrite with custom providers from DB
for
(
const
[
id
,
cp
]
of
customProvidersMap
)
{
const
existingProvider
=
mergedProvidersMap
.
get
(
id
);
if
(
existingProvider
)
{
// If exists, merge. Custom fields take precedence.
mergedProvidersMap
.
set
(
id
,
{
...
existingProvider
,
// start with hardcoded
...
cp
,
// override with custom where defined
id
:
cp
.
id
,
// ensure custom id is used
name
:
cp
.
name
,
// ensure custom name is used
type
:
"custom"
,
// explicitly set type to custom
apiBaseUrl
:
cp
.
apiBaseUrl
??
existingProvider
.
apiBaseUrl
,
envVarName
:
cp
.
envVarName
??
existingProvider
.
envVarName
,
});
}
else
{
// If it doesn't exist in hardcoded, just add the custom one
mergedProvidersMap
.
set
(
id
,
cp
);
}
}
return
Array
.
from
(
mergedProvidersMap
.
values
());
return
[...
hardcodedProviders
,
...
customProvidersMap
.
values
()];
}
/**
...
...
@@ -293,20 +265,7 @@ export async function getLanguageModels({
}
}
// Merge the models, with custom models taking precedence over hardcoded ones
const
mergedModelsMap
=
new
Map
<
string
,
LanguageModel
>
();
// Add hardcoded models first
for
(
const
model
of
hardcodedModels
)
{
mergedModelsMap
.
set
(
model
.
apiName
,
model
);
}
// Then override with custom models
for
(
const
model
of
customModels
)
{
mergedModelsMap
.
set
(
model
.
apiName
,
model
);
}
return
Array
.
from
(
mergedModelsMap
.
values
());
return
[...
hardcodedModels
,
...
customModels
];
}
/**
...
...
src/ipc/utils/token_utils.ts
浏览文件 @
ee5865dc
...
...
@@ -20,13 +20,7 @@ const DEFAULT_CONTEXT_WINDOW = 128_000;
export
async
function
getContextWindow
()
{
const
settings
=
readSettings
();
const
model
=
settings
.
selectedModel
;
const
models
=
await
getLanguageModels
({
providerId
:
model
.
provider
,
});
const
modelOption
=
models
.
find
((
m
)
=>
m
.
apiName
===
model
.
name
);
const
modelOption
=
await
findLanguageModel
(
settings
.
selectedModel
);
return
modelOption
?.
contextWindow
||
DEFAULT_CONTEXT_WINDOW
;
}
...
...
@@ -34,10 +28,23 @@ export async function getContextWindow() {
const
DEFAULT_MAX_TOKENS
=
8
_000
;
export
async
function
getMaxTokens
(
model
:
LargeLanguageModel
)
{
const
modelOption
=
await
findLanguageModel
(
model
);
return
modelOption
?.
maxOutputTokens
||
DEFAULT_MAX_TOKENS
;
}
async
function
findLanguageModel
(
model
:
LargeLanguageModel
)
{
const
models
=
await
getLanguageModels
({
providerId
:
model
.
provider
,
});
const
modelOption
=
models
.
find
((
m
)
=>
m
.
apiName
===
model
.
name
);
return
modelOption
?.
maxOutputTokens
||
DEFAULT_MAX_TOKENS
;
if
(
model
.
customModelId
)
{
const
customModel
=
models
.
find
(
(
m
)
=>
m
.
type
===
"custom"
&&
m
.
id
===
model
.
customModelId
,
);
if
(
customModel
)
{
return
customModel
;
}
}
return
models
.
find
((
m
)
=>
m
.
apiName
===
model
.
name
);
}
src/lib/schemas.ts
浏览文件 @
ee5865dc
...
...
@@ -46,6 +46,7 @@ export const cloudProviders = providers.filter(
export
const
LargeLanguageModelSchema
=
z
.
object
({
name
:
z
.
string
(),
provider
:
z
.
string
(),
customModelId
:
z
.
number
().
optional
(),
});
/**
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论