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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ filesystem paths; larger files use CLI copy. Delete requires matching `confirm_m
The packaged [agent reference](src/quicksilverpro/skills/quicksilver-machines/references/api.md)
documents schemas, SSE framing, transfer/terminal adapter assumptions and the
remaining backend/actual-client interoperability gates. The default Machines origin
is `https://api.quicksilverpro.io`; `QSP_MACHINES_URL` overrides it independently of
is `https://pay.quicksilverpro.io`; `QSP_MACHINES_URL` overrides it independently of
inference. HTTPS is required and credential redirects are refused.

Development checks: `pip install -e '.[test,mcp,shell]'` then `pytest -q`.
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "quicksilverpro"
version = "0.5.0"
version = "0.5.1"
description = "CLI for QuickSilver Pro — one OpenAI-compatible API for Claude, GPT, Gemini, Grok, GLM, DeepSeek, Qwen, Kimi and Muse chat plus FLUX image generation, on a single balance."
readme = "README.md"
requires-python = ">=3.9"
Expand Down
2 changes: 1 addition & 1 deletion src/quicksilverpro/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
See https://quicksilverpro.io for docs. `qsp --help` for quick reference.
"""

__version__ = "0.5.0"
__version__ = "0.5.1"
2 changes: 1 addition & 1 deletion src/quicksilverpro/machines.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ def __init__(self, key=None, origin=None, transport=None):
self.key = key or resolve_key()
if not isinstance(self.key, str) or not self.key.startswith("qsm_"):
raise MachineError("invalid_key", "A separate qsm_ Machines key is required.", 2)
origin = origin or os.environ.get("QSP_MACHINES_URL", "https://api.quicksilverpro.io")
origin = origin or os.environ.get("QSP_MACHINES_URL", "https://pay.quicksilverpro.io")
parsed = urlsplit(origin)
if (
parsed.scheme != "https"
Expand Down
2 changes: 1 addition & 1 deletion src/quicksilverpro/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ def setup(
"Open browser sign-in to approve Machines scopes and expiry? Sharing is optional and excluded by default."
):
raise MachineError("auth_required", "Machines-key approval was declined.", 2)
webbrowser.open("https://pay.quicksilverpro.io/machines/keys")
webbrowser.open("https://quicksilverpro.io/dashboard/machines/#keys")
key = click.prompt("Paste the separately approved qsm_ key", hide_input=True).strip()
with MachinesClient(key=key) as client:
client.auth()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Machines beta client contract (0.5.0)

Machines API origin is configured separately using `QSP_MACHINES_URL` (HTTPS origin only), default `https://api.quicksilverpro.io`. Deployment must verify routing before enabling the beta. No network service is launched by the CLI or MCP server. Commands do not implicitly resume or create replacement machines.
Machines API origin is configured separately using `QSP_MACHINES_URL` (HTTPS origin only), default `https://pay.quicksilverpro.io`. No network service is launched by the CLI or MCP server. Commands do not implicitly resume or create replacement machines.

| Operation | Public request |
|---|---|
Expand Down
2 changes: 1 addition & 1 deletion tests/test_box.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ def test_redirect_never_sends_key_to_another_origin(mock_api):
result = run("ls", "--json")
assert result.exit_code == 1
assert len(calls) == 1
assert calls[0].url.host == "api.quicksilverpro.io"
assert calls[0].url.host == "pay.quicksilverpro.io"


def test_interrupted_sse_closes_stream(mock_api):
Expand Down