{"record":{"id":"fe0f741154d4dd4e","repo":"janhq/jan","slug":"this-provider-cannot-read-model-context-limits-update-its","errorCode":null,"errorMessage":"This provider cannot read model context limits. Update its extension or check provider settings.","messagePattern":"This provider cannot read model context limits\\. Update its extension or check provider settings\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"web-app/src/services/models/default.ts","lineNumber":52,"sourceCode":"\n// TODO: Replace this with the actual provider later\nconst defaultProvider = 'llamacpp'\n\nexport class DefaultModelsService implements ModelsService {\n  private getEngine(provider: string = defaultProvider) {\n    return EngineManager.instance().get(provider) as AIEngine | undefined\n  }\n\n  async getModel(modelId: string): Promise<modelInfo | undefined> {\n    return this.getEngine()?.get(modelId)\n  }\n\n  async getModelContextLimit(modelId: string, provider: string): Promise<number | undefined> {\n    const engine = this.getEngine(provider) as (AIEngine & {\n      getModelContextLimit?: (id: string) => Promise<number | undefined>\n    }) | undefined\n    if (!engine?.getModelContextLimit)\n      throw new Error('This provider cannot read model context limits. Update its extension or check provider settings.')\n    return engine.getModelContextLimit(modelId)\n  }\n\n  async fetchModels(): Promise<modelInfo[]> {\n    return this.getEngine()?.list() ?? []\n  }\n\n  async fetchModelCatalog(): Promise<ModelCatalog> {\n    try {\n      const response = await fetch(MODEL_CATALOG_URL)\n\n      if (!response.ok) {\n        throw new Error(\n          `Failed to fetch model catalog: ${response.status} ${response.statusText}`\n        )\n      }\n\n      const catalog: ModelCatalog = await response.json()","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/janhq/jan/blob/7205d770c1e097c3daf35a911176410e93bc5564/web-app/src/services/models/default.ts#L34-L70","documentation":"getModelContextLimit delegates to the provider's AI engine, but only if the engine implements the optional getModelContextLimit method; otherwise it throws. It tells the caller the provider/extension version cannot report context limits.","triggerScenarios":"getModelContextLimit(modelId, provider) called for a provider whose engine lacks getModelContextLimit (older extension or engine that never implemented it).","commonSituations":"Using an outdated provider extension, a custom/community provider without context-limit support, or mistyping the provider name so the wrong engine resolves.","solutions":["Update the provider extension to a version implementing getModelContextLimit","Check provider name spelling so the correct engine resolves","Catch the error and fall back to a default context length","Check provider settings for manual context size configuration"],"exampleFix":"// before\nconst limit = await getModelContextLimit(modelId, provider)\n// after\nlet limit: number | undefined\ntry { limit = await getModelContextLimit(modelId, provider) }\ncatch { limit = 4096 // fallback default }","handlingStrategy":"fallback","validationCode":"const engine = serviceHub.models().getEngine?.(provider)\nconst supported = typeof engine?.getModelContextLimit === 'function'","typeGuard":"function supportsContextLimit(e: unknown): e is { getModelContextLimit: (id: string) => Promise<number|undefined> } { return typeof (e as any)?.getModelContextLimit === 'function' }","tryCatchPattern":"try { limit = await getModelContextLimit(id, provider) } catch { limit = DEFAULT_CONTEXT_LENGTH }","preventionTips":["Keep provider extensions updated","Feature-check optional engine methods before calling","Document per-provider capability matrix"],"tags":["model","provider","compatibility"],"backgroundTag":"method-not-implemented","analyzedSha":"7205d770c1e097c3daf35a911176410e93bc5564","analyzedAt":"2026-09-17T14:27:30.100Z","contentChangedAt":"2026-09-17T14:27:30.100Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}