CherryHQ/cherry-studio · error · Error

Use rerankingModel() for jina-rerank endpoint type

Error message

Use rerankingModel() for jina-rerank endpoint type

What it means

Thrown by createNewApi's createChatModel() when endpointType === 'jina-rerank'. Same separation principle as the embedding case: reranking models must be resolved via provider.rerankingModel(), and the chat path refuses to instantiate a reranker as a LanguageModelV3.

Source

Thrown at src/main/ai/provider/custom/newapiProvider.ts:132

      headers: authHeaders,
      fetch: customFetch
    })

  const createChatModel = (modelId: string): LanguageModelV3 => {
    switch (endpointType) {
      case 'anthropic':
        return createAnthropicModel(modelId)
      case 'gemini':
        return createGeminiModel(modelId)
      case 'openai-response':
        return createResponsesModel(modelId)
      case 'openai':
      case 'image-generation':
        return createCompatibleModel(modelId)
      case 'embedding':
        throw new Error('Use embeddingModel() for embedding endpoint type')
      case 'jina-rerank':
        throw new Error('Use rerankingModel() for jina-rerank endpoint type')
      default:
        return createCompatibleModel(modelId)
    }
  }

  const provider = (modelId: string) => createChatModel(modelId)
  provider.specificationVersion = 'v3' as const

  provider.languageModel = createChatModel

  provider.embeddingModel = (modelId: string) =>
    new OpenAICompatibleEmbeddingModel(modelId, {
      provider: `${NEWAPI_PROVIDER_NAME}.embedding`,
      url,
      headers: authHeaders,
      fetch: customFetch
    })

View on GitHub (pinned to 726446b54c)

Solutions

  1. Route jina-rerank NewAPI models through provider.rerankingModel(modelId).
  2. Correct the endpoint_type in the model config so a chat-intended model is not flagged 'jina-rerank'.
  3. Dispatch by resolveEffectiveEndpoint(...).endpointType before choosing the provider method.
  4. Surface a user-facing hint to switch endpoint type or select a chat-capable model.

Example fix

// before
const model = newApiProvider.languageModel(modelId) // throws if endpointType==='jina-rerank'
// after
const ep = resolveEffectiveEndpoint(provider, model).endpointType
const model = ep === 'jina-rerank'
  ? newApiProvider.rerankingModel(modelId)
  : newApiProvider.languageModel(modelId)
Defensive patterns

Strategy: validation

Validate before calling

const ep = resolveEffectiveEndpoint(provider, model).endpointType
if (ep === 'jina-rerank') {
  throw new Error('Use provider.rerankingModel() for jina-rerank models')
}

Type guard

export function isRerankEndpointMisroute(e: unknown): boolean {
  return e instanceof Error && /Use rerankingModel\(\)/.test(e.message)
}

Try / catch

try {
  newApiProvider.languageModel(modelId)
} catch (e) {
  if (isRerankEndpointMisroute(e)) return newApiProvider.rerankingModel(modelId)
  throw e
}

Prevention

When it happens

Trigger: A NewAPI model with endpoint_type 'jina-rerank' is routed through provider()/languageModel()/chatModel() instead of provider.rerankingModel(). Caused by mis-typed endpoint config or generic chat-resolution code.

Common situations: A jina-rerank model flagged as chat-capable in config, or generic dispatcher code that ignores endpoint_type when picking the resolution method.

Related errors


AI-assisted analysis of CherryHQ/cherry-studio@726446b54c (2026-08-12). Data as JSON: /api/errors/d959e7bba9420098. Report an issue: GitHub.