Skip to content

feat: add Obscurify.ai to the built-in provider catalog - #4751

Open
tonydavis629 wants to merge 1 commit into
docker:mainfrom
tonydavis629:add-obscurify-ai
Open

tonydavis629 wants to merge 1 commit into
docker:mainfrom
tonydavis629:add-obscurify-ai

Conversation

@tonydavis629

@tonydavis629 tonydavis629 commented Oct 28, 2026 •

Copy link
Copy Markdown

Summary

Rebuilt on the embedded provider catalog from #4755, following the contributor guide from #4761:

  • pkg/model/provider/catalog/providers.json: an obscurify entry using the existing OpenAI implementation (api_type: openai, base URL https://obscurify.ai/v1, OBSCURIFY_API_KEY, default model deepseek/deepseek-v4-flash, merge_consecutive_messages like the other open-model hosts). It sits after cloudgpu, so it ranks low for automatic selection.
  • Tests: a row in openAIAliasProviders (hermetic request test, plus the opt-in live test), rows in the auto-selection tables, a shouldMergeConsecutiveMessages row, and the models.dev exemptions in TestProviderIDsMatchEmbeddedCatalog and modelsDevAbsentProviders. Obscurify.ai isn't in the models.dev snapshot yet, the same situation as runcrate, atlascloud and lunaroute.
  • Docs: a provider page, a nav entry, a row in the provider credentials table, the provider lists in docs/configuration/models and the schema description, and an examples/obscurify.yaml recipe.

Obscurify.ai is a privacy-focused provider with an OpenAI-compatible API and 200+ models. Accounts are a random account number with no email, and prompts and responses are not stored on the server.

Testing

On main at 72e52dc, Go 1.27.3:

  • go test ./pkg/model/provider/... ./pkg/config/... ./cmd/... ./pkg/runtime/modelcatalog/...: pass. gofmt -l pkg cmd is clean.
  • OBSCURIFY_API_KEY=... go test -count=1 -run 'TestOpenAIAliasProvider_LiveAPI$/obscurify' ./pkg/model/provider/: PASS against the real API.
  • Built the binary with only OBSCURIFY_API_KEY set, in a clean HOME:
    • docker-agent models lists obscurify deepseek/deepseek-v4-flash as the default.
    • docker-agent run --exec examples/obscurify.yaml asked to read a local file: the agent called read_file and answered with the file's contents.
  • Not run: task lint, because golangci-lint isn't installed here. docker-agent run --exec default with only this key still went to DMR when I checked on 7a9206a, and RUNCRATE_API_KEY and GROQ_API_KEY did the same, so I left that alone.

The commit has a DCO sign-off and a verified SSH signature.

Disclosure: I run it.

@tonydavis629
tonydavis629 requested a review from a team as a code owner October 28, 2026 14:39
@aheritier aheritier added area/config For configuration parsing, YAML, environment variables area/docs Documentation changes area/models LLM model integrations and model providers area/providers For features/issues/fixes related to LLM providers (Bedrock, LiteLLM, Qwen, custom, etc.) area/providers/openai For features/issues/fixes related to the usage of OpenAI models kind/feat PR adds a new feature (maps to feat:). Use on PRs only. status/needs-signed-commits Some commits in the PR are signed with a valid SSH/GPG key labels Oct 28, 2026
@aheritier

Copy link
Copy Markdown
Collaborator

👋 Some commits in this PR are not signed and verified by GitHub. Please sign your commits with a GPG or SSH key registered in your GitHub account, then force-push.

Commits that are not verified: 2460796

See GitHub’s guide on signing commits for setup instructions. I’ve added status/needs-signed-commits; it will be removed automatically once every commit in this PR carries a valid GitHub-verified signature.

@aheritier aheritier added the status/needs-rebase PR has merge conflicts or is out of date with main label Oct 28, 2026
@aheritier

Copy link
Copy Markdown
Collaborator

👋 This PR has merge conflicts with the base branch. Please rebase or merge the latest base branch and resolve them. I've moved it to draft and added status/needs-rebase; it'll be picked back up automatically once the conflicts are cleared.

@aheritier aheritier removed the status/needs-signed-commits Some commits in the PR are signed with a valid SSH/GPG key label Oct 28, 2026
@aheritier

Copy link
Copy Markdown
Collaborator

Hi @tonydavis629 we are sorry but we just changed how we manage our providers using a more centralized approach. Could you rebuild our PR with it

Ref: #4755 and #4761

@aheritier
aheritier marked this pull request as draft October 29, 2026 09:22
@tonydavis629 tonydavis629 changed the title feat: add Obscurify.ai as an OpenAI-compatible provider alias feat: add Obscurify.ai to the built-in provider catalog Oct 29, 2026
@tonydavis629
tonydavis629 marked this pull request as ready for review October 29, 2026 13:55
@tonydavis629

Copy link
Copy Markdown
Author

Thanks for the pointer. I rebuilt it on the catalog: Obscurify.ai is now a single entry in providers.json using the OpenAI implementation, with no alias table or client changes. The tests and docs follow the contributor guide. It's one signed and signed-off commit (37e903f) on current main, and the description has the details. Unit tests and the opt-in live test pass. I've marked it ready for review.

@aheritier aheritier removed the status/needs-rebase PR has merge conflicts or is out of date with main label Oct 29, 2026
@aheritier
aheritier requested a balanced review from Copilot October 29, 2026 22:32

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The Obscurify live test lacks an explicit opt-in guard, allowing ordinary test runs to send paid API requests whenever OBSCURIFY_API_KEY is exported.

1 open issue
What changed in this PR

Adds Obscurify.ai to Docker Agent’s embedded provider catalog, reusing the existing OpenAI-compatible implementation.

Changes:

  • Registers the endpoint, API-key variable, default model, and message-merging behavior.
  • Extends provider and configuration tests, including models.dev exemptions.
  • Adds setup documentation, navigation, and an example configuration.
File Description
pkg/​model/​provider/​openai/​system_message_merge_test.go Tests Obscurify message-merging behavior.
pkg/​model/​provider/​openai_alias_providers_test.go Adds shared request and live-test coverage.
pkg/​model/​provider/​catalog/​providers.json Registers the provider and its defaults.
pkg/​model/​provider/​catalog_test.go Exempts Obscurify from models.dev matching.
pkg/​config/​examples_test.go Allows example models absent from models.dev.
pkg/​config/​auto_test.go Tests credential discovery and automatic model selection.
examples/​README.md Lists the new example.
examples/​obscurify.yaml Provides a tool-enabled agent configuration.
docs/​providers/​overview/​index.md Lists provider credentials.
docs/​providers/​obscurify/​index.md Documents setup, usage, models, and limitations.
docs/​data/​nav.yml Adds provider navigation.
docs/​configuration/​models/​index.md Adds Obscurify to documented provider lists.
agent-schema.json Updates the supported-provider description.

Review effort: Balanced

testKey: "test-obscurify-key",
model: "deepseek/deepseek-v4-flash",
greeting: "Hello from Obscurify.ai",
mergesSystemMessages: true,

@aheritier aheritier left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed provider dispatch/defaults, credentials and auto-selection, model listing/picker behavior, request/streaming coverage, schema, and documentation against the provider implementation checklist. See inline comments.

CI / operational status: The required gate passed at 37e903f; all executed checks succeeded. The PR is not draft, but GitHub reports mergeable=false and mergeable_state=dirty. Resolve the conflicts and revalidate the resulting head. No local Go tests were run because the available worktree differs from the PR head; review used fetched head sources. No paid inference requests were made.

Issue context: Reviewed #4755 and #4761 and their accessible discussions as implementation/guidance references. No acceptance-criteria issue or Jira reference is linked. Needs-decision: confirm that the PR description is the complete acceptance scope; no additional requirements were inferred.

testKey: "test-obscurify-key",
model: "deepseek/deepseek-v4-flash",
greeting: "Hello from Obscurify.ai",
mergesSystemMessages: true,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blocking][correctness] Require explicit opt-in before paid live inference. This row leaves liveOptInEnvVar empty, so runOpenAIAliasProviderLiveAPI bypasses its opt-in check and sends a real completion whenever OBSCURIFY_API_KEY is exported. TestOpenAIAliasProvider_LiveAPI runs for every alias, and .env.test does not clear this key, so an ordinary go test ./... or task test can unexpectedly consume the developer's paid balance. Set liveOptInEnvVar: "DOCKER_AGENT_RUN_OBSCURIFY_LIVE_TEST" and require its value to be 1, matching API Route/Lunaroute/OrcaRouter. This also includes Obscurify in the existing credential-alone/no-request regression test. Confidence: high; verified against the row, live-test helper, regression-test selector, and .env.test at this head.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed: the Obscurify row now sets liveOptInEnvVar: "DOCKER_AGENT_RUN_OBSCURIFY_LIVE_TEST". Locally, TestOpenAIAliasProvider_LiveAPI/obscurify skips with only OBSCURIFY_API_KEY exported, and TestOpenAIAliasProvider_LiveAPIRequiresExplicitOptIn/obscurify passes. Thanks for catching it.

