Runtime identity resolved through hermes_cli.__version__ (a static 0.0.0 on source installs, rewritten by release stamping) leaked v0.0.0 into About, /api/health, User-Agents, and plugin compat, and source updates showed "couldn't reach update server" because identity and channel authority disagreed with the checkout. Now: get_version_info() resolves install stamp -> live git -> unknown, never pyproject metadata, never a package constant. Source checkouts derive identity from their reachable release tag; the completion tail of every successful install/update/historical takeover atomically rewrites install-stamp.json with that identity; a stale source stamp whose commit no longer matches HEAD defers to live git. ACP/TUI use derived_version for display and base_version for protocol fields; all ~44 runtime __version__ consumers migrated; hermes_cli.__version__ and generated _version.py are gone; release stamping only touches the native manifests external builders consume (nix/tauri/cargo) and passes release identity straight into write_install_stamp.py; pyproject.toml stays inert 0.0.0. Desktop no longer synthesizes a competing install-stamp.json: the checkout owns its stamp, and desktop-bootstrap classification keys on the bootstrap-complete marker. verify-bootstrap-version-stamp.py now cross-checks the checkout's stamp (baseVersion + commit == HEAD). Validation: 31-file focused suite green (version identity, stamping, adoption, providers, gateway, acp/tui runtime identity, api server via extras env, release graph); desktop tsc + 25 vitest green; real-repo probe: base=unknown derived=git.0635606.dirty source=git on this checkout; clean-env imports resolve entirely from this tree; windows footgun + compat-pointer scans clean.
50 lines
2.2 KiB
Python
50 lines
2.2 KiB
Python
"""Fireworks AI provider profile. Models are addressed by full catalog ID
|
|
(``accounts/fireworks/models/<slug>``), tracking fw-ai/fireconnect ``setup-cli``."""
|
|
|
|
from typing import Any
|
|
|
|
from hermes_cli.version_info import get_version_info
|
|
from providers import register_provider
|
|
from providers.base import ProviderProfile
|
|
|
|
|
|
class FireworksProfile(ProviderProfile):
|
|
"""Map Hermes reasoning controls onto Fireworks' OpenAI-compatible wire."""
|
|
|
|
def build_api_kwargs_extras(
|
|
self, *, reasoning_config: dict | None = None, **context: Any
|
|
) -> tuple[dict[str, Any], dict[str, Any]]:
|
|
# Fireworks rejects the nested ``extra_body.reasoning`` fallback some OpenAI-compatible
|
|
# gateways accept (#109774); its documented control is top-level ``reasoning_effort``
|
|
# (``none`` disables thinking). Overriding here marks the profile reasoning-aware, so the
|
|
# transport never sends the generic fallback on this route.
|
|
if not isinstance(reasoning_config, dict):
|
|
return {}, {}
|
|
if reasoning_config.get("enabled") is False:
|
|
return {}, {"reasoning_effort": "none"}
|
|
effort = reasoning_config.get("effort")
|
|
return {}, ({"reasoning_effort": effort} if effort else {})
|
|
|
|
|
|
fireworks = FireworksProfile(
|
|
name="fireworks", aliases=("fireworks-ai", "fw"), display_name="Fireworks AI",
|
|
description="Fireworks AI — OpenAI-compatible direct model API",
|
|
signup_url="https://app.fireworks.ai/settings/users/api-keys", env_vars=("FIREWORKS_API_KEY",),
|
|
base_url="https://api.fireworks.ai/inference/v1", auth_type="api_key",
|
|
# Attribution headers (canonical Hermes set); via default_headers so they
|
|
# survive switch_model and credential rotation.
|
|
default_headers={
|
|
"HTTP-Referer": "https://hermes-agent.nousresearch.com",
|
|
"X-Title": "Hermes Agent",
|
|
"User-Agent": f"HermesAgent/{get_version_info().base_version}",
|
|
},
|
|
default_aux_model="accounts/fireworks/models/glm-5p2",
|
|
# Picker safety net when the live catalog fetch fails.
|
|
fallback_models=(
|
|
"accounts/fireworks/models/kimi-k2p6", "accounts/fireworks/models/glm-5p2",
|
|
"accounts/fireworks/models/kimi-k2p7-code",
|
|
),
|
|
)
|
|
|
|
register_provider(fireworks)
|