feat: integrate Peg AI wellness coach
MetaBloom CI / app (push) Canceled after 0s
MetaBloom CI / api (push) Canceled after 0s

This commit is contained in:
AI Company
2026-07-21 21:15:19 +00:00
parent ca70688dd5
commit 16dccd2f76
10 changed files with 1970 additions and 63 deletions
+23 -2
View File
@@ -1,4 +1,6 @@
from datetime import datetime, timezone
import secrets
import uuid
from fastapi import Depends, FastAPI, HTTPException, Response
from fastapi.middleware.cors import CORSMiddleware
from fastapi.security import OAuth2PasswordRequestForm
@@ -7,7 +9,8 @@ from sqlalchemy.orm import Session
from .config import get_settings
from .db import Base, engine, get_db
from .models import Entry, Profile, User
from .schemas import EntryIn, EntryOut, ProfileIn, ProfileOut, Register, Token
from .schemas import CoachChatIn, CoachChatOut, EntryIn, EntryOut, ProfileIn, ProfileOut, Register, Token
from .coach import chat_with_peg
from .security import current_user, hash_password, make_token, verify_password
cfg = get_settings()
@@ -28,6 +31,11 @@ def health():
return {"status": "ok", "medical_notice": "MetaBloom does not diagnose or replace medical care."}
@app.post("/coach/chat", response_model=CoachChatOut)
async def coach_chat(data: CoachChatIn, user: User = Depends(current_user)):
return await chat_with_peg(data, cfg)
@app.post("/auth/register", response_model=Token, status_code=201)
def register(data: Register, db: Session = Depends(get_db)):
email = data.email.lower()
@@ -39,6 +47,20 @@ def register(data: Register, db: Session = Depends(get_db)):
return Token(access_token=make_token(user.id))
@app.post("/auth/guest", response_model=Token, status_code=201)
def guest_session(db: Session = Depends(get_db)):
"""Create a private pseudonymous session for a first app launch."""
user = User(
email=f"guest-{uuid.uuid4()}@local.invalid",
password_hash=hash_password(secrets.token_urlsafe(32)),
)
db.add(user)
db.flush()
db.add(Profile(user_id=user.id))
db.commit()
return Token(access_token=make_token(user.id))
@app.post("/auth/token", response_model=Token)
def login(form: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
user = db.scalar(select(User).where(User.email == form.username.lower()))
@@ -106,4 +128,3 @@ def export_account(user: User = Depends(current_user)):
def delete_account(user: User = Depends(current_user), db: Session = Depends(get_db)):
db.delete(user); db.commit()
return Response(status_code=204)