From 86885af3056c13822df4521444b7ab953ba642f3 Mon Sep 17 00:00:00 2001 From: BREW <81044362+b-re-w@users.noreply.github.com> Date: Sat, 3 Oct 2026 15:20:23 +0900 Subject: [PATCH] Docs: Bring the status tables and SPEC up to date README, README_ko, the guide and PROJECT section 2 now match SPEC after the engine, batching, API, residency and audit fixes: the OpenAI and Ollama APIs and batching are no longer called planned, the engine is described as running on CPU with GPU support planned, and the native desktop build is planned (a Windows x64 path exists, unrun). SPEC's header lists the current Python and Kotlin tests, S1.11 no longer says there is no code, and q8_0 is marked unverified until torchnative measures it. --- PROJECT.md | 7 ++++--- README.md | 18 ++++++++++++------ docs/SPEC.md | 20 ++++++++++---------- docs/guide/faq.html | 6 +++--- docs/guide/getting-started.html | 2 +- docs/guide/guide-server.html | 4 ++-- docs/locale/README_ko.md | 20 +++++++++++++------- 7 files changed, 45 insertions(+), 32 deletions(-) diff --git a/PROJECT.md b/PROJECT.md index af1812ff..9152cecd 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -32,12 +32,13 @@ INTENT → SPEC 순으로 그쪽이 이깁니다. | 세션 API | 부분 (결함) | 오류를 `raise` 대신 `return`, 404 대신 500, 생성 시 모델 이름 미검증 | | Android · 데스크톱 · 웹 클라이언트 | 구현 | `app/build.gradle.kts` | | iOS | 부분 | Xcode 스크립트가 없는 `:composeApp` 모듈을 호출 | -| 모델 선택 | 부분 | 클라이언트에 하드코딩, 서버 목록 미사용 | +| 모델 선택, 서버 주소 | 구현, 테스트 있음 | 서버의 `GET /api/models` 를 읽음 (S2.5). 서버 주소 파싱과 API 키 포함 (S2.2). Android 는 주소 설정 화면이 아직 없음 | | 대화 기록 | 부분 | 메모리에만 | | 설정 화면, 도메인 계층(Clean Architecture) | 예정 | 빈 파일 | | 온디바이스 추론 · 오프라인 · 동기화 | 예정 | 코드 없음 | -| 네이티브 데스크톱 (GraalVM) | 구현 (Windows x64), 미실행 | #71. 장기적으로 compose-multiplatform-extended 가 관리 | -| Kotlin 테스트 | **없음** | `1 + 2 == 3` 하나뿐 | +| 네이티브 데스크톱 (GraalVM) | 예정 (SPEC S3.4) | Windows x64 빌드 경로는 develop 에 있으나(#71) 네이티브 빌드는 실행해 본 적이 없다. 장기적으로 compose-multiplatform-extended 가 관리 | +| Kotlin 테스트 | 부분 | 서버 주소, 모델 목록 파싱, 종료 코드 매핑은 테스트 있음(CI). 화면과 뷰모델은 테스트 없음 | +| GPU(CUDA) 추론 | 예정 (M4) | 엔진 기본값은 `device="cpu"`. torchnative CUDA 는 실행해 본 적이 없다 | ## 3. 구조 diff --git a/README.md b/README.md index 2e3ddecb..e6618071 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Most AI chat apps are a thin window onto someone else's server. Gemstone starts Today that means a Kotlin [Compose Multiplatform](https://www.jetbrains.com/compose-multiplatform/) client for Android, iOS, desktop and the web, talking to a Python server you run yourself on your -own GPU. Next, the same Python model code moves *into* the app through +own machine (the engine runs on the CPU for now; GPU support is planned). Next, the same Python model code moves *into* the app through [Python Multiplatform](https://github.com/thisisthepy/python-multiplatform), so chatting needs no separate server and no network at all. @@ -40,7 +40,7 @@ separate server and no network at all. - 🚀 **Streaming chat** — tokens arrive over a WebSocket as they are generated and render as Markdown on the fly. - 🧠 **Visible reasoning** — the model's `` block appears as a collapsible panel with elapsed time. - 🔌 **Tool calling** — weather, public holidays, exchange rates, a calculator and web search, run server-side in parallel and fed back to the model. -- 📦 **Open-weight models on one engine** — Qwen 3 0.6B served by a single transformers-based engine that runs on PyTorch or on [torchnative](https://github.com/thisisthepy/torchnative). Gemstone is becoming a local Ollama replacement: concurrent requests (continuous batching), OpenAI- and Ollama-compatible APIs and 8-bit weights are planned for November 2026. +- 📦 **Open-weight models on one engine** — Qwen 3 0.6B served by a single transformers-based engine that runs on PyTorch or on [torchnative](https://github.com/thisisthepy/torchnative). Gemstone is becoming a local Ollama replacement: concurrent requests (continuous batching with a paged KV cache) and OpenAI- and Ollama-compatible APIs work today; 4-bit weights and GGUF are planned. - 🖥️ **Native desktop feel** — a JetBrains Jewel decorated window, with Dmg / Msi / Deb installers. ## 🚀 Quick start @@ -152,16 +152,22 @@ Gemstone is an early, working prototype. The honest state of each piece: | Area | State | |---|---| | Streaming chat, reasoning display, tool calling | ✅ Working | +| One transformers engine, continuous batching, paged KV cache (on CPU by default) | ✅ Working on PyTorch; 🟡 not yet verified on torchnative | +| Several resident models, eviction, `keep_alive` | ✅ Working | +| OpenAI-compatible API (`/v1`, tool calls passed through) | 🟡 Partial — no `n` > 1, logprobs or embeddings | +| Ollama-compatible API (chat, generate, tags, show, pull, delete, ps, copy, create, embed) | 🟡 Partial — `push` returns 501; no Modelfile, template or blobs | +| Security defaults (loopback bind, origin checks, API key) | ✅ Working | | Android, desktop and web clients | ✅ Working | +| Model choice and server address in the client | ✅ Models are read from the server; Android has no address setting yet | | iOS client | 🟡 Framework targets configured; the Xcode build script needs fixing | -| Model choice in the client | 🟡 Hard-coded list, not yet read from the server | | Chat history | 🟡 In memory only | +| Automated tests | 🟡 Python tests (including a real model) and Kotlin tests for the network layer run in CI; the UI is untested | +| Native desktop executable (GraalVM, no JVM) | ⏳ Planned — a Windows x64 build path exists but has not been run | +| GPU (CUDA) inference | ⏳ Planned | +| 4-bit weights, GGUF | ⏳ Planned | | Settings screen | ⏳ Planned | | On-device inference via Python Multiplatform | ⏳ Planned | | Offline mode, cross-device sync | ⏳ Planned | -| OpenAI-compatible API | ⏳ Planned | -| Native desktop executable (GraalVM, no JVM) | ⏳ In progress | -| Automated tests | ⏳ Not yet — the first priority | ## 📖 Documentation diff --git a/docs/SPEC.md b/docs/SPEC.md index e4a24448..24cbfc4f 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -16,13 +16,14 @@ a status: OpenAI-compatible API (S1.10), the Ollama-compatible API with its model management (S1.14, S1.15), the residency shared by all three, with several resident models and derived models (S1.14, `test_multi_resident.py`), the tool-result cache (S1.6) and the backend -removal (S1.8). Everything else has **no -behavioural test** yet: the only Kotlin test, -`app/src/commonTest/kotlin/gemstone/ComposeAppCommonTest.kt`, asserts `1 + 2 == 3`. So -`implemented` without a named test means *read in code*, never *verified by a test*. +removal (S1.8), plus batching, queue limits, first-use download, errors, tool robustness, security +and client compatibility (each item names its module). Real-model tests (marker `real_model`) run in +CI. Kotlin tests in `app/src/commonTest` cover the network layer (`ModelCatalogTest`, +`ServerAddressTest`, `ChatCloseEventTest`); the UI has none. `implemented` without a named test means +*read in code*, never *verified by a test*. -Status was established by reading the `develop` branch at commit `2be0e37` (2026-10-02). S1.11–S1.16 -and S3.4 also record the maintainer's decisions of the same day ([`serving/engine.md`](serving/engine.md)). +Status was first established by reading `develop` at commit `2be0e37` (2026-10-02) and is updated +with every change since. S1.11–S1.16 and S3.4 also record the maintainer's decisions of that day ([`serving/engine.md`](serving/engine.md)). --- @@ -274,7 +275,8 @@ Decided (2026-10-02): Implemented (#84), `api/src/main/engine.py`: - `Engine(model_id, dtype=, device=, quantization=, chat_template=, ...)` loads a causal LM with - `from_pretrained`. `quantization="q8_0"` goes through torchnative's `TorchnativeConfig`. + `from_pretrained`. `quantization="q8_0"` goes through torchnative's `TorchnativeConfig`; this is the + November weight format but is unverified until torchnative's #15 gate measures q8_0 with batching. - Calling it with chat messages streams the reply as text chunks. Temperature 0 is greedy and equals `transformers` `generate`; `seed` makes sampling reproducible. - Concurrent callers are batched (S1.12). A request the batch cannot serve takes the exclusive @@ -307,14 +309,12 @@ timeout and its 503 / 1013 mapping), `api/tests/test_engine.py`, `api/tests/test SmolLM2-135M. Still open for M1: the same tests on torchnative (cpu, mps) once torchnative TN-M1 lands (2026-10-24). -Proposal, pending confirmation: the engine is transformers 5.x continuous batching with a paged KV +The 2026-10-02 proposal, now implemented (#85, #91) and awaiting verification on torchnative: the engine is transformers 5.x continuous batching with a paged KV cache, kernels live in torchnative, and the engine uses only the public `torch` / `transformers` API so a GPU server can run the same code on upstream PyTorch. Constraint: custom kernels cannot be registered from Gemstone, because `torch.library` registrations are no-ops on torchnative. They must be torchnative operators. See [`serving/engine.md`](serving/engine.md). -No code on `develop`. Test: none. - ### S1.12 Continuous batching — `partial` · G5 Concurrent requests to a loaded model are scheduled into one running batch. A request joins and diff --git a/docs/guide/faq.html b/docs/guide/faq.html index 87630561..fbcf317d 100644 --- a/docs/guide/faq.html +++ b/docs/guide/faq.html @@ -38,11 +38,11 @@

Where Gemstone stands

Gemstone 의 현

Status현황

-
Capability기능State상태
Streaming chat over WebSocketWebSocket 스트리밍 채팅implemented
Reasoning display, tool calling추론 표시, 도구 호출implemented
Single transformers-based engine (Qwen 3 0.6B) on PyTorch or torchnativePyTorch 또는 torchnative 위의 transformers 기반 단일 엔진 (Qwen 3 0.6B)implemented
Android, desktop and web clientsAndroid, 데스크톱, 웹 클라이언트implemented
iOS clientiOS 클라이언트partial
Session API error handling세션 API 오류 처리partial
Model list from the server, persistent chat history서버에서 받는 모델 목록, 영구 대화 기록partial
Settings screen설정 화면planned
On-device inference, offline mode, sync온디바이스 추론, 오프라인 모드, 동기화planned
Continuous batching (concurrent requests), 8-bit (q8_0) weights via torchnative, planned for November 2026연속 배칭(동시 요청), torchnative 를 통한 8비트(q8_0) 가중치 — 2026년 11월 예정planned
OpenAI-compatible API (tool calls passed through)OpenAI 호환 API (도구 호출은 클라이언트로 전달)partial
Ollama-compatible API (several resident models, copy, create, embed; tool calls passed through; no push)Ollama 호환 API (여러 상주 모델, copy · create · embed, 도구 호출은 클라이언트로 전달, push 없음)partial
Native desktop executable (GraalVM)네이티브 데스크톱 실행 파일 (GraalVM)planned
Automated tests자동화된 테스트planned
-

There are no behavioural tests yet, so “implemented” means read in the code, not proven by a test. Writing those tests is the first priority.

아직 동작 테스트가 없으므로 “implemented” 는 코드에서 확인했다는 뜻이지 테스트로 증명됐다는 뜻이 아닙니다. 그 테스트를 쓰는 것이 최우선입니다.

+
Capability기능State상태
Streaming chat over WebSocketWebSocket 스트리밍 채팅implemented
Reasoning display, tool calling추론 표시, 도구 호출implemented
Single transformers-based engine (Qwen 3 0.6B), on PyTorch; verification on torchnative pendingtransformers 기반 단일 엔진 (Qwen 3 0.6B), PyTorch 위. torchnative 위 검증은 대기 중partial
Continuous batching with a paged KV cache (concurrent requests; a request that waits too long gets 503 / 1013)페이지드 KV 캐시를 쓰는 연속 배칭 (동시 요청, 너무 오래 기다리면 503 / 1013)partial
Several resident models, eviction, keep_alive여러 상주 모델, 축출, keep_alivepartial
OpenAI-compatible API (tool calls passed through; no n > 1, logprobs or embeddings)OpenAI 호환 API (도구 호출은 클라이언트로 전달, n > 1 · logprobs · embeddings 없음)partial
Ollama-compatible API (chat, generate, tags, show, pull, delete, ps, copy, create, embed; no push, Modelfile or template)Ollama 호환 API (chat, generate, tags, show, pull, delete, ps, copy, create, embed. push · Modelfile · template 없음)partial
Security defaults (127.0.0.1 bind, origin checks, API key)보안 기본값 (127.0.0.1 바인드, 오리진 검사, API 키)implemented
Android, desktop and web clients; the model list is read from the serverAndroid, 데스크톱, 웹 클라이언트. 모델 목록은 서버에서 읽음implemented
iOS clientiOS 클라이언트partial
Session API error handling세션 API 오류 처리partial
Persistent chat history영구 대화 기록partial
Automated tests (Python incl. a real model, Kotlin network layer; UI untested)자동화된 테스트 (실제 모델을 쓰는 Python, Kotlin 네트워크 계층. UI 는 테스트 없음)partial
Native desktop executable (GraalVM): Windows x64 build path, not yet run네이티브 데스크톱 실행 파일 (GraalVM): Windows x64 빌드 경로가 있고 아직 실행해 보지 않음planned
GPU (CUDA) inferenceGPU(CUDA) 추론planned
4-bit weights, GGUF4비트 가중치, GGUFplanned
Settings screen, Android server-address setting설정 화면, Android 서버 주소 설정planned
On-device inference, offline mode, sync온디바이스 추론, 오프라인 모드, 동기화planned
+

“implemented” and “partial” mean what the specification says; the Python server is tested, including with a real model in CI, while the client UI is not. “partial” items work, with the gaps listed.

“implemented” 와 “partial” 은 스펙의 표기를 따릅니다. Python 서버는 CI 에서 실제 모델로도 테스트되지만 클라이언트 UI 는 테스트가 없습니다. “partial” 항목은 동작하며, 빠진 부분을 함께 적었습니다.

Questions질문

-
Does Gemstone work offline?Gemstone 은 오프라인으로 동작하나요?

Not yet. Today every chat goes through the Python server, which can run on your own machine without internet — except for the tools that look things up online. Fully offline, in-app inference is the goal.

아직은 아닙니다. 지금은 모든 채팅이 Python 서버를 거치고, 그 서버는 인터넷 없이 내 머신에서 돌 수 있습니다 — 온라인 조회를 하는 도구만 빼고요. 완전한 오프라인, 앱 내 추론이 목표입니다.

Where are my chats stored?대화는 어디에 저장되나요?

In the client's memory, for as long as it runs. The client writes nothing to disk and sends nothing anywhere except your server — which, note, prints prompts and answers to its console.

실행되는 동안 클라이언트의 메모리에만 있습니다. 클라이언트는 디스크에 쓰지 않고 내 서버 말고는 어디에도 보내지 않습니다 — 다만 서버는 프롬프트와 답변을 콘솔에 출력합니다.

What hardware do I need?어떤 하드웨어가 필요한가요?

No GPU is needed. The default model, Qwen 3 0.6B, is small enough to run on a CPU.

GPU 는 필요 없습니다. 기본 모델인 Qwen 3 0.6B 는 작아서 CPU 에서 돌아갑니다.

Can I use OpenAI or Anthropic models?OpenAI 나 Anthropic 모델을 쓸 수 있나요?

No. Gemstone runs open-weight models locally. Whether remote providers belong in the project at all is an open question for the maintainers.

아니요. Gemstone 은 공개 가중치 모델을 로컬에서 돌립니다. 원격 제공자가 이 프로젝트에 들어올지 자체가 메인테이너의 열린 질문입니다.

+
Does Gemstone work offline?Gemstone 은 오프라인으로 동작하나요?

Not yet. Today every chat goes through the Python server, which can run on your own machine without internet — except for the tools that look things up online. Fully offline, in-app inference is the goal.

아직은 아닙니다. 지금은 모든 채팅이 Python 서버를 거치고, 그 서버는 인터넷 없이 내 머신에서 돌 수 있습니다 — 온라인 조회를 하는 도구만 빼고요. 완전한 오프라인, 앱 내 추론이 목표입니다.

Where are my chats stored?대화는 어디에 저장되나요?

In the client's memory, for as long as it runs. The client writes nothing to disk and sends nothing anywhere except your server — which, note, prints prompts and answers to its console.

실행되는 동안 클라이언트의 메모리에만 있습니다. 클라이언트는 디스크에 쓰지 않고 내 서버 말고는 어디에도 보내지 않습니다 — 다만 서버는 프롬프트와 답변을 콘솔에 출력합니다.

What hardware do I need?어떤 하드웨어가 필요한가요?

No GPU is needed, and none is used yet: the engine runs on the CPU and GPU (CUDA) support is planned. The default model, Qwen 3 0.6B, is small enough for that.

GPU 는 필요 없고 아직 쓰지도 않습니다. 엔진은 CPU 에서 돌고 GPU(CUDA) 지원은 예정입니다. 기본 모델인 Qwen 3 0.6B 는 그걸로 충분할 만큼 작습니다.

Can I use OpenAI or Anthropic models?OpenAI 나 Anthropic 모델을 쓸 수 있나요?

No. Gemstone runs open-weight models locally. Whether remote providers belong in the project at all is an open question for the maintainers.

아니요. Gemstone 은 공개 가중치 모델을 로컬에서 돌립니다. 원격 제공자가 이 프로젝트에 들어올지 자체가 메인테이너의 열린 질문입니다.

Contributing기여하기

Gemstone runs on intent → spec → test → code:

Gemstone 은 의도 → 스펙 → 테스트 → 코드 로 운영합니다:

diff --git a/docs/guide/getting-started.html b/docs/guide/getting-started.html index f74d0494..44299b8d 100644 --- a/docs/guide/getting-started.html +++ b/docs/guide/getting-started.html @@ -41,7 +41,7 @@

Requirements

준비물

  • Git, Python 3.13 (the project pins >=3.13,<3.14 until torchnative is measured on 3.14) and uv.
  • Git, Python 3.13 (torchnative 가 3.14 에서 측정될 때까지 >=3.13,<3.14 로 고정), uv.
  • JDK 21 or newer for the Kotlin client.
  • Kotlin 클라이언트용 JDK 21 이상.
  • -
  • No GPU is needed: the default model, Qwen 3 0.6B, runs on a CPU.
  • GPU 는 필요 없습니다. 기본 모델인 Qwen 3 0.6B 는 CPU 에서 돕니다.
  • +
  • No GPU is needed: the engine runs on the CPU (GPU support is planned) and the default model, Qwen 3 0.6B, is small enough for it.
  • GPU 는 필요 없습니다. 엔진은 CPU 에서 돌고(GPU 지원은 예정) 기본 모델인 Qwen 3 0.6B 는 그걸로 충분합니다.
  • Xcode, for iOS only.
  • iOS 에만 Xcode.
diff --git a/docs/guide/guide-server.html b/docs/guide/guide-server.html index dafbd2af..342a404e 100644 --- a/docs/guide/guide-server.html +++ b/docs/guide/guide-server.html @@ -54,8 +54,8 @@

Models

모델

Engine

엔진

One engine, api/src/main/engine.py, serves every model. It is built on transformers and runs on whatever import torch resolves to: upstream PyTorch, or torchnative, which replaces import torch. Choose one when you install: uv sync --extra torch or uv sync --extra torchnative (not both). The earlier GGUF, BIN and GPTQ backends are gone.

엔진 하나, api/src/main/engine.py 가 모든 모델을 서빙합니다. transformers 기반이며 import torch 가 가리키는 것 위에서 돕니다. upstream PyTorch 이거나, import torch 를 대체하는 torchnative 입니다. 설치할 때 하나를 고르세요: uv sync --extra torch 또는 uv sync --extra torchnative (둘 다는 안 됩니다). 이전의 GGUF, BIN, GPTQ 백엔드는 없어졌습니다.

-

Generation streams. One generation runs at a time per model; other requests wait. A WebSocket client that disconnects stops its generation.

생성은 스트리밍됩니다. 모델마다 한 번에 하나의 생성만 실행되고 나머지 요청은 기다립니다. WebSocket 클라이언트가 연결을 끊으면 그 생성이 멈춥니다.

-

Planned for November 2026, not implemented yet: 8-bit (q8_0) weights via torchnative.

2026년 11월 예정이며 아직 구현되지 않았습니다: torchnative 를 통한 8비트(q8_0) 가중치.

+

Generation streams. Concurrent requests to a model are batched (continuous batching with a paged KV cache); a request the batch cannot serve runs alone, and a request that waits longer than GEMSTONE_QUEUE_TIMEOUT (300 s by default) gets HTTP 503 or WebSocket close code 1013. A WebSocket client that disconnects stops its generation.

생성은 스트리밍됩니다. 한 모델에 동시에 들어온 요청은 배치로 묶입니다(페이지드 KV 캐시를 쓰는 연속 배칭). 배치가 처리할 수 없는 요청은 혼자 실행되고, GEMSTONE_QUEUE_TIMEOUT(기본 300초)보다 오래 기다린 요청은 HTTP 503 또는 WebSocket 종료 코드 1013 을 받습니다. WebSocket 클라이언트가 연결을 끊으면 그 생성이 멈춥니다.

+

The engine runs on the CPU by default; CUDA is deferred. The engine accepts 8-bit (q8_0) weights through torchnative, which is not yet verified there. Planned, not implemented: 4-bit weights and GGUF.

엔진은 기본적으로 CPU 에서 돌고 CUDA 는 보류 중입니다. 엔진은 torchnative 를 통한 8비트(q8_0) 가중치를 받지만 아직 그 위에서 검증되지 않았습니다. 예정이며 아직 구현되지 않았습니다: 4비트 가중치와 GGUF.

Several models at once

여러 모델 동시 사용

Several models can be loaded at the same time, and the app, the OpenAI API and the Ollama API share them. When a new model does not fit, the least recently used model that is not generating is unloaded; a model that is answering is never unloaded. If every loaded model is busy, the request waits and fails with HTTP 503 after the timeout. Set these before starting the server:

여러 모델을 동시에 올려 둘 수 있고, 앱·OpenAI API·Ollama API 가 이를 공유합니다. 새 모델이 들어갈 자리가 없으면 생성 중이 아닌 모델 중 가장 오래 쓰지 않은 것을 내립니다. 답하는 중인 모델은 내리지 않습니다. 올라가 있는 모델이 모두 사용 중이면 요청이 기다리다가 제한 시간이 지나면 HTTP 503 으로 실패합니다. 서버를 시작하기 전에 설정하세요.

diff --git a/docs/locale/README_ko.md b/docs/locale/README_ko.md index f925d3d6..953d13e5 100644 --- a/docs/locale/README_ko.md +++ b/docs/locale/README_ko.md @@ -29,8 +29,8 @@ **공개 가중치 모델을, 내가 있는 곳에서, 모든 기기에 들고 다닐 수 있는 하나의 인터페이스로.** 지금은 Android, iOS, 데스크톱, 웹을 위한 Kotlin -[Compose Multiplatform](https://www.jetbrains.com/compose-multiplatform/) 클라이언트가, 내 GPU 에서 -직접 띄운 Python 서버와 대화하는 형태입니다. 다음 단계에서는 같은 Python 모델 코드가 +[Compose Multiplatform](https://www.jetbrains.com/compose-multiplatform/) 클라이언트가, 내 머신에서 +직접 띄운 Python 서버(엔진은 아직 CPU 에서 돕니다. GPU 지원은 예정)와 대화하는 형태입니다. 다음 단계에서는 같은 Python 모델 코드가 [Python Multiplatform](https://github.com/thisisthepy/python-multiplatform) 을 통해 앱 *안으로* 들어가, 별도 서버도 네트워크도 없이 채팅할 수 있게 됩니다. @@ -40,7 +40,7 @@ - 🚀 **스트리밍 채팅** — 토큰이 생성되는 즉시 WebSocket 으로 도착하고, 그 자리에서 Markdown 으로 렌더링됩니다. - 🧠 **보이는 추론 과정** — 모델의 `` 블록이 경과 시간과 함께 접을 수 있는 패널로 표시됩니다. - 🔌 **도구 호출** — 날씨, 공휴일, 환율, 계산기, 웹 검색을 서버에서 병렬로 실행하고 결과를 모델에 돌려줍니다. -- 📦 **엔진 하나로 도는 공개 가중치 모델** — Qwen 3 0.6B 를 transformers 기반 단일 엔진이 서빙합니다. 이 엔진은 PyTorch 위에서도, [torchnative](https://github.com/thisisthepy/torchnative) 위에서도 돕니다. Gemstone 은 로컬 Ollama 대체제가 되어 가는 중이며, 동시 요청 처리(연속 배칭), OpenAI·Ollama 호환 API, 8비트 가중치를 2026년 11월 목표로 준비하고 있습니다. +- 📦 **엔진 하나로 도는 공개 가중치 모델** — Qwen 3 0.6B 를 transformers 기반 단일 엔진이 서빙합니다. 이 엔진은 PyTorch 위에서도, [torchnative](https://github.com/thisisthepy/torchnative) 위에서도 돕니다. Gemstone 은 로컬 Ollama 대체제가 되어 가는 중입니다. 동시 요청 처리(페이지드 KV 캐시를 쓰는 연속 배칭)와 OpenAI·Ollama 호환 API 는 이미 동작하고, 4비트 가중치와 GGUF 는 예정입니다. - 🖥️ **네이티브 데스크톱 경험** — JetBrains Jewel 데코레이티드 윈도우와 Dmg / Msi / Deb 설치 파일. ## 🚀 빠른 시작 @@ -152,16 +152,22 @@ Gemstone 은 초기 단계의, 동작하는 프로토타입입니다. 각 부분 | 영역 | 상태 | |---|---| | 스트리밍 채팅, 추론 표시, 도구 호출 | ✅ 동작 | +| transformers 단일 엔진, 연속 배칭, 페이지드 KV 캐시 (기본은 CPU) | ✅ PyTorch 에서 동작, 🟡 torchnative 위 검증은 아직 | +| 여러 모델 상주, 축출, `keep_alive` | ✅ 동작 | +| OpenAI 호환 API (`/v1`, 도구 호출은 클라이언트로 전달) | 🟡 부분 — `n` > 1, logprobs, embeddings 없음 | +| Ollama 호환 API (chat, generate, tags, show, pull, delete, ps, copy, create, embed) | 🟡 부분 — `push` 는 501, Modelfile · template · blobs 없음 | +| 보안 기본값 (루프백 바인드, 오리진 검사, API 키) | ✅ 동작 | | Android, 데스크톱, 웹 클라이언트 | ✅ 동작 | +| 클라이언트의 모델 선택과 서버 주소 | ✅ 모델은 서버에서 읽음. Android 는 아직 주소 설정이 없음 | | iOS 클라이언트 | 🟡 프레임워크 타깃은 구성됨, Xcode 빌드 스크립트 수정 필요 | -| 클라이언트의 모델 선택 | 🟡 하드코딩된 목록, 아직 서버에서 읽지 않음 | | 대화 기록 | 🟡 메모리에만 보관 | +| 자동화된 테스트 | 🟡 Python 테스트(실제 모델 포함)와 네트워크 계층의 Kotlin 테스트가 CI 에서 돎. UI 는 테스트 없음 | +| 네이티브 데스크톱 실행 파일 (GraalVM, JVM 없음) | ⏳ 예정 — Windows x64 빌드 경로는 있으나 아직 실행해 보지 않음 | +| GPU(CUDA) 추론 | ⏳ 예정 | +| 4비트 가중치, GGUF | ⏳ 예정 | | 설정 화면 | ⏳ 예정 | | Python Multiplatform 을 통한 온디바이스 추론 | ⏳ 예정 | | 오프라인 모드, 기기 간 동기화 | ⏳ 예정 | -| OpenAI 호환 API | ⏳ 예정 | -| 네이티브 데스크톱 실행 파일 (GraalVM, JVM 없음) | ⏳ 진행 중 | -| 자동화된 테스트 | ⏳ 아직 없음 — 최우선 과제 | ## 📖 문서