File size: 1,170 Bytes
15a5288
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import { BaseProviderFetcher } from "./base";
import { ProviderEntry, FeatherlessModel } from "./types";

export class FeatherlessFetcher extends BaseProviderFetcher {
  name = "featherless";

  constructor(apiKey?: string) {
    super("https://api.featherless.ai", apiKey, {
      requestsPerMinute: 60, // Conservative default
    });
  }

  async fetchModels(): Promise<ProviderEntry[]> {
    try {
      const response = await this.fetchWithRetry<{ data: FeatherlessModel[] }>(
        `${this.baseUrl}/v1/models`
      );

      return response.data.map((model) => this.mapModelToProviderEntry(model));
    } catch (error) {
      console.error(`Failed to fetch Featherless models: ${error}`);
      return [];
    }
  }

  private mapModelToProviderEntry(model: FeatherlessModel): ProviderEntry {
    const entry: ProviderEntry = {
      provider: this.name,
      context_length: model.context_length,
      max_completion_tokens: model.max_completion_tokens,
      status: model.available_on_current_plan ? "live" : "offline",
      owned_by: model.owned_by,
      model_class: model.model_class,
      is_gated: model.is_gated,
    };


    return entry;
  }
}