ghostlink-client
Python client for a Ghostlink Studio API server — the OpenAI-compatible REST endpoints (/v1/chat/completions, /v1/completions, /v1/embeddings, /v1/models) plus Ghostlink's native /api/* surface (workers, sessions, settings, metrics, and real token-by-token streaming chat).
Install
pip install -e ./sdks/python
(Not yet published to PyPI — install from a local checkout or a Git URL.)
Quick start
from ghostlink_client import GhostlinkClient
client = GhostlinkClient("http://127.0.0.1:8003", api_key="<your api key>")
resp = client.chat.completions.create(
model="llama3.2:3b",
messages=[{"role": "user", "content": "Say hello in one sentence."}],
)
print(resp.content)
The API key is the one Ghostlink generates on first run (printed at startup, persisted to api_key.txt by default — see GHOSTLINK_API_KEY_PATH).
OpenAI-compatible endpoints
# Chat
resp = client.chat.completions.create(model="llama3.2:3b", messages=[...])
# Legacy text completion
resp = client.completions.create(model="llama3.2:3b", prompt="Once upon a time")
print(resp.text)
# Embeddings
resp = client.embeddings.create(model="nomic-embed-text", input="hello world")
# List models
for m in client.list_models():
print(m.id)
Real streaming chat
/v1/chat/completions accepts a stream field but Ghostlink doesn't act on it yet — real token-by-token streaming is only available today through Ghostlink Studio's native chat endpoint:
for chunk in client.stream_chat("Tell me a short story"):
if chunk.error:
print(f"\n[error: {chunk.token}]")
elif not chunk.done:
print(chunk.token, end="", flush=True)
Cluster, metrics, settings
client.workers.list()
client.workers.discover() # UDP broadcast + mDNS sweep
client.workers.connect("192.168.1.42", 8003)
client.metrics() # JSON snapshot
client.metrics_prometheus() # Prometheus exposition format
client.settings.get()
client.settings.update(inference_backend="ollama")
Error handling
from ghostlink_client import GhostlinkAPIError, GhostlinkAuthError, GhostlinkConnectionError
try:
client.chat.completions.create(model="x", messages=[])
except GhostlinkAuthError as err:
print("bad or missing API key:", err)
except GhostlinkAPIError as err:
print(f"server rejected the request: HTTP {err.status_code}: {err.message}")
except GhostlinkConnectionError as err:
print("could not reach the server:", err)
Context manager
with GhostlinkClient("http://127.0.0.1:8003", api_key=key) as client:
client.health()
Custom inference backends
If the server has a custom backend plugin registered (see backend_plugin.rs / GHOSTLINK_OPENAI_COMPAT_BASE_URL in the main project), select it the same way as any built-in backend:
client.settings.update(inference_backend="my_custom_backend")
resp = client.chat.completions.create(model="anything", messages=[...])
Development
pip install -e ".[test]"
pytest
Metadata
Release files for ghostlink-client 2.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ghostlink_client-2.5.0.tar.gz | 11.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ghostlink_client-2.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.6 kB
Release files / ghostlink_client-2.5.0.tar.gz
| Download URL | ghostlink_client-2.5.0.tar.gz |
|---|---|
| Size | 11.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bbb2605d7f88115873e54ecaeab9fbec2eba476384ca51d28213f81144481593
|
|
BLAKE2b-256 checksum How to use checksums |
7bafa730e08f3cae473f415c8ad8aeeaf90b10ac5cf472d29ebe4c4754b3d78e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|
Release files / ghostlink_client-2.5.0-py3-none-any.whl
| Download URL | ghostlink_client-2.5.0-py3-none-any.whl |
|---|---|
| Size | 10.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
813797ef441596dd22c6f92cf8e7989c8539e8eec0e0e52127ac5d6c75decacf
|
|
BLAKE2b-256 checksum How to use checksums |
cc91cb159adaa517c2a8e428ed826832fda9d1b85c68be6442412219ed6cfe2e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|