| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- /**
- * Agent Configuration Panel
- * UI for viewing and managing AI agents in the registry
- */
- 'use client';
- import { useState } from 'react';
- import { useAgentRegistry } from '@/lib/orchestration/registry/store';
- import { Button } from '@/components/ui/button';
- import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
- import { Badge } from '@/components/ui/badge';
- import { ScrollArea } from '@/components/ui/scroll-area';
- import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar';
- import { PlusIcon, Trash2Icon, EditIcon } from 'lucide-react';
- export function AgentConfigPanel() {
- const { listAgents, deleteAgent } = useAgentRegistry();
- const agents = listAgents();
- const [selectedAgent, setSelectedAgent] = useState<string | null>(null);
- const handleDelete = (agentId: string) => {
- if (confirm('确定要删除这个智能体吗?')) {
- deleteAgent(agentId);
- if (selectedAgent === agentId) {
- setSelectedAgent(null);
- }
- }
- };
- return (
- <div className="flex flex-col h-full p-4 gap-4">
- <div className="flex items-center justify-between">
- <div>
- <h2 className="text-lg font-semibold">智能体配置</h2>
- <p className="text-sm text-muted-foreground">管理课堂讨论的AI智能体</p>
- </div>
- <Button size="sm" variant="outline">
- <PlusIcon className="w-4 h-4 mr-2" />
- 新建
- </Button>
- </div>
- <ScrollArea className="flex-1">
- <div className="space-y-3">
- {agents.map((agent) => (
- <Card
- key={agent.id}
- className={`cursor-pointer transition-colors ${
- selectedAgent === agent.id ? 'border-primary' : ''
- }`}
- onClick={() => setSelectedAgent(agent.id)}
- >
- <CardHeader className="p-4">
- <div className="flex items-start justify-between">
- <div className="flex items-center gap-3">
- <Avatar
- className="size-10"
- style={{
- borderColor: agent.color,
- borderWidth: 2,
- }}
- >
- <AvatarImage src={agent.avatar} alt={agent.name} />
- <AvatarFallback
- style={{
- backgroundColor: `${agent.color}20`,
- color: agent.color,
- }}
- >
- {agent.name.charAt(0)}
- </AvatarFallback>
- </Avatar>
- <div>
- <CardTitle className="text-base">{agent.name}</CardTitle>
- <CardDescription className="text-sm">{agent.role}</CardDescription>
- </div>
- </div>
- <div className="flex gap-2">
- <Badge variant="secondary" className="text-xs">
- 优先级 {agent.priority}
- </Badge>
- {agent.isDefault && (
- <Badge variant="outline" className="text-xs">
- 默认
- </Badge>
- )}
- </div>
- </div>
- </CardHeader>
- <CardContent className="p-4 pt-0">
- <div className="space-y-2">
- <div>
- <p className="text-xs font-medium text-muted-foreground mb-1">能力描述</p>
- <p className="text-sm line-clamp-2">{agent.persona}</p>
- </div>
- <div>
- <p className="text-xs font-medium text-muted-foreground mb-1">
- 可用动作 ({agent.allowedActions.length})
- </p>
- <div className="flex flex-wrap gap-1">
- {agent.allowedActions.slice(0, 3).map((tool) => (
- <Badge key={tool} variant="secondary" className="text-xs">
- {tool}
- </Badge>
- ))}
- {agent.allowedActions.length > 3 && (
- <Badge variant="secondary" className="text-xs">
- +{agent.allowedActions.length - 3}
- </Badge>
- )}
- </div>
- </div>
- {!agent.isDefault && (
- <div className="flex gap-2 pt-2">
- <Button size="sm" variant="outline" className="flex-1">
- <EditIcon className="w-3 h-3 mr-1" />
- 编辑
- </Button>
- <Button
- size="sm"
- variant="destructive"
- onClick={(e) => {
- e.stopPropagation();
- handleDelete(agent.id);
- }}
- >
- <Trash2Icon className="w-3 h-3" />
- </Button>
- </div>
- )}
- </div>
- </CardContent>
- </Card>
- ))}
- </div>
- </ScrollArea>
- {agents.length === 0 && (
- <div className="flex-1 flex items-center justify-center text-center p-8">
- <div className="max-w-sm">
- <p className="text-muted-foreground mb-4">还没有配置智能体</p>
- <Button>
- <PlusIcon className="w-4 h-4 mr-2" />
- 创建第一个智能体
- </Button>
- </div>
- </div>
- )}
- </div>
- );
- }
|