File size: 3,287 Bytes
eda28cd a6d1411 eda28cd a6d1411 eda28cd a6d1411 eda28cd a6d1411 eda28cd a6d1411 eda28cd a6d1411 eda28cd |
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
import { ProviderInfo, ModelData } from "../types/heatmap";
export async function fetchOrganizationData(authors: string[]) {
const primaryAuthor = authors[0];
try {
// Try organizations API first
const orgResponse = await fetch(`https://huggingface.co/api/organizations/${primaryAuthor}/overview`);
if (orgResponse.ok) {
const data = await orgResponse.json();
return {
fullName: data.fullname || primaryAuthor,
avatarUrl: data.avatarUrl || null,
isVerified: data.isVerified || false,
isEnterprise: data.isEnterprise || false,
numModels: data.numModels || 0,
numSpaces: data.numSpaces || 0,
numDatasets: data.numDatasets || 0,
numFollowers: data.numFollowers || 0,
numUsers: data.numUsers || 0,
};
}
// Fallback to users API if organization doesn't exist
const userResponse = await fetch(`https://huggingface.co/api/users/${primaryAuthor}/overview`);
if (userResponse.ok) {
const data = await userResponse.json();
return {
fullName: data.fullname || primaryAuthor,
avatarUrl: data.avatarUrl || null,
isVerified: false,
isEnterprise: false,
numModels: data.numModels || 0,
numSpaces: data.numSpaces || 0,
numDatasets: data.numDatasets || 0,
numFollowers: data.numFollowers || 0,
numUsers: 0,
};
}
throw new Error('Neither organization nor user API returned valid data');
} catch (error) {
console.error(`Error fetching organization data for ${primaryAuthor}:`, error);
return {
fullName: primaryAuthor,
avatarUrl: null,
isVerified: false,
isEnterprise: false,
numModels: 0,
numSpaces: 0,
numDatasets: 0,
numFollowers: 0,
numUsers: 0,
};
}
}
export async function fetchAllProvidersData(providers: ProviderInfo[]): Promise<ProviderInfo[]> {
return Promise.all(providers.map(async (providerInfo) => {
const orgData = await fetchOrganizationData(providerInfo.authors);
return {
...providerInfo,
...orgData
};
}));
}
export async function fetchAuthorData(author: string): Promise<ModelData[]> {
const entityTypes = ["models", "datasets", "spaces"] as const;
try {
const allData = await Promise.all(
entityTypes.map(async (type) => {
const response = await fetch(
`https://huggingface.co/api/${type}?author=${author}&sort=createdAt&direction=-1`
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data.map((item: any): ModelData => ({
createdAt: item.createdAt,
id: item.id,
}));
})
);
return allData.flat();
} catch (error) {
console.error(`Error fetching data for author ${author}:`, error);
return [];
}
}
export async function fetchAllAuthorsData(authors: string[]): Promise<ModelData[]> {
try {
const allData = await Promise.all(
authors.map(async (author) => await fetchAuthorData(author))
);
return allData.flat();
} catch (error) {
console.error("Error fetching data for all authors:", error);
return [];
}
} |