fix(web): openai-native backend docs name the real login command, English picker tag, registry test lists the plugin

Trim of the salvaged openai-native marker provider (#107377):
- `hermes auth --provider openai-codex` does not exist; the login command is
  `hermes auth add openai-codex` (hermes_cli/subcommands/auth.py). Fixed in
  plugin.yaml, provider.py docstring and the web-search docs (2 spots).
- `hermes tools` picker tag was Chinese; now English like every other provider.
- tests/plugins/web/test_web_search_provider_plugins.py enumerates the bundled
  registry exactly, so the new plugin made it fail; it now lists openai-native
  with capability flags (search=True, extract=False) — the search-only
  invariant that keeps web_extract on its own backend.
- contributors/emails mapping for the salvaged author.
This commit is contained in:
teknium1
2026-09-19 01:51:23 -07:00
parent 39ef4d5a77
commit 44e6ea3ceb
5 changed files with 11 additions and 6 deletions

View File

@@ -0,0 +1 @@
lyswty

View File

@@ -1,6 +1,6 @@
name: web-openai-native
version: 1.0.0
description: "OpenAI native web search — declares the Responses API server-side ``web_search`` built-in instead of running a client-side search. Requires the Codex Responses transport plus openai-codex OAuth (``hermes auth --provider openai-codex``)."
description: "OpenAI native web search — declares the Responses API server-side ``web_search`` built-in instead of running a client-side search. Requires the Codex Responses transport plus openai-codex OAuth (``hermes auth add openai-codex``)."
author: NousResearch
kind: backend
provides_web_providers:

View File

@@ -1,7 +1,7 @@
"""OpenAI native web search — declares the Responses API server-side ``web_search`` built-in.
Config: ``web.search_backend: openai-native`` (or ``web.backend``).
Auth: openai-codex OAuth (``hermes auth --provider openai-codex``); no API key of its own.
Auth: openai-codex OAuth (``hermes auth add openai-codex``); no API key of its own.
Unlike every other provider here, this one never executes a search itself. Selecting it
tells the Codex Responses transport to declare the provider-executed ``web_search`` tool
@@ -83,6 +83,6 @@ class OpenAINativeWebSearchProvider(BaseWebSearchProvider):
return setup_schema(
self.DISPLAY_NAME,
"native",
"由模型服务端执行搜索(需 Codex Responses transport + openai-codex 登录);仅搜索,提取仍用其他后端",
"Search runs on the provider side (needs the Codex Responses transport + an openai-codex login); search only, extraction still uses another backend",
"",
)

View File

@@ -82,6 +82,7 @@ class TestBundledPluginsRegister:
"exa",
"firecrawl",
"keenable",
"openai-native",
"parallel",
"perplexity",
"searxng",
@@ -103,6 +104,9 @@ class TestBundledPluginsRegister:
("firecrawl", True, True),
# xai: search-only via Grok's agentic web_search tool.
("xai", True, False),
# openai-native: marker for the Codex Responses server-side web_search swap;
# search-only, so web_extract keeps its own backend (#19320).
("openai-native", True, False),
],
)
def test_capability_flags_match_spec(
@@ -121,7 +125,7 @@ class TestBundledPluginsRegister:
@pytest.mark.parametrize(
"plugin_name",
["brave-free", "ddgs", "searxng", "exa", "parallel", "tavily", "perplexity", "firecrawl", "keenable", "xai"],
["brave-free", "ddgs", "searxng", "exa", "parallel", "tavily", "perplexity", "firecrawl", "keenable", "xai", "openai-native"],
)
def test_each_plugin_has_name_and_display_name(self, plugin_name: str) -> None:
_ensure_plugins_loaded()

View File

@@ -28,7 +28,7 @@ Both are configured through a single backend selection. Providers are chosen via
| **Perplexity** | `PERPLEXITY_API_KEY` | ✔ | ✔ (query-relevant snippets) | Paid (per-request Search API pricing) |
| **Keenable** | `KEENABLE_API_KEY` (optional) | ✔ | ✔ | ✔ Keyless ring member · paid with key |
| **xAI (Grok)** | `XAI_API_KEY` or `hermes auth add xai-oauth` | ✔ | — | Paid (SuperGrok or per-token) |
| **OpenAI Native (Codex)** | `hermes auth --provider openai-codex` | ✔ | — | Requires a ChatGPT/Codex subscription |
| **OpenAI Native (Codex)** | `hermes auth add openai-codex` | ✔ | — | Requires a ChatGPT/Codex subscription |
Brave Search, DDGS, xAI, and OpenAI Native are **search-only** — pair any of them with Firecrawl/Tavily/Perplexity/Keenable/Exa/Parallel when you also need `web_extract`. DDGS uses the [`ddgs` Python package](https://pypi.org/project/ddgs/) under the hood; if it isn't already installed, run `pip install ddgs` (or let Hermes lazy-install it on first use). xAI runs Grok's server-side `web_search` tool on the Responses API — results are LLM-generated rather than index-backed, so titles, descriptions, and URL choice are all model output (see the [trust-model caveat](#xai-grok) below). OpenAI Native declares the same kind of provider-executed tool on the Codex Responses endpoint (see [below](#openai-native)).
@@ -388,7 +388,7 @@ web:
Requirements and scope:
- **Credentials**: an openai-codex OAuth login (`hermes auth --provider openai-codex`). This backend has no API key of its own; without a login it is simply unavailable.
- **Credentials**: an openai-codex OAuth login (`hermes auth add openai-codex`). This backend has no API key of its own; without a login it is simply unavailable.
- **Transport**: only the Codex Responses endpoint exposes the built-in. On any other transport — a custom OpenAI-compatible `base_url`, or a non-OpenAI model — the client-side `web_search` function is left untouched, because the endpoint cannot be relied on to host the tool. Point `web.search_backend` at an ordinary provider for those.
- **Search only**: the built-in covers search, not extraction. Pair it with Firecrawl (or another extract-capable backend) through `web.extract_backend` when you also need `web_extract`.