Skip to content

[feat]: add Requesty provider (OpenAI-compatible router) - #4993

Closed
diathic wants to merge 2 commits into
maximhq:devfrom
diathic:feat/requesty-provider
Closed

[feat]: add Requesty provider (OpenAI-compatible router)#4993
diathic wants to merge 2 commits into
maximhq:devfrom
diathic:feat/requesty-provider

Conversation

@diathic

@diathic diathic commented Jul 7, 2026

Copy link
Copy Markdown

Summary

Adds Requesty (https://router.requesty.ai) as a built-in provider. Requesty is an OpenAI-compatible LLM router (similar to OpenRouter), so it is implemented as an OpenAI-compatible provider that delegates to the shared openai.* handlers — mirroring the existing Parasail/OpenRouter providers.

Closes #4740.

Changes

  • New provider core/providers/requesty/ — chat completions (+ streaming), Responses API (via chat fallback), and list-models; all other operations return the standard "unsupported" error. Default base URL https://router.requesty.ai, bearer auth.
  • RegistrationModelProvider enum + StandardProviders (core/schemas/bifrost.go), provider import + init-switch case (core/bifrost.go), dynamicallyConfigurableProviders (core/utils.go).
  • Config schematransports/config.schema.json (provider $ref + base-provider enum).
  • UI — provider name/label, model placeholder, key-required flag, and icon (ui/lib/constants/{logs,config,icons}).
  • Test infracore/internal/llmtests/account.go (maps REQUESTY_API_KEY, provider list, network config) + requesty_test.go (skips when the key is unset).
  • CIREQUESTY_API_KEY added to pr-tests.yml and release-pipeline.yml.
  • Docs — new docs/providers/supported-providers/requesty.mdx, nav entry, and overview table row.
  • Changelogscore/changelog.md, transports/changelog.md.

Note: the provider icon in ui/lib/constants/icons.tsx is a placeholder monogram (flagged with a comment). Happy to swap in the official Requesty brand SVG — please point me to it.

Type of change

  • Feature

Affected areas

  • Core (Go)
  • Transports (HTTP)
  • Providers/Integrations
  • UI (React)
  • Docs

How to test

export REQUESTY_API_KEY=<key>
make test-core PROVIDER=requesty
# build
cd core && go build ./...
cd ../ui && npm i && npm run typecheck && npm run build

Or configure a requesty provider with REQUESTY_API_KEY and send an OpenAI-format chat completion for a model such as openai/gpt-4o-mini.

Breaking changes

  • No

Related issues

Closes #4740

Security considerations

No new secret handling beyond the standard provider API-key flow (REQUESTY_API_KEY), identical to other providers.

Checklist

  • Read and followed docs/contributing guidelines (branched from/targeting dev)
  • Added a provider test (requesty_test.go)
  • Updated documentation and changelogs
  • Commit follows [type]: description format with affected packages listed
  • Full local go build/UI build not run in my environment — gofmt passes (syntax + formatting) and the provider is structurally identical to Parasail; leaving the full compile to CI

Adds Requesty (https://router.requesty.ai) as a built-in OpenAI-compatible
provider, modeled on the existing Parasail provider. Closes #4740.

Affected packages:
- core/providers/requesty/ - new provider (chat + streaming, responses, list models); delegates to openai.*
- core/schemas/bifrost.go - ModelProvider enum + StandardProviders
- core/bifrost.go - provider import + init switch case
- core/utils.go - dynamicallyConfigurableProviders
- core/internal/llmtests/account.go - test key mapping (REQUESTY_API_KEY), provider list, network config
- transports/config.schema.json - provider schema entry + base-provider enum
- ui/lib/constants/ - provider name/label, model placeholder, key-required, placeholder icon
- .github/workflows/ - REQUESTY_API_KEY in pr-tests and release-pipeline
- docs/ - provider page, docs.json nav, supported-providers overview
- core/changelog.md, transports/changelog.md

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@diathic
diathic requested a review from a team as a code owner July 7, 2026 11:01
@CLAassistant

CLAassistant commented Jul 7, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 57f4b6bc-442a-4581-b357-461efa81de79

📥 Commits

Reviewing files that changed from the base of the PR and between 3a16a2a and 6d5dd94.

📒 Files selected for processing (3)
  • core/providers/requesty/requesty.go
  • docs/providers/supported-providers/overview.mdx
  • docs/providers/supported-providers/requesty.mdx
✅ Files skipped from review due to trivial changes (2)
  • docs/providers/supported-providers/overview.mdx
  • docs/providers/supported-providers/requesty.mdx
🚧 Files skipped from review as they are similar to previous changes (1)
  • core/providers/requesty/requesty.go

📝 Walkthrough

Summary by CodeRabbit

  • New Features
    • Added a new Requesty provider with support for Chat Completions and Responses APIs, including streaming.
    • Updated configuration to recognize Requesty, require an API key, and enable dynamic provider setup.
    • Added Requesty to the UI (provider placeholder, icon, and label) and the supported providers matrix.
  • Bug Fixes
    • Unsupported Requesty capabilities are explicitly blocked with standardized “unsupported operation” behavior.
  • Documentation
    • Added Requesty provider documentation and updated changelogs/workflows-related release notes.
  • Tests
    • Added conditional comprehensive provider tests for Requesty when the API key is set.

Walkthrough

This PR adds Requesty as a supported provider, wires it into core provider creation and test configuration, adds CI secret plumbing, updates UI/provider metadata, and documents the provider surface.

Changes

Requesty Provider Integration

Layer / File(s) Summary
Provider type definitions and registration
core/schemas/bifrost.go, core/utils.go, transports/config.schema.json
Adds Requesty to provider constants and allowlists, and exposes providers.requesty plus the custom base-provider enum entry in config schema.
RequestyProvider client implementation
core/providers/requesty/requesty.go, core/providers/requesty/cachedcontents.go
Implements RequestyProvider construction and OpenAI-compatible chat/list/responses paths, with unsupported-operation errors for the remaining provider methods.
Core factory wiring and comprehensive test config
core/bifrost.go, core/internal/llmtests/account.go
Registers Requesty in the core provider factory and adds Requesty credentials/config to comprehensive LLM tests.
Provider tests and CI secret wiring
core/providers/requesty/requesty_test.go, .github/workflows/pr-tests.yml, .github/workflows/release-pipeline.yml
Adds Requesty comprehensive tests and injects REQUESTY_API_KEY into PR and release workflow jobs.
UI provider metadata and icon
ui/lib/constants/logs.ts, ui/lib/constants/config.ts, ui/lib/constants/icons.tsx
Adds Requesty labels, placeholders, API-key requirements, and a provider icon.
Documentation and changelogs
docs/providers/supported-providers/requesty.mdx, docs/docs.json, docs/providers/supported-providers/overview.mdx, core/changelog.md, transports/changelog.md
Adds Requesty documentation, navigation, support-matrix coverage, and changelog entries.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

  • maximhq/bifrost#4601: Extends the same provider wiring paths to add another built-in provider.
  • maximhq/bifrost#4736: Also updates provider registration and test-account configuration for a new provider type.

Suggested reviewers: akshaydeo, danpiths, roroghost17

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly states the main change: adding the Requesty provider.
Description check ✅ Passed The PR description follows the template and covers summary, changes, testing, issues, security, and checklist items.
Linked Issues check ✅ Passed The implementation adds Requesty as a built-in provider and makes it available in provider lists and configuration.
Out of Scope Changes check ✅ Passed The changes are focused on Requesty support, documentation, tests, CI, and wiring needed for that provider.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.12.2)

level=error msg="[linters_context] typechecking error: pattern ./...: directory prefix . does not contain main module or its selected dependencies"


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Confidence Score: 5/5

The change is safe to merge — it adds a self-contained new provider that does not touch any shared routing logic, existing providers, or the plugin pipeline.

The provider implementation is structurally identical to Parasail, an already-reviewed and proven pattern. Streaming uses the dedicated streaming client and idle-timeout reader, path overrides flow through GetPathFromContext in both unary and streaming paths, and all unsupported operations return the standard error. Registration is complete across all required callsites (schemas, bifrost.go, utils.go, config schema, UI constants). No shared state, no new goroutine lifecycle, no migration, no auth bypass.

No files require special attention. All changed files follow the existing provider-addition checklist completely.

Important Files Changed

Filename Overview
core/providers/requesty/requesty.go New Requesty provider: uses streamingClient for streaming paths, GetPathFromContext in all URL construction, BearerAuth header, and delegates all live operations to shared OpenAI handlers. Structurally mirrors Parasail correctly.
core/providers/requesty/cachedcontents.go All five cached-content operations correctly return NewUnsupportedOperationError — consistent with other OpenAI-compatible providers.
core/providers/requesty/requesty_test.go Test skips when REQUESTY_API_KEY is absent, runs the shared comprehensive test suite, and correctly disables unsupported scenarios (TextCompletion, Embedding, images).
core/schemas/bifrost.go Adds Requesty ModelProvider constant and appends it to StandardProviders — both changes required for provider registration.
core/bifrost.go Import and switch-case entry added for requesty; placed before the default case. Correct.
core/utils.go Requesty added to dynamicallyConfigurableProviders — matches pattern for other OpenAI-compatible providers (OpenRouter, Parasail, Perplexity).
core/internal/llmtests/account.go Requesty added to GetConfiguredProviders, GetKeysForProvider (reads REQUESTY_API_KEY from env), and GetConfigForProvider with generous retry settings appropriate for a routing layer.
transports/config.schema.json Provider $ref and base-provider enum entry added for requesty — aligned with the config schema source-of-truth requirement.
docs/providers/supported-providers/requesty.mdx New provider documentation covering supported operations, setup tabs, caveats, and filtered parameters. No broken image references in the current revision.
ui/lib/constants/config.ts ModelPlaceholders and isKeyRequiredByProvider both updated for requesty — consistent with existing provider entries.
ui/lib/constants/icons.tsx Placeholder monogram SVG added for requesty with a comment flagging it as temporary. No browser crypto usage introduced.
ui/lib/constants/logs.ts requesty added to KnownProvidersNames and ProviderLabels — required for log display.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant Client
    participant BifrostCore as Bifrost Core
    participant RequestyProvider as Requesty Provider
    participant OpenAIHandler as OpenAI Shared Handler
    participant RequestyAPI as Requesty API (router.requesty.ai)

    Client->>BifrostCore: ChatCompletion / ChatCompletionStream
    BifrostCore->>RequestyProvider: route via switch(schemas.Requesty)
    RequestyProvider->>OpenAIHandler: HandleOpenAIChatCompletionRequest (unary client)
    RequestyProvider->>OpenAIHandler: HandleOpenAIChatCompletionStreaming (streamingClient)
    OpenAIHandler->>RequestyAPI: POST /v1/chat/completions (Bearer auth)
    RequestyAPI-->>OpenAIHandler: OpenAI-compatible response / SSE stream
    OpenAIHandler-->>Client: BifrostChatResponse / chan BifrostStreamChunk

    Client->>BifrostCore: Responses / ResponsesStream
    BifrostCore->>RequestyProvider: route via switch
    RequestyProvider->>RequestyProvider: ToChatRequest() conversion
    RequestyProvider->>OpenAIHandler: delegate to ChatCompletion(Stream)
    OpenAIHandler-->>Client: BifrostResponsesResponse / stream

    Client->>BifrostCore: ListModels
    BifrostCore->>RequestyProvider: route
    RequestyProvider->>OpenAIHandler: HandleOpenAIListModelsRequest
    OpenAIHandler->>RequestyAPI: GET /v1/models
    RequestyAPI-->>Client: model list
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant Client
    participant BifrostCore as Bifrost Core
    participant RequestyProvider as Requesty Provider
    participant OpenAIHandler as OpenAI Shared Handler
    participant RequestyAPI as Requesty API (router.requesty.ai)

    Client->>BifrostCore: ChatCompletion / ChatCompletionStream
    BifrostCore->>RequestyProvider: route via switch(schemas.Requesty)
    RequestyProvider->>OpenAIHandler: HandleOpenAIChatCompletionRequest (unary client)
    RequestyProvider->>OpenAIHandler: HandleOpenAIChatCompletionStreaming (streamingClient)
    OpenAIHandler->>RequestyAPI: POST /v1/chat/completions (Bearer auth)
    RequestyAPI-->>OpenAIHandler: OpenAI-compatible response / SSE stream
    OpenAIHandler-->>Client: BifrostChatResponse / chan BifrostStreamChunk

    Client->>BifrostCore: Responses / ResponsesStream
    BifrostCore->>RequestyProvider: route via switch
    RequestyProvider->>RequestyProvider: ToChatRequest() conversion
    RequestyProvider->>OpenAIHandler: delegate to ChatCompletion(Stream)
    OpenAIHandler-->>Client: BifrostResponsesResponse / stream

    Client->>BifrostCore: ListModels
    BifrostCore->>RequestyProvider: route
    RequestyProvider->>OpenAIHandler: HandleOpenAIListModelsRequest
    OpenAIHandler->>RequestyAPI: GET /v1/models
    RequestyAPI-->>Client: model list
Loading

Reviews (2): Last reviewed commit: "[fix]: requesty - honor request path ove..." | Re-trigger Greptile

Comment thread core/providers/requesty/requesty.go

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 3

🧹 Nitpick comments (1)
ui/lib/constants/icons.tsx (1)

768-789: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Placeholder icon ships to production.

The added requesty icon is explicitly noted as a placeholder monogram, unlike all other providers in this file which use official brand SVGs or /images/*.webp assets. Shipping a non-brand placeholder in the provider list/selector is user-visible and should be swapped for the real Requesty logo before this lands, or tracked as a follow-up if brand assets aren't available yet.

Do you want me to open a follow-up issue to track replacing this with the official Requesty SVG?

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ui/lib/constants/icons.tsx` around lines 768 - 789, The requesty entry in
icons.tsx is a placeholder monogram and should not ship as the visible provider
icon. Replace the current placeholder SVG in the requesty icon renderer with the
official Requesty brand asset, following the same pattern used by the other
provider icons in this file, or remove it until the real asset is available.
Keep the change localized to the requesty symbol so the provider selector uses
the correct brand icon.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@core/providers/requesty/requesty.go`:
- Around line 96-141: The streaming chat completion path in Requesty still
hardcodes the chat completions URL, so `ChatCompletionStream` should mirror
`ChatCompletion` and use `providerUtils.GetPathFromContext(ctx,
"/v1/chat/completions")` instead of a fixed string. Update the
`RequestyProvider.ChatCompletionStream` call to
`openai.HandleOpenAIChatCompletionStreaming` to respect
`request_path_overrides.chat_completion_stream`, and make the same change in the
corresponding `ParasailProvider.ChatCompletionStream` implementation.

In `@docs/providers/supported-providers/overview.mdx`:
- Line 37: The support matrix entry for Requesty is marking Responses as native
support, but it should be fallback support instead. Update the Requesty row in
overview.mdx so both Responses columns use the fallback marker rather than the
green check, keeping Chat Completions unchanged. Use the Requesty provider row
in the matrix to locate the affected cells.

In `@docs/providers/supported-providers/requesty.mdx`:
- Around line 18-22: Update the supported-providers table in requesty.mdx so the
Responses API entry uses the public endpoint `/v1/responses` instead of
`/v1/chat/completions`. Keep the explanatory note below unchanged, and verify
the row in the table remains aligned with the corresponding operation name
“Responses API” and the existing Chat Completions entry.

---

Nitpick comments:
In `@ui/lib/constants/icons.tsx`:
- Around line 768-789: The requesty entry in icons.tsx is a placeholder monogram
and should not ship as the visible provider icon. Replace the current
placeholder SVG in the requesty icon renderer with the official Requesty brand
asset, following the same pattern used by the other provider icons in this file,
or remove it until the real asset is available. Keep the change localized to the
requesty symbol so the provider selector uses the correct brand icon.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: ab240d52-fa01-4a91-a7e6-a078a4dfbbeb

📥 Commits

Reviewing files that changed from the base of the PR and between d9577ba and 3a16a2a.

📒 Files selected for processing (18)
  • .github/workflows/pr-tests.yml
  • .github/workflows/release-pipeline.yml
  • core/bifrost.go
  • core/changelog.md
  • core/internal/llmtests/account.go
  • core/providers/requesty/cachedcontents.go
  • core/providers/requesty/requesty.go
  • core/providers/requesty/requesty_test.go
  • core/schemas/bifrost.go
  • core/utils.go
  • docs/docs.json
  • docs/providers/supported-providers/overview.mdx
  • docs/providers/supported-providers/requesty.mdx
  • transports/changelog.md
  • transports/config.schema.json
  • ui/lib/constants/config.ts
  • ui/lib/constants/icons.tsx
  • ui/lib/constants/logs.ts

Comment thread core/providers/requesty/requesty.go
Comment thread docs/providers/supported-providers/overview.mdx Outdated
Comment thread docs/providers/supported-providers/requesty.mdx
…rections

Addresses PR #4993 review (CodeRabbit + Greptile):
- core/providers/requesty/requesty.go - ChatCompletionStream now uses
  providerUtils.GetPathFromContext so request_path_overrides.chat_completion_stream
  is respected (matches the non-streaming path)
- docs/providers/supported-providers/requesty.mdx - Responses API row uses
  /v1/responses; removed reference to non-existent dashboard screenshot
- docs/providers/supported-providers/overview.mdx - Responses columns marked
  fallback since Requesty converts Responses to Chat Completions

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Add Requesty as a provider

2 participants