gcharanteja commited on
Commit
f10850c
·
1 Parent(s): 9704808
Files changed (5) hide show
  1. Dockerfile +16 -28
  2. README.md +14 -12
  3. app.py +65 -0
  4. requirements.txt +5 -0
  5. start.sh +35 -0
Dockerfile CHANGED
@@ -1,36 +1,24 @@
1
- FROM python:3.11-slim
2
 
3
- # 🔑 Critical: Export CMAKE_ARGS BEFORE installing deps
4
- ENV PYTHONDONTWRITEBYTECODE=1 \
5
- PYTHONUNBUFFERED=1 \
6
- PIP_NO_CACHE_DIR=1 \
7
- UV_COMPILE_BYTECODE=1 \
8
- PORT=7860 \
9
- CMAKE_ARGS="-DLLAMA_CPU_ONLY=ON -DLLAMA_BLAS=OFF -DLLAMA_AVX=OFF"
10
 
11
- # Minimal build tools
12
- RUN apt-get update && apt-get install -y --no-install-recommends \
13
- build-essential curl \
14
- && rm -rf /var/lib/apt/lists/*
15
-
16
- # Install uv
17
- COPY --from=ghcr.io/astral-sh/uv:latest /uv /uv-bin/uv
18
- ENV PATH="/uv-bin:$PATH"
19
-
20
- # Non-root user (HF requirement)
21
- RUN useradd -m -u 1000 user && mkdir /app && chown -R user:user /app
22
- USER user
23
  WORKDIR /app
24
 
25
- # 🔥 Copy deps FIRST better Docker cache
26
- COPY --chown=user pyproject.toml uv.lock ./
 
27
 
28
- # Removed --no-build-isolation (breaks llama-cpp-python)
29
- RUN uv sync --frozen --no-dev
30
 
31
- # Copy ONLY your app code
32
- COPY --chown=user main.py ./
33
 
 
34
  EXPOSE 7860
35
- # ✅ No reload, bind to 0.0.0.0, use $PORT
36
- CMD ["uv", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
 
 
1
+ FROM python:3.10-slim
2
 
3
+ # Install system dependencies + Ollama
4
+ RUN apt-get update && apt-get install -y curl && \
5
+ curl -fsSL https://ollama.ai/install.sh | sh && \
6
+ apt-get clean && rm -rf /var/lib/apt/lists/*
 
 
 
7
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  WORKDIR /app
9
 
10
+ # Copy requirements and install Python packages
11
+ COPY requirements.txt .
12
+ RUN pip install --no-cache-dir --upgrade -r requirements.txt
13
 
14
+ # Copy all app files
15
+ COPY . .
16
 
17
+ # Make start script executable
18
+ RUN chmod +x start.sh
19
 
20
+ # Expose port (HF Spaces will use $PORT)
21
  EXPOSE 7860
22
+
23
+ # Start everything using the script
24
+ CMD ["./start.sh"]
README.md CHANGED
@@ -1,21 +1,23 @@
1
  ---
2
- title: Mann
3
- emoji: 🌍
4
- colorFrom: blue
5
- colorTo: yellow
6
  sdk: docker
7
- pinned: false
8
  ---
9
 
10
- # Mann API
11
 
12
- FastAPI backend on HF Spaces.
13
 
14
- ## Endpoints
15
 
16
- - `GET /` → status message
17
- - `GET /health` → `{"status":"ok"}`
 
18
 
19
- ## Secrets
20
 
21
- Add API keys in **Space Settings → Secrets** (never commit `.env`).
 
 
 
 
 
1
  ---
2
+ title: Mann - TinyLlama Chat
3
+ emoji: 🧠
 
 
4
  sdk: docker
 
5
  ---
6
 
7
+ # Mann - TinyLlama on Hugging Face Space
8
 
9
+ A simple FastAPI + Ollama deployment running **TinyLlama**.
10
 
11
+ ### Endpoints
12
 
13
+ - `GET /` → Status
14
+ - `POST /ask` → Normal response
15
+ - `POST /stream` → Streaming response
16
 
17
+ ### Example Request
18
 
19
+ ```bash
20
+ curl -X POST https://your-space.hf.space/ask \
21
+ -H "Content-Type: application/json" \
22
+ -d '{"text": "Hello, who are you?"}'
23
+ ```
app.py ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import logging
3
+ from fastapi import FastAPI, HTTPException
4
+ from fastapi.responses import StreamingResponse
5
+ from pydantic import BaseModel
6
+ from langchain_community.llms import Ollama
7
+ from langchain.callbacks.manager import CallbackManager
8
+ from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
9
+
10
+ logging.basicConfig(level=logging.INFO)
11
+ logger = logging.getLogger(__name__)
12
+
13
+ app = FastAPI(title="TinyLlama on HF Space")
14
+
15
+ MODEL_NAME = "tinyllama"
16
+ PORT = os.getenv("PORT", 7860)
17
+
18
+ def get_llm():
19
+ callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])
20
+ return Ollama(
21
+ model=MODEL_NAME,
22
+ callback_manager=callback_manager,
23
+ temperature=0.7,
24
+ num_ctx=2048
25
+ )
26
+
27
+ class Question(BaseModel):
28
+ text: str
29
+
30
+ @app.get("/")
31
+ def read_root():
32
+ return {
33
+ "message": f"✅ TinyLlama is running on HF Space!",
34
+ "model": MODEL_NAME,
35
+ "endpoints": ["/ask", "/stream"]
36
+ }
37
+
38
+ @app.post("/ask")
39
+ async def ask(question: Question):
40
+ try:
41
+ logger.info(f"Received question: {question.text[:100]}...")
42
+ llm = get_llm()
43
+ response = llm.invoke(question.text)
44
+
45
+ return {
46
+ "question": question.text,
47
+ "answer": response.strip()
48
+ }
49
+ except Exception as e:
50
+ logger.error(f"Error: {e}")
51
+ raise HTTPException(status_code=500, detail=str(e))
52
+
53
+ @app.post("/stream")
54
+ async def stream(question: Question):
55
+ llm = get_llm()
56
+
57
+ async def generate():
58
+ for chunk in llm.stream(question.text):
59
+ yield chunk
60
+
61
+ return StreamingResponse(generate(), media_type="text/plain")
62
+
63
+ if __name__ == "__main__":
64
+ import uvicorn
65
+ uvicorn.run(app, host="0.0.0.0", port=int(PORT))
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn[standard]
3
+ langchain
4
+ langchain-community
5
+ pydantic
start.sh ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ echo "=== Starting Ollama + FastAPI on HF Space ==="
4
+
5
+ # Optimization
6
+ export OMP_NUM_THREADS=4
7
+ export MKL_NUM_THREADS=4
8
+
9
+ # Start Ollama server in background
10
+ ollama serve &
11
+ OLLAMA_PID=$!
12
+
13
+ # Wait for Ollama to be ready
14
+ echo "Waiting for Ollama to start..."
15
+ for i in {1..40}; do
16
+ if curl -s http://localhost:11434/api/tags > /dev/null; then
17
+ echo "✅ Ollama is ready!"
18
+ break
19
+ fi
20
+ sleep 2
21
+ done
22
+
23
+ # Pull model if not present
24
+ if ! ollama list | grep -q "tinyllama"; then
25
+ echo "Downloading tinyllama model... (first time only)"
26
+ ollama pull tinyllama
27
+ else
28
+ echo "✅ tinyllama model already downloaded"
29
+ fi
30
+
31
+ echo "🚀 Starting FastAPI server on port ${PORT:-7860}"
32
+ echo "API will be available at: http://0.0.0.0:${PORT:-7860}"
33
+
34
+ # Start FastAPI
35
+ uvicorn app:app --host 0.0.0.0 --port ${PORT:-7860} --workers 2