Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 44 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,45 @@
# ─── Secrets (NEVER commit real keys) ───────────────────────────
.env
backend/.env
frontend/.env.local
# Keep .env.example — it has placeholder values only

# ─── Database ───────────────────────────────────────────────────
*.db
codechat.db
*.log

# ─── Logs ───────────────────────────────────────────────────────
*.log
logs/

# ─── Python ─────────────────────────────────────────────────────
__pycache__/
*.py[cod]
*.pyo
*.pyd
*.egg-info/
dist/
build/
.eggs/
*.egg
.venv/
venv/
env/

# ─── FAISS indexes (can be large, regenerated on demand) ────────
backend/indexes/

# ─── Node / Next.js ─────────────────────────────────────────────
node_modules/
frontend/.next/
frontend/out/
frontend/build/
.npm

# ─── OS / Editor ─────────────────────────────────────────────────
.DS_Store
Thumbs.db
.idea/
.vscode/
*.swp
*.swo
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ In a separate terminal:

```bash
ollama serve
ollama pull llama3.2:1b
ollama pull qwen2.5-coder:1.5b-instruct-q4_K_M
```

## 5) Frontend setup
Expand Down
16 changes: 13 additions & 3 deletions backend/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,23 @@ DATABASE_URL=sqlite:///./codechat.db

# ─── Ollama ───────────────────────────────────────────────────────────────────
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_REQUEST_TIMEOUT=240
OLLAMA_MODEL=llama3.2:3b
OLLAMA_REQUEST_TIMEOUT=45
OLLAMA_MODEL=qwen2.5-coder:1.5b-instruct-q4_K_M
LLM_MAX_TOKENS=1200
RAG_TOP_K=8
RAG_TOP_K=3
EMBEDDING_LOCAL_ONLY=true

# ─── Optional cloud LLM keys ─────────────────────────────────────────────────
# Fallback chain: Ollama → Gemini → Groq (automatic, requires keys below)

# Gemini (primary cloud fallback) — get key at aistudio.google.com
GEMINI_API_KEY=your_gemini_api_key_here
GEMINI_MODEL=gemini-2.0-flash

# Groq (secondary fallback, free tier) — get key at console.groq.com
GROQ_API_KEY=your_groq_api_key_here
GROQ_MODEL=llama-3.1-8b-instant

# Only needed if using llm_provider=openai or anthropic
# OPENAI_API_KEY=
# ANTHROPIC_API_KEY=
Expand Down
4 changes: 2 additions & 2 deletions backend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,8 @@ JWT_SECRET_KEY=
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_REQUEST_TIMEOUT=240
OLLAMA_MODEL=llama3.2:3b
OLLAMA_REQUEST_TIMEOUT=45
OLLAMA_MODEL=qwen2.5-coder:1.5b-instruct-q4_K_M
LLM_MAX_TOKENS=1200
RAG_TOP_K=8
EMBEDDING_LOCAL_ONLY=true
Expand Down
16 changes: 16 additions & 0 deletions backend/app/rag/gemini_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import os
from typing import Optional
from google import genai

class GeminiClient:
def __init__(self, api_key: str, model_name: str = "gemini-1.5-flash"):
self.client = genai.Client(api_key=api_key)
self.model_name = model_name

def generate(self, prompt: str, system_prompt: Optional[str] = None) -> str:
full_prompt = f"{system_prompt}\n\n{prompt}" if system_prompt else prompt
response = self.client.models.generate_content(
model=self.model_name,
contents=full_prompt
)
return response.text
Loading