@aheritier
aheritier marked this pull request as draft October 31, 2026 19:15
@aheritier aheritier added the status/needs-rebase PR has merge conflicts or is out of date with main label Nov 1, 2026
@aheritier

Copy link
Copy Markdown
Collaborator

👋 This PR has merge conflicts with the base branch. Please rebase or merge the latest base branch and resolve them. I've moved it to draft and added ; it'll be picked back up automatically once the conflicts are cleared.

@aheritier

Copy link
Copy Markdown
Collaborator

👋 This PR has merge conflicts with the base branch. Please rebase or merge the latest base branch and resolve them. I've moved it to draft and added status/needs-rebase; it'll be picked back up automatically once the conflicts are cleared.

@tonydavis629
tonydavis629 marked this pull request as ready for review November 1, 2026 14:49
@aheritier aheritier removed the status/needs-rebase PR has merge conflicts or is out of date with main label Nov 1, 2026
@aheritier
aheritier self-requested a review November 4, 2026 12:08

@aheritier aheritier left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed all 13 changed files against the provider implementation checklist, including catalog dispatch/defaults, credentials, selection/discovery, model listing, request/streaming tests, schema, examples, and documentation. No additional demonstrated findings beyond the existing blocking thread.

CI / operational status: Required gate passed at this head; the check rollup is SUCCESS and all executed checks succeeded. Race tests were skipped. The PR is not draft and has no merge conflicts, but GitHub reports mergeable_state=blocked. No local tests were run because the available worktree differs from the PR head. No paid inference requests were made.

