feat: 实现 AI-First 代理系统

核心功能:
- AIAgent 模型:AI 代理身份管理
- AIOperationLog: AI 操作日志记录
- AITask: AI 异步任务系统
- AIWebhook: AI webhook 订阅

API 端点:
- POST /api/agents/auth/ - AI 代理认证
- GET/POST /api/agents/ - 代理管理
- GET /api/agent-logs/ - 操作日志查询
- GET/POST /api/agent-tasks/ - 任务管理
- GET/POST /api/agent-webhooks/ - Webhook 管理
- POST /api/batch/ - 批量操作

预置 AI 代理:
- content-moderator-ai: 内容审核 AI
- content-generator-ai: 内容生成 AI
- service-curator-ai: 服务推荐 AI
- analytics-ai: 数据分析 AI
- admin-ai: 管理员 AI

文档:
- AI_AGENT.md: AI-First 设计文档
- init_agents.py: AI 代理初始化脚本

测试:
- 认证系统测试通过
- JWT token 生成正常
- 权限系统工作正常
This commit is contained in:
maoshen
2026-04-12 11:40:11 +00:00
parent a60bb6f652
commit d9e09b61ee
30 changed files with 1373 additions and 0 deletions

View File

@@ -0,0 +1,107 @@
from django.contrib import admin
from .models import AIAgent, AIOperationLog, AITask, AIWebhook
@admin.register(AIAgent)
class AIAgentAdmin(admin.ModelAdmin):
list_display = ['agent_id', 'name', 'is_active', 'rate_limit', 'last_seen', 'created_at']
list_filter = ['is_active', 'permissions', 'created_at']
search_fields = ['agent_id', 'name', 'description']
readonly_fields = ['created_at', 'updated_at', 'last_seen']
fieldsets = (
('基本信息', {
'fields': ['agent_id', 'name', 'description', 'secret_key']
}),
('权限配置', {
'fields': ['permissions'],
'description': '可用权限read, write, review, delete, batch, analytics'
}),
('速率限制', {
'fields': ['rate_limit', 'rate_limit_window'],
'description': 'rate_limit: 每小时请求数rate_limit_window: 时间窗口(秒)'
}),
('状态', {
'fields': ['is_active', 'last_seen']
}),
('元数据', {
'fields': ['created_at', 'updated_at'],
'classes': ['collapse']
}),
)
@admin.register(AIOperationLog)
class AIOperationLogAdmin(admin.ModelAdmin):
list_display = ['agent', 'action', 'resource_type', 'resource_id', 'status', 'confidence', 'created_at']
list_filter = ['status', 'action', 'resource_type', 'created_at']
search_fields = ['agent__agent_id', 'action', 'resource_type']
readonly_fields = ['created_at']
date_hierarchy = 'created_at'
fieldsets = (
('操作信息', {
'fields': ['agent', 'action', 'resource_type', 'resource_id', 'status']
}),
('AI 元数据', {
'fields': ['confidence', 'reasoning']
}),
('请求/响应', {
'fields': ['request_data', 'response_data', 'error_message'],
'classes': ['collapse']
}),
('性能', {
'fields': ['execution_time_ms', 'created_at'],
'classes': ['collapse']
}),
)
@admin.register(AITask)
class AITaskAdmin(admin.ModelAdmin):
list_display = ['task_id', 'agent', 'task_type', 'status', 'progress', 'created_at', 'completed_at']
list_filter = ['status', 'task_type', 'created_at']
search_fields = ['task_id', 'agent__agent_id', 'task_type']
readonly_fields = ['created_at', 'started_at', 'completed_at']
fieldsets = (
('任务信息', {
'fields': ['task_id', 'agent', 'task_type', 'status']
}),
('进度', {
'fields': ['progress', 'processed_items', 'total_items']
}),
('结果', {
'fields': ['result', 'error_message'],
'classes': ['collapse']
}),
('回调', {
'fields': ['callback_url', 'callback_secret'],
'classes': ['collapse']
}),
('时间', {
'fields': ['created_at', 'started_at', 'completed_at'],
'classes': ['collapse']
}),
)
@admin.register(AIWebhook)
class AIWebhookAdmin(admin.ModelAdmin):
list_display = ['agent', 'event', 'url', 'is_active', 'last_triggered', 'failure_count']
list_filter = ['event', 'is_active', 'created_at']
search_fields = ['agent__agent_id', 'url', 'event']
readonly_fields = ['created_at', 'last_triggered']
fieldsets = (
('Webhook 信息', {
'fields': ['agent', 'event', 'url', 'secret']
}),
('状态', {
'fields': ['is_active', 'last_triggered', 'failure_count']
}),
('元数据', {
'fields': ['created_at'],
'classes': ['collapse']
}),
)