File size: 2,997 Bytes
36bd0e2
da1806a
 
 
fba6df5
36bd0e2
da1806a
36bd0e2
da1806a
 
 
 
 
36bd0e2
 
da1806a
36bd0e2
 
 
da1806a
fba6df5
da1806a
 
 
 
 
 
 
36bd0e2
da1806a
fba6df5
da1806a
fba6df5
 
da1806a
fba6df5
 
 
 
 
 
 
da1806a
 
 
 
 
fba6df5
36bd0e2
fba6df5
36bd0e2
da1806a
 
 
 
36bd0e2
 
da1806a
fba6df5
da1806a
 
 
 
 
 
 
 
 
 
 
36bd0e2
da1806a
fba6df5
 
36bd0e2
 
da1806a
 
 
36bd0e2
 
fba6df5
36bd0e2
fba6df5
da1806a
36bd0e2
fba6df5
36bd0e2
fba6df5
da1806a
36bd0e2
fba6df5
36bd0e2
fba6df5
36bd0e2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import logging
from fastapi import FastAPI, HTTPException
from fastapi.responses import HTMLResponse
from fastapi.middleware.cors import CORSMiddleware
from datasets import load_dataset
import numpy as np
import os

app = FastAPI()

# ---------------------------------------------------------
# Logging
# ---------------------------------------------------------
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s"
)
logger = logging.getLogger(__name__)

# ---------------------------------------------------------
# CORS
# ---------------------------------------------------------
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

# ---------------------------------------------------------
# Load Hugging Face dataset (cached)
# ---------------------------------------------------------
DATASET_NAME = "kurry/sp500_earnings_transcripts"
dataset_cache = None

def load_hf_dataset():
    global dataset_cache
    if dataset_cache is None:
        logger.info(f"Loading HF dataset: {DATASET_NAME}")
        dataset_cache = load_dataset(DATASET_NAME, split="train")
        logger.info(f"Loaded {len(dataset_cache)} rows from HF dataset")
    return dataset_cache

# ---------------------------------------------------------
# JSON-safe conversion
# ---------------------------------------------------------
def to_json_safe(obj):
    if isinstance(obj, (np.integer,)):
        return int(obj)
    if isinstance(obj, (np.floating,)):
        return float(obj)
    if isinstance(obj, (np.ndarray, list)):
        return [to_json_safe(x) for x in obj]
    if isinstance(obj, dict):
        return {k: to_json_safe(v) for k, v in obj.items()}
    return obj

# ---------------------------------------------------------
# Serve index.html
# ---------------------------------------------------------
@app.get("/", response_class=HTMLResponse)
def serve_index():
    if not os.path.exists("index.html"):
        return "<h1>index.html not found</h1>"
    with open("index.html", "r") as f:
        return f.read()

# ---------------------------------------------------------
# List all tickers
# ---------------------------------------------------------
@app.get("/tickers")
def get_tickers():
    ds = load_hf_dataset()
    tickers = sorted(set(ds["symbol"]))
    return {"tickers": tickers}

# ---------------------------------------------------------
# Get transcript for a symbol
# ---------------------------------------------------------
@app.get("/transcript/{symbol}")
def get_transcript(symbol: str):
    ds = load_hf_dataset()
    symbol = symbol.upper()

    logger.info(f"Fetching transcript for: {symbol}")

    rows = [r for r in ds if r["symbol"].upper() == symbol]

    if not rows:
        raise HTTPException(status_code=404, detail=f"No transcript found for {symbol}")

    safe_rows = [to_json_safe(r) for r in rows]

    return {"symbol": symbol, "records": safe_rows}