File size: 2,698 Bytes
775cbe6
 
 
bee6df4
 
 
775cbe6
 
 
 
 
 
 
bee6df4
 
 
775cbe6
 
 
 
 
 
bee6df4
d04144c
 
bee6df4
775cbe6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d04144c
 
 
775cbe6
 
bee6df4
 
d04144c
775cbe6
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
FROM ghcr.io/ggml-org/llama.cpp:server AS llama_cpp

FROM python:3.12-slim

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PORT=7860 \
    LD_LIBRARY_PATH=/opt/llama \
    CUSTOMER_AI_CONSTRUCTIVE_API_URL=http://127.0.0.1:8081/v1/chat/completions \
    CUSTOMER_AI_ADVERSARIAL_API_URL=http://127.0.0.1:8082/v1/chat/completions \
    CUSTOMER_AI_EVIDENCE_API_URL=http://127.0.0.1:8083/v1/chat/completions \
    CUSTOMER_AI_LOCAL_4B_PATH=/models/llm-jp-3-3.7b-instruct3-Q4_K_M.gguf \
    CUSTOMER_AI_LOCAL_8B_PATH=/models/llm-jp-4-8b-instruct-Q4_K_M.gguf

WORKDIR /app

RUN apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates curl libgomp1 \
    && rm -rf /var/lib/apt/lists/*

COPY --from=llama_cpp /app /opt/llama

COPY requirements.txt /app/requirements.txt
RUN python -m pip install --no-cache-dir --upgrade pip \
    && python -m pip install --no-cache-dir -r /app/requirements.txt

# Download immutable, public GGUF weights at build time. These are local model
# files, not Hugging Face Inference Provider calls, so runtime inference credits
# are never consumed.
RUN mkdir -p /models \
    && python - <<'PY'
from hashlib import sha256
from pathlib import Path
from huggingface_hub import hf_hub_download

targets = [
    {
        "repo": "mmnga/llm-jp-3-3.7b-instruct3-gguf",
        "revision": "7edef5a4f094ec8c1aed1e196c6a544675efbc2f",
        "filename": "llm-jp-3-3.7b-instruct3-Q4_K_M.gguf",
        "sha256": "a4a09d2141717a01b44e7a8dbdb28da8c01e9078c8051367cd6a20f7008ef5a8",
    },
    {
        "repo": "mmnga-o/llm-jp-4-8b-instruct-gguf",
        "revision": "7ae4da12cee2f109509cb8e1d01cf8a0f1a5fbc1",
        "filename": "llm-jp-4-8b-instruct-Q4_K_M.gguf",
        "sha256": "b6a61b9c8d4e7cb1ae543d8fcf472c9fb9abfc5d48af17f5017ce89c2dc0bd56",
    },
]

for item in targets:
    path = Path(
        hf_hub_download(
            repo_id=item["repo"],
            revision=item["revision"],
            filename=item["filename"],
            local_dir="/models",
        )
    )
    h = sha256()
    with path.open("rb") as handle:
        for chunk in iter(lambda: handle.read(8 * 1024 * 1024), b""):
            h.update(chunk)
    actual = h.hexdigest()
    if actual != item["sha256"]:
        raise SystemExit(
            f"local_model_sha_mismatch file={item['filename']} expected={item['sha256']} actual={actual}"
        )
    print(f"LOCAL_MODEL_PINNED={path.name} SHA256={actual}")
PY

COPY app.py /app/app.py
COPY runtime /app/runtime
COPY config /app/config
COPY scripts/start_local_cpu.sh /app/scripts/start_local_cpu.sh
RUN chmod +x /app/scripts/start_local_cpu.sh

EXPOSE 7860

CMD ["/app/scripts/start_local_cpu.sh"]