Build lightweight AI agent admin

This commit is contained in:
Codex
2026-06-08 18:14:59 +08:00
commit e164840f43
2530 changed files with 435693 additions and 0 deletions
+238
View File
@@ -0,0 +1,238 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Redis管理API(异步版本)
"""
import logging
from fastapi import APIRouter, HTTPException
from core.redis_manager.schema import (
RedisKeyDetailSchema,
RedisKeyCreateSchema,
RedisKeyUpdateSchema,
RedisKeySearchSchema,
RedisKeyListResponse,
RedisDatabaseListResponse,
RedisKeyRenameSchema,
RedisKeyExpireSchema,
RedisBatchDeleteSchema,
RedisFlushDBSchema,
RedisOperationResponse
)
from core.redis_manager.service import AsyncRedisManagerService
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/redis_manager", tags=["Redis管理"])
@router.get("/databases", response_model=RedisDatabaseListResponse, summary="获取所有Redis数据库信息")
async def get_redis_databases():
"""获取所有Redis数据库信息"""
try:
service = AsyncRedisManagerService(db_index=0)
databases, total_keys = await service.get_all_databases()
await service.close()
return {
'databases': databases,
'total_keys': total_keys
}
except Exception as e:
logger.error(f"Failed to get redis databases: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/{db_index}/keys/search", response_model=RedisKeyListResponse, summary="搜索Redis键")
async def search_redis_keys(db_index: int, search: RedisKeySearchSchema):
"""搜索Redis键"""
try:
service = AsyncRedisManagerService(db_index=db_index)
keys, total = await service.search_keys(
pattern=search.pattern,
key_type=search.key_type,
page=search.page,
page_size=search.page_size
)
await service.close()
return {
'total': total,
'keys': keys,
'page': search.page,
'page_size': search.page_size
}
except Exception as e:
logger.error(f"Failed to search redis keys: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.get("/{db_index}/keys/{key:path}", response_model=RedisKeyDetailSchema, summary="获取Redis键详情")
async def get_redis_key_detail(db_index: int, key: str):
"""获取Redis键详情"""
try:
service = AsyncRedisManagerService(db_index=db_index)
detail = await service.get_key_detail(key)
await service.close()
return detail
except ValueError as e:
raise HTTPException(status_code=404, detail=str(e))
except Exception as e:
logger.error(f"Failed to get redis key detail: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/{db_index}/keys", response_model=RedisOperationResponse, summary="创建Redis键")
async def create_redis_key(db_index: int, data: RedisKeyCreateSchema):
"""创建Redis键"""
try:
service = AsyncRedisManagerService(db_index=db_index)
success = await service.create_key(
key=data.key,
key_type=data.type,
value=data.value,
ttl=data.ttl
)
await service.close()
return {
'success': success,
'message': f"Key '{data.key}' created successfully"
}
except ValueError as e:
return {
'success': False,
'message': str(e)
}
except Exception as e:
logger.error(f"Failed to create redis key: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.put("/{db_index}/keys/{key:path}", response_model=RedisOperationResponse, summary="更新Redis键")
async def update_redis_key(db_index: int, key: str, data: RedisKeyUpdateSchema):
"""更新Redis键"""
try:
service = AsyncRedisManagerService(db_index=db_index)
success = await service.update_key(
key=key,
value=data.value,
ttl=data.ttl
)
await service.close()
return {
'success': success,
'message': f"Key '{key}' updated successfully"
}
except ValueError as e:
return {
'success': False,
'message': str(e)
}
except Exception as e:
logger.error(f"Failed to update redis key: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.delete("/{db_index}/keys/{key:path}", response_model=RedisOperationResponse, summary="删除Redis键")
async def delete_redis_key(db_index: int, key: str):
"""删除Redis键"""
try:
service = AsyncRedisManagerService(db_index=db_index)
success = await service.delete_key(key)
await service.close()
return {
'success': success,
'message': f"Key '{key}' deleted successfully" if success else f"Key '{key}' not found"
}
except Exception as e:
logger.error(f"Failed to delete redis key: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/{db_index}/keys/batch-delete", response_model=RedisOperationResponse, summary="批量删除Redis键")
async def batch_delete_redis_keys(db_index: int, data: RedisBatchDeleteSchema):
"""批量删除Redis键"""
try:
service = AsyncRedisManagerService(db_index=db_index)
count = await service.batch_delete_keys(data.keys)
await service.close()
return {
'success': True,
'message': f"Deleted {count} keys",
'data': {'deleted_count': count}
}
except Exception as e:
logger.error(f"Failed to batch delete redis keys: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/{db_index}/keys/rename", response_model=RedisOperationResponse, summary="重命名Redis键")
async def rename_redis_key(db_index: int, data: RedisKeyRenameSchema):
"""重命名Redis键"""
try:
service = AsyncRedisManagerService(db_index=db_index)
success = await service.rename_key(data.old_key, data.new_key)
await service.close()
return {
'success': success,
'message': f"Key renamed from '{data.old_key}' to '{data.new_key}'"
}
except ValueError as e:
return {
'success': False,
'message': str(e)
}
except Exception as e:
logger.error(f"Failed to rename redis key: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/{db_index}/keys/expire", response_model=RedisOperationResponse, summary="设置Redis键过期时间")
async def set_redis_key_expire(db_index: int, data: RedisKeyExpireSchema):
"""设置Redis键过期时间"""
try:
service = AsyncRedisManagerService(db_index=db_index)
success = await service.set_expire(data.key, data.ttl)
await service.close()
ttl_msg = "永不过期" if data.ttl == -1 else f"{data.ttl}秒后过期"
return {
'success': success,
'message': f"Key '{data.key}' set to {ttl_msg}"
}
except ValueError as e:
return {
'success': False,
'message': str(e)
}
except Exception as e:
logger.error(f"Failed to set redis key expire: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/{db_index}/flush", response_model=RedisOperationResponse, summary="清空Redis数据库")
async def flush_redis_database(db_index: int, data: RedisFlushDBSchema):
"""清空Redis数据库"""
try:
service = AsyncRedisManagerService(db_index=db_index)
success = await service.flush_db(confirm=data.confirm)
await service.close()
return {
'success': success,
'message': f"Database {db_index} flushed successfully"
}
except ValueError as e:
return {
'success': False,
'message': str(e)
}
except Exception as e:
logger.error(f"Failed to flush redis database: {e}")
raise HTTPException(status_code=500, detail=str(e))