feat: 增加模型选择

This commit is contained in:
ViperEkura 2026-03-24 16:25:32 +08:00
parent 46c8f85e9b
commit 8fdb119dcf
3 changed files with 39 additions and 9 deletions

View File

@ -11,8 +11,10 @@ from . import load_config
bp = Blueprint("api", __name__)
cfg = load_config()
GLM_API_URL = cfg.get("api_url")
GLM_API_KEY = cfg["api_key"]
API_URL = cfg.get("api_url")
API_KEY = cfg["api_key"]
MODELS = cfg.get("models", [])
DEFAULT_MODEL = cfg.get("default_model", "glm-5")
# -- Helpers ----------------------------------------------
@ -57,6 +59,14 @@ def build_glm_messages(conv):
return msgs
# -- Models API -------------------------------------------
@bp.route("/api/models", methods=["GET"])
def list_models():
"""获取可用模型列表"""
return ok(MODELS)
# -- Conversation CRUD ------------------------------------
@bp.route("/api/conversations", methods=["GET", "POST"])
@ -68,7 +78,7 @@ def conversation_list():
id=str(uuid.uuid4()),
user_id=user.id,
title=d.get("title", ""),
model=d.get("model", "glm-5"),
model=d.get("model", DEFAULT_MODEL),
system_prompt=d.get("system_prompt", ""),
temperature=d.get("temperature", 1.0),
max_tokens=d.get("max_tokens", 65536),
@ -183,8 +193,8 @@ def _call_glm(conv, stream=False):
if stream:
body["stream"] = True
return requests.post(
GLM_API_URL,
headers={"Content-Type": "application/json", "Authorization": f"Bearer {GLM_API_KEY}"},
API_URL,
headers={"Content-Type": "application/json", "Authorization": f"Bearer {API_KEY}"},
json=body, stream=stream, timeout=120,
)

View File

@ -13,6 +13,12 @@ async function request(url, options = {}) {
return data
}
export const modelApi = {
list() {
return request('/models')
},
}
export const conversationApi = {
list(cursor, limit = 20) {
const params = new URLSearchParams()

View File

@ -21,7 +21,7 @@
<div class="form-group">
<label>模型</label>
<select v-model="form.model">
<option value="glm-5">GLM-5</option>
<option v-for="m in models" :key="m.id" :value="m.id">{{ m.name }}</option>
</select>
</div>
@ -94,7 +94,8 @@
</template>
<script setup>
import { reactive, watch } from 'vue'
import { reactive, ref, watch, onMounted } from 'vue'
import { modelApi } from '../api'
const props = defineProps({
visible: { type: Boolean, default: false },
@ -103,19 +104,30 @@ const props = defineProps({
const emit = defineEmits(['close', 'save'])
const models = ref([])
const form = reactive({
title: '',
model: 'glm-5',
model: '',
system_prompt: '',
temperature: 1.0,
max_tokens: 65536,
thinking_enabled: false,
})
async function loadModels() {
try {
const res = await modelApi.list()
models.value = res.data || []
} catch (e) {
console.error('Failed to load models:', e)
}
}
watch(() => props.visible, (val) => {
if (val && props.conversation) {
form.title = props.conversation.title || ''
form.model = props.conversation.model || 'default'
form.model = props.conversation.model || ''
form.system_prompt = props.conversation.system_prompt || ''
form.temperature = props.conversation.temperature ?? 1.0
form.max_tokens = props.conversation.max_tokens ?? 65536
@ -123,6 +135,8 @@ watch(() => props.visible, (val) => {
}
})
onMounted(loadModels)
function save() {
emit('save', { ...form })
emit('close')