AiTestView.vue 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <template>
  2. <div class="panel">
  3. <div class="toolbar">
  4. <div class="filters">
  5. <el-select v-model="form.provider_id" placeholder="AI 服务商" style="width: 220px" @change="selectDefaultModel">
  6. <el-option v-for="provider in enabledProviders" :key="provider.id" :label="provider.name" :value="provider.id" />
  7. </el-select>
  8. <el-select v-model="form.model_id" placeholder="AI 模型" style="width: 220px">
  9. <el-option
  10. v-for="model in providerModels"
  11. :key="model.id"
  12. :label="model.display_name || model.name"
  13. :value="model.id"
  14. />
  15. </el-select>
  16. <span class="muted">温度</span>
  17. <el-input-number v-model="form.temperature" :min="0" :max="2" :step="0.1" />
  18. <el-button type="primary" :loading="loading" @click="send">发送</el-button>
  19. </div>
  20. </div>
  21. <el-input v-model="form.prompt" class="prompt-box" type="textarea" placeholder="输入测试提示词" />
  22. <div style="margin-top: 12px">
  23. <div class="section-title">输出</div>
  24. <pre class="raw-output">{{ output || '暂无输出' }}</pre>
  25. </div>
  26. </div>
  27. </template>
  28. <script setup>
  29. import { computed, onMounted, reactive, ref } from 'vue'
  30. import { ElMessage } from 'element-plus'
  31. import { api } from '../api'
  32. const providers = ref([])
  33. const models = ref([])
  34. const loading = ref(false)
  35. const output = ref('')
  36. const form = reactive({
  37. provider_id: null,
  38. model_id: null,
  39. temperature: 0.2,
  40. prompt: '请用一句话回答:你已经可以连接了吗?',
  41. })
  42. const enabledProviders = computed(() => providers.value.filter((item) => item.enabled))
  43. const providerModels = computed(() => models.value.filter((item) => item.provider_id === form.provider_id))
  44. async function loadOptions() {
  45. const [providerResult, modelResult] = await Promise.all([
  46. api.get('/api/ai/providers'),
  47. api.get('/api/ai/models'),
  48. ])
  49. providers.value = providerResult.data.items
  50. models.value = modelResult.data.items
  51. form.provider_id = enabledProviders.value[0]?.id || null
  52. selectDefaultModel()
  53. }
  54. function selectDefaultModel() {
  55. const available = providerModels.value
  56. form.model_id = available.find((item) => item.is_default)?.id || available[0]?.id || null
  57. }
  58. async function send() {
  59. if (!form.provider_id || !form.model_id || !form.prompt.trim()) {
  60. ElMessage.warning('请选择服务商、模型并输入内容')
  61. return
  62. }
  63. loading.value = true
  64. try {
  65. const { data } = await api.post('/api/ai/test', {
  66. provider_id: form.provider_id,
  67. model_id: form.model_id,
  68. prompt: form.prompt,
  69. temperature: form.temperature,
  70. })
  71. output.value = data.content
  72. } catch (error) {
  73. ElMessage.error(error.response?.data?.detail || 'AI 测试失败')
  74. } finally {
  75. loading.value = false
  76. }
  77. }
  78. defineExpose({ loadOptions })
  79. onMounted(loadOptions)
  80. </script>