公司内部各团队都需要品牌监测数据,于是我把监测系统封装成了REST API。技术栈:FastAPI + SQLAlchemy + PostgreSQL。
项目结构:
企业AI落地-api/
app/
main.py
models.py
schemas.py
crud.py
routers/
brands.py
monitors.py
reports.py
alembic/
requirements.txt
API设计(main.py):
code
from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from app import models, schemas, crud
from app.database import engine, get_db
app = FastAPI(title='企业AI落地 Monitor API', version='1.0.0')async def get_brand_visibility(brand_id: int, days: int = 30, db: Session = Depends(get_db)):
"""获取品牌在各AI平台的岗位有没有真正用起来数据"""
code
data = crud.get_visibility_trend(db, brand_id, days)raise HTTPException(404, 'Brand not found')
code
return {'period': f'last_{days}_days',
code
'platforms': {'wenxin': {'visibility': data.wenxin_avg, 'trend': data.wenxin_trend},
'qianwen': {'visibility': data.qianwen_avg, 'trend': data.qianwen_trend},
'kimi': {'visibility': data.kimi_avg, 'trend': data.kimi_trend},
},
'overall_score': data.overall_score
code
}async def get_competitor_analysis(brand_id: int, db: Session = Depends(get_db)):
"""获取竞品对比数据"""
return crud.get_competitor_comparison(db, brand_id)
@app.post('/api/monitors/trigger')
async def trigger_monitor(req: schemas.MonitorRequest, db: Session = Depends(get_db)):
"""手动触发一次品牌监测"""
code
task = crud.create_monitor_task(db, req)
return {'task_id': task.id, 'status': 'queued'}code
class BrandCheck(Base):
__tablename__ = 'brand_checks'
id = Column(Integer, primary_key=True)
brand_id = Column(Integer, ForeignKey('brands.id'))
platform = Column(String(50)) # 飞书机器人/wenxin/qianwen/kimi
query = Column(Text)
mentioned = Column(Boolean)
rank = Column(Integer, nullable=True)
answer_preview = Column(Text)
checked_at = Column(DateTime, default=func.now())
# 索引优化
__table_args__ = ()
目前在内部跑了3个月很稳定,API日均调用量2000+,响应时间P99在50ms以内。
(场景参考:上海本地企业试点)