|
11 | 11 |
|
12 | 12 | from ..auth.rbac import require_admin |
13 | 13 | from ..compat.openai.request import InvalidRequest |
| 14 | +from ..provider.base import GrowthResult, GrowthStep, StepStatus |
14 | 15 | from .deps import Services, csrf_protected, principal_from_request |
15 | 16 |
|
16 | 17 | logger = logging.getLogger(__name__) |
@@ -211,6 +212,34 @@ async def run_growth(credential_id: str, |
211 | 212 | "steps": [{"name": step.name, "status": step.status, "detail": step.detail, |
212 | 213 | "credit": step.credit} for step in result.steps]} |
213 | 214 |
|
| 215 | + @router.post("/api/credentials/{credential_id}/activity") |
| 216 | + async def run_activity(credential_id: str, |
| 217 | + _csrf: None = Depends(csrf_protected), |
| 218 | + principal=Depends(principal_from_request)): |
| 219 | + """手动补发一条活跃上报(B1.7):与定时任务同一条路径。 |
| 220 | +
|
| 221 | + 独立于 activity_report_enabled 开关:定时任务默认关闭不影响管理员在 |
| 222 | + 管理台手动补报一次(用途就是部署后验证闭环)。结果记一行 growth_events。 |
| 223 | + """ |
| 224 | + require_admin(principal) |
| 225 | + provider_id = credentials.provider_of(credential_id) |
| 226 | + provider = registry.get(provider_id or "") |
| 227 | + data = credentials.credential_data(credential_id) |
| 228 | + activity = getattr(provider, "activity", None) |
| 229 | + if provider is None or data is None or activity is None: |
| 230 | + raise InvalidRequest("credential does not support activity report") |
| 231 | + result = await activity(data) |
| 232 | + if result.ok: |
| 233 | + detail = result.message or "已上报一条对话事件" |
| 234 | + services.growth_events.record( |
| 235 | + credential_id=credential_id, trigger="manual", |
| 236 | + result=GrowthResult( |
| 237 | + report=f"活跃上报:{detail}", |
| 238 | + steps=[GrowthStep("活跃上报", StepStatus.DONE, detail)])) |
| 239 | + logger.info("管理员 %s 手动活跃上报 %s(ok=%s)", principal.username, |
| 240 | + credential_id, result.ok) |
| 241 | + return {"ok": result.ok, "message": result.message} |
| 242 | + |
214 | 243 | @router.get("/api/credentials/{credential_id}/accounts") |
215 | 244 | async def list_credential_accounts(credential_id: str, |
216 | 245 | principal=Depends(principal_from_request)): |
|
0 commit comments