File size: 3,907 Bytes
3154e52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# Ollama Universal — HF Spaces Template

Uniwersalny szablon do deployowania dowolnego modelu Ollama na Hugging Face Spaces.
Wystarczy wgrać 3 pliki i ustawić 2 zmienne — kod nie wymaga zmian.

---

## Pliki repozytorium

```
Dockerfile       — buduje obraz (nie edytuj)
entrypoint.sh    — startuje Ollama i proxy (nie edytuj)
proxy.py         — API proxy z oznaczonymi miejscami do edycji
INSTRUKCJE.md    — ten plik
```

---

## Szybki start

### 1. Utwórz Space na HuggingFace
- huggingface.co → Spaces → Create new Space
- SDK: **Docker**
- Hardware: **CPU Basic** (free, 16 GB RAM)
- Visibility: Public lub Private

### 2. Wgraj pliki
Przez UI (przeciągnij i upuść) lub git:
```bash
git clone https://huggingface.co/spaces/<username>/<space-name>
cd <space-name>
# skopiuj Dockerfile, entrypoint.sh, proxy.py
git add . && git commit -m "init" && git push
```

### 3. Ustaw zmienne środowiskowe
Settings → Variables and Secrets → New variable:

| Nazwa | Przykład | Opis |
|-------|---------|------|
| `MODEL` | `deepseek-r1:14b` | Model do załadowania |
| `API_KEY` | `moj-tajny-klucz` | Klucz autoryzacji Bearer |

### 4. Poczekaj
- Build: ~2 min
- Cold start: zależy od rozmiaru modelu (np. 9 GB = ~3-5 min pobierania)

---

## Zmiana modelu

Zmień tylko Variable `MODEL` w Settings — Space restartuje się automatycznie.

### Modele z Ollama registry
```
deepseek-r1:14b          9.0 GB   reasoning
deepseek-r1:7b           4.7 GB   reasoning
qwen3:8b                 5.2 GB   reasoning
qwen3:4b                 2.6 GB   reasoning
qwen2.5:7b               4.7 GB
llama3.2:3b              2.0 GB
gemma3:9b                5.8 GB
mistral:7b               4.1 GB
phi4-mini:latest         4.2 GB
```

### Modele z HuggingFace (hf.co/...)
```
hf.co/unsloth/GLM-4.7-Flash-GGUF:UD-TQ1_0        8.33 GB
hf.co/bartowski/Qwen2.5-7B-Instruct-GGUF:Q4_K_M  4.7  GB
hf.co/bartowski/gemma-3-9b-it-GGUF:Q4_K_M        5.8  GB
```

---

## Co edytować w proxy.py

Szukaj komentarzy `!TU MUSISZ EDYTOWAC!`:

```python
API_KEY = os.environ.get("API_KEY", "connectkey")
#                                    ^^^^^^^^^^^ zmień domyślny klucz

MODEL = os.environ.get("MODEL", "deepseek-r1:14b")
#                                ^^^^^^^^^^^^^^^^ zmień domyślny model

temperature = body.get("temperature", 0.6)
#                                     ^^^ zmień domyślną temperaturę

top_p = body.get("top_p", 0.95)
#                          ^^^^ zmień domyślne top_p
```

Wartości z ENV (HF Variables) zawsze mają priorytet nad domyślnymi w kodzie.

---

## Użycie API

Base URL: `https://<username>-<space-name>.hf.space`

### curl
```bash
curl https://<space>.hf.space/v1/chat/completions \
  -H "Authorization: Bearer moj-tajny-klucz" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [{"role": "user", "content": "Cześć!"}]
  }'
```

### Python (openai SDK)
```python
from openai import OpenAI

client = OpenAI(
    base_url="https://<space>.hf.space/v1",
    api_key="moj-tajny-klucz",
)

stream = client.chat.completions.create(
    model="deepseek-r1:14b",
    messages=[{"role": "user", "content": "Cześć!"}],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta
    if hasattr(delta, "reasoning_content") and delta.reasoning_content:
        print(delta.reasoning_content, end="", flush=True)
    if delta.content:
        print(delta.content, end="", flush=True)
```

---

## Endpointy

| Endpoint | Metoda | Opis |
|----------|--------|------|
| `/v1/chat/completions` | POST | Chat — zawsze streaming |
| `/v1/models` | GET | Lista załadowanych modeli |
| `/health` | GET | Status Ollamy i modelu |

---

## Limity CPU Basic (free)

| Parametr | Wartość |
|----------|---------|
| RAM | 16 GB |
| vCPU | 2 |
| Disk | 50 GB (reset przy restarcie) |
| Sleep po bezczynności | 48h |
| Max rozmiar modelu | ~13 GB GGUF |