Skip to content

Commit 7df8d49

Browse files
feat: Gemini
1 parent 5654c73 commit 7df8d49

File tree

5 files changed

+64
-9
lines changed

5 files changed

+64
-9
lines changed

backend/apps/ai_model/model_factory.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from apps.ai_model.openai.llm import BaseChatOpenAI
1111
from apps.system.models.system_model import AiModelDetail
1212
from common.core.db import engine
13+
from common.utils.utils import prepare_model_arg
1314

1415

1516
# from langchain_community.llms import Tongyi, VLLM
@@ -26,13 +27,19 @@ class Config:
2627
frozen = True
2728

2829
def __hash__(self):
30+
if hasattr(self, 'additional_params') and isinstance(self.additional_params, dict):
31+
hashable_params = frozenset((k, tuple(v) if isinstance(v, (list, dict)) else v)
32+
for k, v in self.additional_params.items())
33+
else:
34+
hashable_params = None
35+
2936
return hash((
3037
self.model_id,
3138
self.model_type,
3239
self.model_name,
3340
self.api_key,
3441
self.api_base_url,
35-
frozenset(self.additional_params.items())
42+
hashable_params
3643
))
3744

3845

@@ -62,7 +69,6 @@ def _init_llm(self) -> BaseChatModel:
6269
base_url=self.config.api_base_url,
6370
stream_usage=True,
6471
**self.config.additional_params,
65-
extra_body={"enable_thinking": True},
6672
)
6773

6874
def generate(self, prompt: str) -> str:
@@ -116,7 +122,7 @@ def get_default_config() -> LLMConfig:
116122
if db_model.config:
117123
try:
118124
config_raw = json.loads(db_model.config)
119-
additional_params = {item["key"]: item["val"] for item in config_raw if "key" in item and "val" in item}
125+
additional_params = {item["key"]: prepare_model_arg(item.get('val')) for item in config_raw if "key" in item and "val" in item}
120126
except Exception:
121127
pass
122128

backend/apps/system/api/aimodel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010
from apps.system.models.system_model import AiModelDetail
1111
from common.core.deps import SessionDep, Trans
1212
from common.utils.time import get_timestamp
13-
from common.utils.utils import SQLBotLogUtil
13+
from common.utils.utils import SQLBotLogUtil, prepare_model_arg
1414

1515
router = APIRouter(tags=["system/aimodel"], prefix="/system/aimodel")
1616

1717
@router.post("/status")
1818
async def check_llm(info: AiModelCreator, trans: Trans):
1919
async def generate():
2020
try:
21-
additional_params = {item.key: item.val for item in info.config_list}
21+
additional_params = {item.key: prepare_model_arg(item.val) for item in info.config_list if item.key and item.val}
2222
config = LLMConfig(
2323
model_type="openai",
2424
model_name=info.base_model,

backend/common/utils/utils.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import base64
22
import hashlib
33
import inspect
4+
import json
45
import logging
56
from datetime import datetime, timedelta, timezone
67
from logging.handlers import RotatingFileHandler
@@ -230,6 +231,13 @@ def prepare_for_orjson(data):
230231
return data
231232

232233

233-
234-
234+
def prepare_model_arg(origin_arg: str):
235+
if not isinstance(origin_arg, str):
236+
return origin_arg
237+
if not origin_arg.strip()[0] in {'{', '['}:
238+
return origin_arg
239+
try:
240+
return json.loads(origin_arg)
241+
except:
242+
return origin_arg
235243

frontend/src/entity/supplier.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import icon_bdyzn_colorful from '@/assets/model/icon_bdyzn_colorful.png'
33
import icon_deepseek_colorful from '@/assets/model/icon_deepseek_colorful.png'
44
import icon_txy_colorful from '@/assets/model/icon_txy_colorful.png'
55
import icon_xfhx_colorful from '@/assets/model/icon_xfhx_colorful.png'
6+
import icon_gemini_colorful from '@/assets/model/icon_gemini_colorful.png'
67

78
type ModelArg = { key: string; val?: string | number; type: string; range?: string }
89
type ModelOption = { name: string; api_domain?: string; args?: ModelArg[] }
@@ -24,7 +25,29 @@ export const supplierList: Array<{
2425
model_config: {
2526
0: {
2627
api_domain: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
27-
model_options: [{ name: 'qwen-plus' }],
28+
common_args: [
29+
{ key: 'temperature', val: 1.0, type: 'number', range: '[0, 2)' },
30+
{ key: 'extra_body', val: '{"enable_thinking": true}', type: 'json' },
31+
],
32+
model_options: [
33+
{ name: 'qwen-plus' },
34+
{ name: 'qwen-plus-latest' },
35+
{ name: 'qwen-max' },
36+
{ name: 'qwen-max-latest' },
37+
{ name: 'qwen-turbo' },
38+
{ name: 'qwen-turbo-latest' },
39+
{ name: 'qwq-plus' },
40+
{ name: 'qwq-plus-latest' },
41+
{ name: 'qwen-long' },
42+
{ name: 'qwen-long-latest' },
43+
{ name: 'qwen-omni-turbo' },
44+
{ name: 'qwen-omni-turbo-realtime' },
45+
{ name: 'qwen-omni-turbo-realtime-latest' },
46+
{ name: 'qvq-max' },
47+
{ name: 'qvq-max-latest' },
48+
{ name: 'qvq-plus' },
49+
{ name: 'qvq-plus-latest' },
50+
],
2851
},
2952
},
3053
},
@@ -114,6 +137,24 @@ export const supplierList: Array<{
114137
},
115138
},
116139
},
140+
{
141+
id: 6,
142+
name: 'Gemini',
143+
icon: icon_gemini_colorful,
144+
model_config: {
145+
0: {
146+
api_domain: 'https://generativelanguage.googleapis.com/v1beta/openai/',
147+
common_args: [{ key: 'temperature', val: 1.0, type: 'number', range: '[0, 2]' }],
148+
model_options: [
149+
{ name: 'gemini-2.5-pro' },
150+
{ name: 'gemini-2.5-flash' },
151+
{ name: 'gemini-2.5-flash-lite' },
152+
{ name: 'gemini-2.0-flash' },
153+
{ name: 'gemini-2.0-flash-lite' },
154+
],
155+
},
156+
},
157+
},
117158
]
118159

119160
export const base_model_options = (supplier_id: number, model_type?: number) => {

frontend/src/views/system/model/ModelForm.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ defineExpose({
374374
<el-table :data="advancedSettingPagination" style="width: 100%">
375375
<el-table-column prop="key" :label="t('model.parameters')" width="280" />
376376
<el-table-column prop="name" :label="t('model.display_name')" width="280" />
377-
<el-table-column prop="val" :label="t('model.parameter_value')" />
377+
<el-table-column prop="val" show-overflow-tooltip :label="t('model.parameter_value')" />
378378
<el-table-column
379379
fixed="right"
380380
width="80"

0 commit comments

Comments
 (0)