deprecated old intake folder
This commit is contained in:
13
intake(deprecated)/.env.example
Normal file
13
intake(deprecated)/.env.example
Normal file
@@ -0,0 +1,13 @@
|
||||
# ====================================
|
||||
# 📥 INTAKE SUMMARIZATION CONFIG
|
||||
# ====================================
|
||||
# Intake service parameters for summarizing chat exchanges
|
||||
# LLM backend URLs and OPENAI_API_KEY inherited from root .env
|
||||
|
||||
SUMMARY_MODEL_NAME=/model
|
||||
SUMMARY_API_URL=http://10.0.0.43:8000
|
||||
SUMMARY_MAX_TOKENS=400
|
||||
SUMMARY_TEMPERATURE=0.4
|
||||
SUMMARY_INTERVAL=300
|
||||
INTAKE_LOG_PATH=/app/logs/intake.log
|
||||
INTAKE_LOG_LEVEL=info
|
||||
6
intake(deprecated)/Dockerfile
Normal file
6
intake(deprecated)/Dockerfile
Normal file
@@ -0,0 +1,6 @@
|
||||
FROM python:3.11-slim
|
||||
WORKDIR /app
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
COPY . .
|
||||
CMD ["uvicorn", "intake:app", "--host", "0.0.0.0", "--port", "7080"]
|
||||
280
intake(deprecated)/intake.py
Normal file
280
intake(deprecated)/intake.py
Normal file
@@ -0,0 +1,280 @@
|
||||
from fastapi import FastAPI, Body, Query, BackgroundTasks
|
||||
from collections import deque
|
||||
from datetime import datetime
|
||||
from uuid import uuid4
|
||||
import requests
|
||||
import os
|
||||
import sys
|
||||
|
||||
# ─────────────────────────────
|
||||
# Config
|
||||
# ─────────────────────────────
|
||||
SUMMARY_MODEL = os.getenv("SUMMARY_MODEL_NAME", "mistral-7b-instruct-v0.2.Q4_K_M.gguf")
|
||||
SUMMARY_URL = os.getenv("SUMMARY_API_URL", "http://localhost:8080/v1/completions")
|
||||
SUMMARY_MAX_TOKENS = int(os.getenv("SUMMARY_MAX_TOKENS", "200"))
|
||||
SUMMARY_TEMPERATURE = float(os.getenv("SUMMARY_TEMPERATURE", "0.3"))
|
||||
|
||||
NEOMEM_API = os.getenv("NEOMEM_API")
|
||||
NEOMEM_KEY = os.getenv("NEOMEM_KEY")
|
||||
|
||||
# ─────────────────────────────
|
||||
# App + session buffer
|
||||
# ─────────────────────────────
|
||||
app = FastAPI()
|
||||
SESSIONS = {}
|
||||
|
||||
@app.on_event("startup")
|
||||
def banner():
|
||||
print("🧩 Intake v0.2 booting...")
|
||||
print(f" Model: {SUMMARY_MODEL}")
|
||||
print(f" API: {SUMMARY_URL}")
|
||||
sys.stdout.flush()
|
||||
|
||||
# ─────────────────────────────
|
||||
# Helper: summarize exchanges
|
||||
# ─────────────────────────────
|
||||
def llm(prompt: str):
|
||||
try:
|
||||
resp = requests.post(
|
||||
SUMMARY_URL,
|
||||
json={
|
||||
"model": SUMMARY_MODEL,
|
||||
"prompt": prompt,
|
||||
"max_tokens": SUMMARY_MAX_TOKENS,
|
||||
"temperature": SUMMARY_TEMPERATURE,
|
||||
},
|
||||
timeout=30,
|
||||
)
|
||||
resp.raise_for_status()
|
||||
return resp.json().get("choices", [{}])[0].get("text", "").strip()
|
||||
except Exception as e:
|
||||
return f"[Error summarizing: {e}]"
|
||||
|
||||
def summarize_simple(exchanges):
|
||||
"""Simple factual summary of recent exchanges."""
|
||||
text = ""
|
||||
for e in exchanges:
|
||||
text += f"User: {e['user_msg']}\nAssistant: {e['assistant_msg']}\n\n"
|
||||
|
||||
prompt = f"""
|
||||
Summarize the following conversation between Brian (user) and Lyra (assistant).
|
||||
Focus only on factual content. Avoid names, examples, story tone, or invented details.
|
||||
|
||||
{text}
|
||||
|
||||
Summary:
|
||||
"""
|
||||
return llm(prompt)
|
||||
|
||||
# ─────────────────────────────
|
||||
# NeoMem push
|
||||
# ─────────────────────────────
|
||||
def push_to_neomem(summary: str, session_id: str):
|
||||
if not NEOMEM_API:
|
||||
return
|
||||
|
||||
headers = {"Content-Type": "application/json"}
|
||||
if NEOMEM_KEY:
|
||||
headers["Authorization"] = f"Bearer {NEOMEM_KEY}"
|
||||
|
||||
payload = {
|
||||
"messages": [{"role": "assistant", "content": summary}],
|
||||
"user_id": "brian",
|
||||
"metadata": {
|
||||
"source": "intake",
|
||||
"session_id": session_id
|
||||
}
|
||||
}
|
||||
|
||||
try:
|
||||
requests.post(
|
||||
f"{NEOMEM_API}/memories",
|
||||
json=payload,
|
||||
headers=headers,
|
||||
timeout=20
|
||||
).raise_for_status()
|
||||
print(f"🧠 NeoMem updated for {session_id}")
|
||||
except Exception as e:
|
||||
print(f"NeoMem push failed: {e}")
|
||||
|
||||
# ───────────────────────────────────────────────
|
||||
# Multilevel Summaries (L1, L5, L10, L20, L30)
|
||||
# ───────────────────────────────────────────────
|
||||
|
||||
# History maps
|
||||
L10_HISTORY = {} # session_id → list of L10 blocks
|
||||
L20_HISTORY = {} # session_id → list of merged overviews
|
||||
|
||||
def summarize_L1(buf):
|
||||
return summarize_simple(buf[-5:])
|
||||
|
||||
def summarize_L5(buf):
|
||||
return summarize_simple(buf[-10:])
|
||||
|
||||
def summarize_L10(buf):
|
||||
# “Reality Check” for last 10 exchanges
|
||||
text = ""
|
||||
for e in buf[-10:]:
|
||||
text += f"User: {e['user_msg']}\nAssistant: {e['assistant_msg']}\n\n"
|
||||
|
||||
prompt = f"""
|
||||
You are Lyra Intake performing a short 'Reality Check'.
|
||||
Summarize the last block of conversation (up to 10 exchanges)
|
||||
in one clear paragraph focusing on tone, intent, and direction.
|
||||
|
||||
{text}
|
||||
|
||||
Reality Check:
|
||||
"""
|
||||
return llm(prompt)
|
||||
|
||||
def summarize_L20(L10_list):
|
||||
joined = "\n\n".join(L10_list)
|
||||
|
||||
prompt = f"""
|
||||
You are Lyra Intake creating a 'Session Overview'.
|
||||
Merge the following Reality Check paragraphs into one short summary
|
||||
capturing progress, themes, and the direction of the conversation.
|
||||
|
||||
{joined}
|
||||
|
||||
Overview:
|
||||
"""
|
||||
return llm(prompt)
|
||||
|
||||
def summarize_L30(L20_list):
|
||||
joined = "\n\n".join(L20_list)
|
||||
|
||||
prompt = f"""
|
||||
You are Lyra Intake generating a 'Continuity Report'.
|
||||
Condense these session overviews into one high-level reflection,
|
||||
noting major themes, persistent goals, and shifts.
|
||||
|
||||
{joined}
|
||||
|
||||
Continuity Report:
|
||||
"""
|
||||
return llm(prompt)
|
||||
|
||||
|
||||
def bg_summarize(session_id: str):
|
||||
"""Runs all summary levels on every exchange."""
|
||||
try:
|
||||
hopper = SESSIONS.get(session_id)
|
||||
if not hopper:
|
||||
return
|
||||
|
||||
buf = list(hopper["buffer"])
|
||||
if not buf:
|
||||
return
|
||||
|
||||
# Ensure history lists exist
|
||||
L10_HISTORY.setdefault(session_id, [])
|
||||
L20_HISTORY.setdefault(session_id, [])
|
||||
|
||||
# L1, L5 (simple factual)
|
||||
s_L1 = summarize_L1(buf)
|
||||
s_L5 = summarize_L5(buf)
|
||||
|
||||
# L10 (append to history)
|
||||
s_L10 = summarize_L10(buf)
|
||||
L10_HISTORY[session_id].append(s_L10)
|
||||
|
||||
# L20 (merge all L10s)
|
||||
s_L20 = summarize_L20(L10_HISTORY[session_id])
|
||||
L20_HISTORY[session_id].append(s_L20)
|
||||
|
||||
# L30 (merge all L20s)
|
||||
s_L30 = summarize_L30(L20_HISTORY[session_id])
|
||||
|
||||
# Push most important tier(s) to NeoMem
|
||||
push_to_neomem(s_L10, session_id)
|
||||
push_to_neomem(s_L20, session_id)
|
||||
push_to_neomem(s_L30, session_id)
|
||||
|
||||
print(f"🧩 L1/L5/L10/L20/L30 updated for {session_id}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"💥 Multilevel summarizer error for {session_id}: {e}")
|
||||
|
||||
|
||||
# ─────────────────────────────
|
||||
# Routes
|
||||
# ─────────────────────────────
|
||||
|
||||
@app.post("/add_exchange")
|
||||
def add_exchange(exchange: dict = Body(...), background_tasks: BackgroundTasks = None):
|
||||
|
||||
session_id = exchange.get("session_id") or f"sess-{uuid4().hex[:8]}"
|
||||
exchange["session_id"] = session_id
|
||||
exchange["timestamp"] = datetime.now().isoformat()
|
||||
|
||||
if session_id not in SESSIONS:
|
||||
SESSIONS[session_id] = {
|
||||
"buffer": deque(maxlen=200),
|
||||
"created_at": datetime.now()
|
||||
}
|
||||
print(f"🆕 Hopper created: {session_id}")
|
||||
|
||||
SESSIONS[session_id]["buffer"].append(exchange)
|
||||
|
||||
if background_tasks:
|
||||
background_tasks.add_task(bg_summarize, session_id)
|
||||
print(f"⏩ Summarization queued for {session_id}")
|
||||
|
||||
return {"ok": True, "session_id": session_id}
|
||||
|
||||
@app.post("/close_session/{session_id}")
|
||||
def close_session(session_id: str):
|
||||
if session_id in SESSIONS:
|
||||
del SESSIONS[session_id]
|
||||
return {"ok": True, "closed": session_id}
|
||||
|
||||
@app.get("/summaries")
|
||||
def get_summary(session_id: str = Query(...)):
|
||||
hopper = SESSIONS.get(session_id)
|
||||
if not hopper:
|
||||
return {"summary_text": "(none)", "session_id": session_id}
|
||||
|
||||
summary = summarize_simple(list(hopper["buffer"]))
|
||||
return {"summary_text": summary, "session_id": session_id}
|
||||
|
||||
@app.get("/context")
|
||||
def get_context(session_id: str = Query(...)):
|
||||
"""Return full multilevel summary context for Cortex."""
|
||||
if session_id not in SESSIONS:
|
||||
return {
|
||||
"session_id": session_id,
|
||||
"exchange_count": 0,
|
||||
"L1": "",
|
||||
"L5": "",
|
||||
"L10": "",
|
||||
"L20": "",
|
||||
"L30": "",
|
||||
"last_updated": None
|
||||
}
|
||||
|
||||
buffer = list(SESSIONS[session_id]["buffer"])
|
||||
|
||||
# Build levels on demand
|
||||
L1 = summarize_L1(buffer)
|
||||
L5 = summarize_L5(buffer)
|
||||
L10 = summarize_L10(buffer)
|
||||
L20 = summarize_L20(L10_HISTORY.get(session_id, []))
|
||||
L30 = summarize_L30(L20_HISTORY.get(session_id, []))
|
||||
|
||||
return {
|
||||
"session_id": session_id,
|
||||
"exchange_count": len(buffer),
|
||||
"L1": L1,
|
||||
"L5": L5,
|
||||
"L10": L10,
|
||||
"L20": L20,
|
||||
"L30": L30,
|
||||
"last_updated": datetime.now().isoformat()
|
||||
}
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
def health():
|
||||
return {"ok": True, "model": SUMMARY_MODEL, "url": SUMMARY_URL}
|
||||
4
intake(deprecated)/requirements.txt
Normal file
4
intake(deprecated)/requirements.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
fastapi==0.115.8
|
||||
uvicorn==0.34.0
|
||||
requests==2.32.3
|
||||
python-dotenv==1.0.1
|
||||
1
intake(deprecated)/venv/bin/python
Symbolic link
1
intake(deprecated)/venv/bin/python
Symbolic link
@@ -0,0 +1 @@
|
||||
python3
|
||||
1
intake(deprecated)/venv/bin/python3
Symbolic link
1
intake(deprecated)/venv/bin/python3
Symbolic link
@@ -0,0 +1 @@
|
||||
/usr/bin/python3
|
||||
1
intake(deprecated)/venv/bin/python3.10
Symbolic link
1
intake(deprecated)/venv/bin/python3.10
Symbolic link
@@ -0,0 +1 @@
|
||||
python3
|
||||
1
intake(deprecated)/venv/lib64
Symbolic link
1
intake(deprecated)/venv/lib64
Symbolic link
@@ -0,0 +1 @@
|
||||
lib
|
||||
3
intake(deprecated)/venv/pyvenv.cfg
Normal file
3
intake(deprecated)/venv/pyvenv.cfg
Normal file
@@ -0,0 +1,3 @@
|
||||
home = /usr/bin
|
||||
include-system-site-packages = false
|
||||
version = 3.10.12
|
||||
Reference in New Issue
Block a user