The provider-agnostic half of PR #105863, so a CLI-driven subscription provider can ship as a standalone `kind: model-provider` plugin instead of a bundled one: - ProviderProfile: `native_reasoning_details_type`, `model_aliases`, `get_model_context_length`, `get_usage_cost`, `setup_status`, `discover_models` hooks (all default None / no-op). - Chat Completions transport: provider-native `reasoning_details` carriers follow only their declaring profile; standard records still replay on OpenRouter-style routes, strict routes drop the field wholesale (#70233). Relay/stream accumulate `delta.reasoning_details` verbatim. - `hermes model`: the generic plugin flow gates an external-process row on the CLI's own login status (inline `login_command` on a TTY), offers `discover_models()` rows with per-row notes, and never writes config when the executable is missing. - `/model` and the pickers: process providers list their live catalog merged with the pinned one, declared aliases/ids resolve inside the provider, and validation accepts a listed id without probing `process://`. - Delegation keeps the selected external-process provider and protocol for the child. - Model metadata / usage pricing consult the profile's bound and cost hooks first. - Desktop: `[1m]` renders as a "1M" tag and hyphenated Anthropic versions read "Haiku 4.5". The bespoke `_model_flow_external_process` and hard-coded `hermes_cli/main.py` paths from the PR were dropped in favour of main's `_model_flow_plugin_provider`. Co-authored-by: unsupportedpastels <unsupportedpastels@users.noreply.github.com>
24 lines
1.1 KiB
Python
24 lines
1.1 KiB
Python
"""A selected external-process provider must survive child command resolution."""
|
|
import sys
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
|
|
from providers import register_provider
|
|
from providers.base import ProviderProfile
|
|
from tools.delegate_tool_config import _resolve_child_runtime
|
|
|
|
|
|
@pytest.mark.parametrize("external", [True, False])
|
|
def test_pinned_command_retains_selected_external_provider(external):
|
|
profile = ProviderProfile(name="test-process-provider", display_name="Test", auth_type="external_process" if external else "api_key")
|
|
register_provider(profile)
|
|
parent = SimpleNamespace(model="test-model", provider=profile.name, base_url="process://test", api_mode="chat_completions", acp_args=[])
|
|
result = _resolve_child_runtime(
|
|
parent, {}, "external-process", model=None, override_provider=profile.name,
|
|
override_base_url=None, override_api_key=None, override_api_mode=None,
|
|
override_acp_command=sys.executable, override_acp_args=[],
|
|
)
|
|
assert result["provider"] == (profile.name if external else "copilot-acp")
|
|
assert result["acp_command"] == sys.executable
|