Spaces:
Sleeping
Sleeping
import { ColumnDef } from "@tanstack/react-table"; | |
import { Button, Badge, Icon } from "@tremor/react"; | |
import { Tooltip } from "antd"; | |
import { getProviderLogoAndName } from "../provider_info_helpers"; | |
import { ModelData } from "./types"; | |
import { TrashIcon, PencilIcon, PencilAltIcon } from "@heroicons/react/outline"; | |
import DeleteModelButton from "../delete_model_button"; | |
export const columns = ( | |
userRole: string, | |
userID: string, | |
premiumUser: boolean, | |
setSelectedModelId: (id: string) => void, | |
setSelectedTeamId: (id: string) => void, | |
getDisplayModelName: (model: any) => string, | |
handleEditClick: (model: any) => void, | |
handleRefreshClick: () => void, | |
setEditModel: (edit: boolean) => void, | |
): ColumnDef<ModelData>[] => [ | |
{ | |
header: "Model ID", | |
accessorKey: "model_info.id", | |
cell: ({ row }) => { | |
const model = row.original; | |
return ( | |
<Tooltip title={model.model_info.id}> | |
<div | |
className="font-mono text-blue-500 bg-blue-50 hover:bg-blue-100 text-xs font-normal px-2 py-0.5 text-left w-full truncate whitespace-nowrap cursor-pointer max-w-[15ch]" | |
onClick={() => setSelectedModelId(model.model_info.id)} | |
> | |
{model.model_info.id} | |
</div> | |
</Tooltip> | |
); | |
}, | |
}, | |
{ | |
header: "Public Model Name", | |
accessorKey: "model_name", | |
cell: ({ row }) => { | |
const displayName = getDisplayModelName(row.original) || "-"; | |
return ( | |
<Tooltip title={displayName}> | |
<div className="text-xs truncate whitespace-nowrap"> | |
{displayName} | |
</div> | |
</Tooltip> | |
); | |
}, | |
}, | |
{ | |
header: "Provider", | |
accessorKey: "provider", | |
cell: ({ row }) => { | |
const model = row.original; | |
return ( | |
<div className="flex items-center space-x-2"> | |
{model.provider && ( | |
<img | |
src={getProviderLogoAndName(model.provider).logo} | |
alt={`${model.provider} logo`} | |
className="w-4 h-4" | |
onError={(e) => { | |
const target = e.target as HTMLImageElement; | |
const parent = target.parentElement; | |
if (parent) { | |
const fallbackDiv = document.createElement('div'); | |
fallbackDiv.className = 'w-4 h-4 rounded-full bg-gray-200 flex items-center justify-center text-xs'; | |
fallbackDiv.textContent = model.provider?.charAt(0) || '-'; | |
parent.replaceChild(fallbackDiv, target); | |
} | |
}} | |
/> | |
)} | |
<p className="text-xs">{model.provider || "-"}</p> | |
</div> | |
); | |
}, | |
}, | |
{ | |
header: "LiteLLM Model Name", | |
accessorKey: "litellm_model_name", | |
cell: ({ row }) => { | |
const model = row.original; | |
return ( | |
<Tooltip title={model.litellm_model_name}> | |
<div className="text-xs truncate whitespace-nowrap"> | |
{model.litellm_model_name || "-"} | |
</div> | |
</Tooltip> | |
); | |
}, | |
}, | |
{ | |
header: "Created At", | |
accessorKey: "model_info.created_at", | |
sortingFn: "datetime", | |
cell: ({ row }) => { | |
const model = row.original; | |
return ( | |
<span className="text-xs"> | |
{model.model_info.created_at ? new Date(model.model_info.created_at).toLocaleDateString() : "-"} | |
</span> | |
); | |
}, | |
}, | |
{ | |
header: "Updated At", | |
accessorKey: "model_info.updated_at", | |
sortingFn: "datetime", | |
cell: ({ row }) => { | |
const model = row.original; | |
return ( | |
<span className="text-xs"> | |
{model.model_info.updated_at ? new Date(model.model_info.updated_at).toLocaleDateString() : "-"} | |
</span> | |
); | |
}, | |
}, | |
{ | |
header: "Created By", | |
accessorKey: "model_info.created_by", | |
cell: ({ row }) => { | |
const model = row.original; | |
return ( | |
<span className="text-xs"> | |
{model.model_info.created_by || "-"} | |
</span> | |
); | |
}, | |
}, | |
{ | |
header: () => ( | |
<Tooltip title="Cost per 1M tokens"> | |
<span>Input Cost</span> | |
</Tooltip> | |
), | |
accessorKey: "input_cost", | |
cell: ({ row }) => { | |
const model = row.original; | |
return ( | |
<pre className="text-xs"> | |
{model.input_cost || "-"} | |
</pre> | |
); | |
}, | |
}, | |
{ | |
header: () => ( | |
<Tooltip title="Cost per 1M tokens"> | |
<span>Output Cost</span> | |
</Tooltip> | |
), | |
accessorKey: "output_cost", | |
cell: ({ row }) => { | |
const model = row.original; | |
return ( | |
<pre className="text-xs"> | |
{model.output_cost || "-"} | |
</pre> | |
); | |
}, | |
}, | |
{ | |
header: "Team ID", | |
accessorKey: "model_info.team_id", | |
cell: ({ row }) => { | |
const model = row.original; | |
return model.model_info.team_id ? ( | |
<div className="overflow-hidden"> | |
<Tooltip title={model.model_info.team_id}> | |
<Button | |
size="xs" | |
variant="light" | |
className="font-mono text-blue-500 bg-blue-50 hover:bg-blue-100 text-xs font-normal px-2 py-0.5 text-left overflow-hidden truncate max-w-[200px]" | |
onClick={() => setSelectedTeamId(model.model_info.team_id)} | |
> | |
{model.model_info.team_id.slice(0, 7)}... | |
</Button> | |
</Tooltip> | |
</div> | |
) : ( | |
"-" | |
); | |
}, | |
}, | |
{ | |
header: "Credentials", | |
accessorKey: "litellm_credential_name", | |
cell: ({ row }) => { | |
const model = row.original; | |
return model.litellm_params && model.litellm_params.litellm_credential_name ? ( | |
<div className="overflow-hidden"> | |
<Tooltip title={model.litellm_params.litellm_credential_name}> | |
{model.litellm_params.litellm_credential_name.slice(0, 7)}... | |
</Tooltip> | |
</div> | |
) : ( | |
<span className="text-gray-400">-</span> | |
); | |
}, | |
}, | |
{ | |
header: "Status", | |
accessorKey: "model_info.db_model", | |
cell: ({ row }) => { | |
const model = row.original; | |
return ( | |
<div className={` | |
inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium | |
${model.model_info.db_model | |
? 'bg-blue-50 text-blue-600' | |
: 'bg-gray-100 text-gray-600'} | |
`}> | |
{model.model_info.db_model ? "DB Model" : "Config Model"} | |
</div> | |
); | |
}, | |
}, | |
{ | |
id: "actions", | |
header: "", | |
cell: ({ row }) => { | |
const model = row.original; | |
const canEditModel = userRole === "Admin" || model.model_info?.created_by === userID; | |
return ( | |
<div className="flex items-center justify-end gap-2 pr-4"> | |
<Icon | |
icon={PencilAltIcon} | |
size="sm" | |
onClick={() => { | |
if (canEditModel) { | |
setSelectedModelId(model.model_info.id); | |
setEditModel(true); | |
} | |
}} | |
className={!canEditModel ? "opacity-50 cursor-not-allowed" : "cursor-pointer"} | |
/> | |
<Icon | |
icon={TrashIcon} | |
size="sm" | |
onClick={() => { | |
if (canEditModel) { | |
setSelectedModelId(model.model_info.id); | |
setEditModel(false); | |
} | |
}} | |
className={!canEditModel ? "opacity-50 cursor-not-allowed" : "cursor-pointer"} | |
/> | |
</div> | |
); | |
}, | |
}, | |
]; |