feat(web-search-deepseek): resolve provider options from the settings section

The provider now takes a thunk rather than a value: it projects the
authoritative section per search, so a stored endpoint, model, or key
reference reaches the next call without re-registering the provider — which
would make the seam's provider selection observable as a flicker.

apiKey already carries role('secret'), so the section is safe to describe:
the literal never rides a response in any layer and a configuration surface
learns only that a key is set.
This commit is contained in:
Yichen Jiang
2026-08-10 18:06:27 +08:00
parent fdf9bddbf8
commit f736e6f584
17 changed files with 236 additions and 45 deletions

View File

@@ -177,7 +177,18 @@ export function mapAnthropicResponse(response: AnthropicResponse): WebSearchResu
export class DeepSeekSearchProvider implements WebSearchProvider {
readonly id = DEEPSEEK_PROVIDER_ID
constructor(private readonly options: DeepSeekSearchProviderOptions) {}
/**
* @param resolveOptions - the options for the NEXT operation. A thunk rather
* than a value because the plugin's settings section can change between
* searches, and re-registering the provider to carry a new endpoint would
* make the seam's selection observable to the user as a flicker.
*/
constructor(private readonly resolveOptions: () => DeepSeekSearchProviderOptions) {}
/** Options resolved per read, so a committed settings change reaches the next search. */
private get options(): DeepSeekSearchProviderOptions {
return this.resolveOptions()
}
available(): boolean {
return ((this.options.apiKey?.length ?? 0) > 0 || this.options.resolveApiKey !== undefined)