File size: 4,598 Bytes
9eb1c55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

'use client';

interface ModelConfigProps {
  data: any;
  onChange: (data: any) => void;
}

export default function ModelConfig({ data, onChange }: ModelConfigProps) {
  const models = [
    { id: 'gpt-4', name: 'GPT-4', desc: '最先进的语言模型,适合复杂任务', cost: '高' },
    { id: 'gpt-3.5-turbo', name: 'GPT-3.5 Turbo', desc: '性价比最优,响应快速', cost: '中' },
    { id: 'claude-3', name: 'Claude-3', desc: '擅长分析和推理任务', cost: '中' },
    { id: 'gemini-pro', name: 'Gemini Pro', desc: '多模态能力强', cost: '中' }
  ];

  const handleInputChange = (field: string, value: any) => {
    onChange({ ...data, [field]: value });
  };

  return (
    <div className="space-y-8">
      <div>
        <h3 className="text-lg font-semibold text-gray-900 mb-6">模型配置</h3>
        
        <div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
          <div className="space-y-6">
            <div>
              <label className="block text-sm font-medium text-gray-700 mb-3">选择基础模型</label>
              <div className="space-y-3">
                {models.map((model) => (
                  <div
                    key={model.id}
                    onClick={() => handleInputChange('model', model.id)}
                    className={`p-4 border rounded-lg cursor-pointer transition-colors ${
                      data.model === model.id
                        ? 'border-blue-500 bg-blue-50'
                        : 'border-gray-300 hover:border-gray-400'
                    }`}
                  >
                    <div className="flex items-center justify-between">
                      <div>
                        <h4 className="font-medium text-gray-900">{model.name}</h4>
                        <p className="text-sm text-gray-600 mt-1">{model.desc}</p>
                      </div>
                      <div className="text-right">
                        <span className={`px-2 py-1 text-xs rounded-full ${
                          model.cost === '高' ? 'bg-red-100 text-red-800' : 'bg-yellow-100 text-yellow-800'
                        }`}>
                          成本{model.cost}
                        </span>
                      </div>
                    </div>
                  </div>
                ))}
              </div>
            </div>
          </div>
          
          <div className="space-y-6">
            <div>
              <label className="block text-sm font-medium text-gray-700 mb-2">
                创造性 (Temperature): {data.temperature}
              </label>
              <input
                type="range"
                min="0"
                max="2"
                step="0.1"
                value={data.temperature}
                onChange={(e) => handleInputChange('temperature', parseFloat(e.target.value))}
                className="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer"
              />
              <div className="flex justify-between text-xs text-gray-500 mt-1">
                <span>保守</span>
                <span>创新</span>
              </div>
            </div>
            
            <div>
              <label className="block text-sm font-medium text-gray-700 mb-2">最大输出长度</label>
              <input
                type="number"
                min="100"
                max="4000"
                step="100"
                value={data.maxTokens}
                onChange={(e) => handleInputChange('maxTokens', parseInt(e.target.value))}
                className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm"
              />
              <p className="text-xs text-gray-500 mt-1">建议范围: 100-4000 tokens</p>
            </div>
            
            <div>
              <label className="block text-sm font-medium text-gray-700 mb-2">系统提示词</label>
              <textarea
                placeholder="定义Agent的角色、行为和回答风格..."
                rows={8}
                maxLength={500}
                value={data.systemPrompt}
                onChange={(e) => handleInputChange('systemPrompt', e.target.value)}
                className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm resize-none"
              />
              <div className="text-xs text-gray-500 mt-1">{data.systemPrompt.length}/500</div>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}