Issue context: Reviewed #4755 and #4761 and their accessible discussions as implementation/guidance references; #4756 and #4757 track separate follow-ups. No acceptance-criteria issue or Jira reference is linked. Needs-decision: confirm that the PR description is the complete acceptance scope; no additional requirements were inferred.

Prior threads:

  • 4418619721: Still valid but outdated; its root cause is already tracked by current unresolved thread 4432978325, so no duplicate inline comment is added.
  • 4432978325: Still open [blocking], confidence high. Reverified at the current head: the Obscurify row omits liveOptInEnvVar, the live-test helper permits inference with credentials alone, and .env.test does not clear OBSCURIFY_API_KEY. The requested explicit opt-in remains necessary.

@aheritier
aheritier marked this pull request as draft November 4, 2026 20:29
Add an obscurify entry to the embedded provider catalog
(https://obscurify.ai/v1, OBSCURIFY_API_KEY, default model
deepseek/deepseek-v4-flash, consecutive-message merging like the other
open-model hosts) and exempt it from the models.dev ID checks since it
is not in the snapshot yet. Document it with a provider page, navigation,
the provider tables, the schema description and an example recipe.

Signed-off-by: Tony Davis <acdavis629@gmail.com>
@tonydavis629
tonydavis629 marked this pull request as ready for review November 7, 2026 17:42
@tonydavis629

Copy link
Copy Markdown
Author

@aheritier the blocking thread is fixed in ba107af (the Obscurify live test now needs DOCKER_AGENT_RUN_OBSCURIFY_LIVE_TEST=1), and the PR is ready for another look.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/config For configuration parsing, YAML, environment variables area/docs Documentation changes area/models LLM model integrations and model providers area/providers/openai For features/issues/fixes related to the usage of OpenAI models area/providers For features/issues/fixes related to LLM providers (Bedrock, LiteLLM, Qwen, custom, etc.) kind/feat PR adds a new feature (maps to feat:). Use on PRs only.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants