Skip to content

Commit 6eb8557

Browse files
feat: add Requesty as an OpenAI-compatible provider (#2399)
Requesty is an OpenAI-compatible LLM gateway. This mirrors the existing OpenRouter named-provider wiring 1:1: - llm_wrapper.py / openai_compatible_llm.py: add "requesty" to the provider lists and a base_url branch -> https://router.requesty.ai/v1 - config.py: default model map (openai/gpt-4o-mini), embeddings env vars, dataclass fields, and from_env wiring (REQUESTY_API_KEY fallbacks) - embeddings.py: requesty branch (same /v1 base) + Supported list - docs/llmProviders.json: factual provider entries Tested live against https://router.requesty.ai/v1/chat/completions (model openai/gpt-4o-mini) -> HTTP 200.
1 parent 85599f3 commit 6eb8557

6 files changed

Lines changed: 49 additions & 3 deletions

File tree

hindsight-api-slim/hindsight_api/config.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,11 @@ def parse_gemini_service_tier(value: str | None) -> str | None:
282282
ENV_RERANKER_OPENROUTER_MODEL = "HINDSIGHT_API_RERANKER_OPENROUTER_MODEL"
283283
ENV_RERANKER_OPENROUTER_BASE_URL = "HINDSIGHT_API_RERANKER_OPENROUTER_BASE_URL"
284284

285+
# Requesty configuration (OpenAI-compatible gateway; embeddings)
286+
ENV_REQUESTY_API_KEY = "HINDSIGHT_API_REQUESTY_API_KEY"
287+
ENV_EMBEDDINGS_REQUESTY_API_KEY = "HINDSIGHT_API_EMBEDDINGS_REQUESTY_API_KEY"
288+
ENV_EMBEDDINGS_REQUESTY_MODEL = "HINDSIGHT_API_EMBEDDINGS_REQUESTY_MODEL"
289+
285290
# ZeroEntropy configuration (embeddings)
286291
ENV_EMBEDDINGS_ZEROENTROPY_API_KEY = "HINDSIGHT_API_EMBEDDINGS_ZEROENTROPY_API_KEY"
287292
ENV_EMBEDDINGS_ZEROENTROPY_MODEL = "HINDSIGHT_API_EMBEDDINGS_ZEROENTROPY_MODEL"
@@ -643,6 +648,7 @@ def parse_gemini_service_tier(value: str | None) -> str | None:
643648
"bedrock": "us.amazon.nova-2-lite-v1:0",
644649
"volcano": "doubao-pro-32k",
645650
"openrouter": "qwen/qwen3.5-9b",
651+
"requesty": "openai/gpt-4o-mini",
646652
"fireworks": "accounts/fireworks/models/llama-v3p1-8b-instruct",
647653
"nous": "deepseek/deepseek-v4-flash",
648654
}
@@ -799,6 +805,9 @@ def _parse_strategy_boosts(raw: str | None) -> dict[str, str]:
799805
DEFAULT_RERANKER_OPENROUTER_MODEL = "cohere/rerank-v3.5"
800806
DEFAULT_RERANKER_OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1/rerank"
801807

808+
# Requesty defaults
809+
DEFAULT_EMBEDDINGS_REQUESTY_MODEL = "openai/text-embedding-3-small"
810+
802811
# ZeroEntropy defaults
803812
DEFAULT_EMBEDDINGS_ZEROENTROPY_MODEL = "zembed-1"
804813
# Shared between embeddings (zembed-1) and reranker (zerank-*) — the host is the same.
@@ -1600,6 +1609,8 @@ class HindsightConfig:
16001609
embeddings_cohere_output_dimensions: int | None
16011610
embeddings_openrouter_api_key: str | None
16021611
embeddings_openrouter_model: str
1612+
embeddings_requesty_api_key: str | None
1613+
embeddings_requesty_model: str
16031614
embeddings_litellm_api_base: str
16041615
embeddings_litellm_api_key: str | None
16051616
embeddings_litellm_model: str
@@ -2415,6 +2426,11 @@ def from_env(cls) -> "HindsightConfig":
24152426
or os.getenv(ENV_OPENROUTER_API_KEY)
24162427
or os.getenv(ENV_LLM_API_KEY),
24172428
embeddings_openrouter_model=os.getenv(ENV_EMBEDDINGS_OPENROUTER_MODEL, DEFAULT_EMBEDDINGS_OPENROUTER_MODEL),
2429+
# Requesty embeddings (with fallback to shared Requesty key, then LLM key)
2430+
embeddings_requesty_api_key=os.getenv(ENV_EMBEDDINGS_REQUESTY_API_KEY)
2431+
or os.getenv(ENV_REQUESTY_API_KEY)
2432+
or os.getenv(ENV_LLM_API_KEY),
2433+
embeddings_requesty_model=os.getenv(ENV_EMBEDDINGS_REQUESTY_MODEL, DEFAULT_EMBEDDINGS_REQUESTY_MODEL),
24182434
# ZeroEntropy embeddings
24192435
embeddings_zeroentropy_api_key=os.getenv(ENV_EMBEDDINGS_ZEROENTROPY_API_KEY)
24202436
or os.getenv("ZEROENTROPY_API_KEY"),

hindsight-api-slim/hindsight_api/engine/embeddings.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1638,6 +1638,20 @@ def create_embeddings_from_env() -> Embeddings:
16381638
batch_size=config.embeddings_openai_batch_size,
16391639
dimensions=config.embeddings_openai_dimensions,
16401640
)
1641+
elif provider == "requesty":
1642+
api_key = config.embeddings_requesty_api_key
1643+
if not api_key:
1644+
raise ValueError(
1645+
"HINDSIGHT_API_EMBEDDINGS_REQUESTY_API_KEY, HINDSIGHT_API_REQUESTY_API_KEY, "
1646+
f"or {ENV_LLM_API_KEY} is required when {ENV_EMBEDDINGS_PROVIDER} is 'requesty'"
1647+
)
1648+
return OpenAIEmbeddings(
1649+
api_key=api_key,
1650+
model=config.embeddings_requesty_model,
1651+
base_url="https://router.requesty.ai/v1",
1652+
batch_size=config.embeddings_openai_batch_size,
1653+
dimensions=config.embeddings_openai_dimensions,
1654+
)
16411655
elif provider == "zeroentropy":
16421656
api_key = config.embeddings_zeroentropy_api_key
16431657
if not api_key:
@@ -1701,6 +1715,6 @@ def create_embeddings_from_env() -> Embeddings:
17011715
else:
17021716
raise ValueError(
17031717
f"Unknown embeddings provider: {provider}. "
1704-
f"Supported: 'local', 'onnx', 'tei', 'openai', 'openai-codex', 'openrouter', 'cohere', 'google', "
1718+
f"Supported: 'local', 'onnx', 'tei', 'openai', 'openai-codex', 'openrouter', 'requesty', 'cohere', 'google', "
17051719
f"'zeroentropy', 'litellm', 'litellm-sdk'"
17061720
)

hindsight-api-slim/hindsight_api/engine/llm_wrapper.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,7 @@ def create_llm_provider(
464464
"deepseek",
465465
"volcano",
466466
"openrouter",
467+
"requesty",
467468
"zai",
468469
"opencode-go",
469470
"atlas",
@@ -592,6 +593,7 @@ def __init__(
592593
"bedrock",
593594
"volcano",
594595
"openrouter",
596+
"requesty",
595597
"zai",
596598
"opencode-go",
597599
"atlas",
@@ -617,6 +619,8 @@ def __init__(
617619
self.base_url = "https://api.deepseek.com"
618620
elif self.provider == "openrouter":
619621
self.base_url = "https://openrouter.ai/api/v1"
622+
elif self.provider == "requesty":
623+
self.base_url = "https://router.requesty.ai/v1"
620624
elif self.provider == "zai":
621625
self.base_url = "https://api.z.ai/api/coding/paas/v4"
622626
elif self.provider == "opencode-go":

hindsight-api-slim/hindsight_api/engine/providers/openai_compatible_llm.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@ def __init__(
465465
"deepseek",
466466
"volcano",
467467
"openrouter",
468+
"requesty",
468469
"zai",
469470
"opencode-go",
470471
"atlas",
@@ -489,6 +490,8 @@ def __init__(
489490
self.base_url = "https://api.deepseek.com"
490491
elif self.provider == "openrouter":
491492
self.base_url = "https://openrouter.ai/api/v1"
493+
elif self.provider == "requesty":
494+
self.base_url = "https://router.requesty.ai/v1"
492495
elif self.provider == "zai":
493496
self.base_url = "https://api.z.ai/api/coding/paas/v4"
494497
elif self.provider == "opencode-go":
@@ -513,6 +516,7 @@ def __init__(
513516
"minimax",
514517
"deepseek",
515518
"openrouter",
519+
"requesty",
516520
"zai",
517521
"opencode-go",
518522
"atlas",

hindsight-docs/docs/developer/configuration.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ For non-English banks (especially CJK) and the language/extraction-language trad
164164

165165
| Variable | Description | Default |
166166
|----------|-------------|---------|
167-
| `HINDSIGHT_API_LLM_PROVIDER` | Provider: `openai`, `openai-codex`, `claude-code`, `anthropic`, `gemini`, `groq`, `minimax`, `deepseek`, `zai`, `opencode-go`, `nous`, `fireworks`, `ollama`, `ollama-cloud`, `lmstudio`, `llamacpp`, `vertexai`, `bedrock`, `litellm`, `litellmrouter`, `volcano`, `openrouter`, `none` | `openai` |
167+
| `HINDSIGHT_API_LLM_PROVIDER` | Provider: `openai`, `openai-codex`, `claude-code`, `anthropic`, `gemini`, `groq`, `minimax`, `deepseek`, `zai`, `opencode-go`, `nous`, `fireworks`, `ollama`, `ollama-cloud`, `lmstudio`, `llamacpp`, `vertexai`, `bedrock`, `litellm`, `litellmrouter`, `volcano`, `openrouter`, `requesty`, `none` | `openai` |
168168
| `HINDSIGHT_API_LLM_API_KEY` | API key for LLM provider | - |
169169
| `HINDSIGHT_API_LLM_MODEL` | Model name | `gpt-5-mini` |
170170
| `HINDSIGHT_API_LLM_BASE_URL` | Custom LLM endpoint | Provider default |
@@ -270,6 +270,11 @@ export HINDSIGHT_API_LLM_PROVIDER=openrouter
270270
export HINDSIGHT_API_LLM_API_KEY=your-openrouter-api-key
271271
export HINDSIGHT_API_LLM_MODEL=qwen/qwen3.5-9b
272272

273+
# Requesty (OpenAI-compatible gateway)
274+
export HINDSIGHT_API_LLM_PROVIDER=requesty
275+
export HINDSIGHT_API_LLM_API_KEY=your-requesty-api-key
276+
export HINDSIGHT_API_LLM_MODEL=openai/gpt-4o-mini
277+
273278
# DeepSeek (OpenAI-compatible, https://api.deepseek.com)
274279
export HINDSIGHT_API_LLM_PROVIDER=deepseek
275280
export HINDSIGHT_API_LLM_API_KEY=sk-xxxxxxxxxxxx
@@ -518,7 +523,7 @@ two slots that retain/consolidation cannot consume.
518523

519524
| Variable | Description | Default |
520525
|----------|-------------|---------|
521-
| `HINDSIGHT_API_EMBEDDINGS_PROVIDER` | Provider: `local`, `onnx`, `tei`, `openai`, `openai-codex`, `openrouter`, `cohere`, `google`, `zeroentropy`, `litellm`, or `litellm-sdk` | `local` |
526+
| `HINDSIGHT_API_EMBEDDINGS_PROVIDER` | Provider: `local`, `onnx`, `tei`, `openai`, `openai-codex`, `openrouter`, `requesty`, `cohere`, `google`, `zeroentropy`, `litellm`, or `litellm-sdk` | `local` |
522527
| `HINDSIGHT_API_EMBEDDINGS_LOCAL_MODEL` | Model for local provider | `BAAI/bge-small-en-v1.5` |
523528
| `HINDSIGHT_API_EMBEDDINGS_LOCAL_TRUST_REMOTE_CODE` | Allow loading models with custom code (security risk, disabled by default) | `false` |
524529
| `HINDSIGHT_API_EMBEDDINGS_LOCAL_FORCE_CPU` | Force CPU mode for local embeddings (avoids MPS/XPC issues on macOS) | `false` |
@@ -540,6 +545,8 @@ two slots that retain/consolidation cannot consume.
540545
| `HINDSIGHT_API_EMBEDDINGS_OPENAI_BATCH_SIZE` | Max inputs per `embeddings.create` call for `openai`/`openrouter` providers — lower this when the upstream endpoint enforces stricter limits (e.g. DashScope caps at 10) | `100` |
541546
| `HINDSIGHT_API_EMBEDDINGS_OPENAI_DIMENSIONS` | Optional requested output dimensions for OpenAI `text-embedding-3` models (e.g., `384` to match an existing pgvector schema) | - |
542547
| `HINDSIGHT_API_EMBEDDINGS_OPENROUTER_API_KEY` | OpenRouter API key for embeddings (falls back to `HINDSIGHT_API_OPENROUTER_API_KEY`, then `HINDSIGHT_API_LLM_API_KEY`) | - |
548+
| `HINDSIGHT_API_EMBEDDINGS_REQUESTY_API_KEY` | Requesty API key for embeddings (falls back to `HINDSIGHT_API_REQUESTY_API_KEY`, then `HINDSIGHT_API_LLM_API_KEY`) | - |
549+
| `HINDSIGHT_API_EMBEDDINGS_REQUESTY_MODEL` | Requesty embedding model | `openai/text-embedding-3-small` |
543550
| `HINDSIGHT_API_EMBEDDINGS_OPENROUTER_MODEL` | OpenRouter embedding model | `perplexity/pplx-embed-v1-0.6b` |
544551
| `HINDSIGHT_API_EMBEDDINGS_ZEROENTROPY_API_KEY` | ZeroEntropy API key for embeddings | - |
545552
| `HINDSIGHT_API_EMBEDDINGS_ZEROENTROPY_MODEL` | ZeroEntropy embedding model | `zembed-1` |

hindsight-docs/src/data/llmProviders.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
{"id": "atlas", "label": "Atlas Cloud", "iconKey": "openai-compatible", "defaultModel": "deepseek-ai/deepseek-v4-pro"},
1616
{"id": "volcano", "label": "Volcano Engine", "iconKey": "zap", "defaultModel": "doubao-pro-32k"},
1717
{"id": "openrouter", "label": "OpenRouter", "iconKey": "globe", "defaultModel": "qwen/qwen3.5-9b"},
18+
{"id": "requesty", "label": "Requesty", "iconKey": "openai-compatible", "defaultModel": "openai/gpt-4o-mini"},
1819
{"id": "openai-codex", "label": "OpenAI Codex", "iconKey": "openai", "defaultModel": "gpt-5.4-mini"},
1920
{"id": "claude-code", "label": "Claude Code", "iconKey": "anthropic", "defaultModel": "claude-sonnet-4-5-20250929"},
2021
{"id": "bedrock", "label": "AWS Bedrock", "iconKey": "cloud", "defaultModel": "us.amazon.nova-2-lite-v1:0"},

0 commit comments

Comments
 (0)