chore(vendor): import pi 1.3.0

Imported as a linear vendor commit so forge rebases do not replay the upstream root tree.

git-subtree-dir: third_party/pi

git-subtree-split: 71023aec1546d6d677a65669c5665c0927ce0dd0
This commit is contained in:
2026-10-15 17:58:48 -04:00
parent 719370c8f7
commit 6081e3e325
1743 changed files with 205460 additions and 131705 deletions

View File

@@ -1,27 +1,81 @@
import type { Api, Model, ProviderId } from "./types.ts";
import type {
Api,
ClassifierApi,
ClassifierModel,
ImageApi,
ImageModel,
Model,
ModelType,
ProviderId,
} from "./types.ts";
export type ModelGroups = Record<string, Record<string, object>>;
type ModelId<TGroups extends ModelGroups> = {
type ModelKey<TGroups extends ModelGroups> = {
[TApi in keyof TGroups]: keyof TGroups[TApi];
}[keyof TGroups] &
string;
type ModelApi<TGroups extends ModelGroups, TModelId extends ModelId<TGroups>> = {
[TApi in keyof TGroups]: TModelId extends keyof TGroups[TApi] ? TApi : never;
}[keyof TGroups] &
Api;
type KeyForType<TGroups extends ModelGroups, TType extends ModelType> = Extract<
ModelKey<TGroups>,
`${TType}:${string}`
>;
export type ModelCatalog<TGroups extends ModelGroups, TProvider extends ProviderId> = {
[TModelId in ModelId<TGroups>]: Model<ModelApi<TGroups, TModelId>> & {
id: TModelId;
type ModelId<TKey extends string> = TKey extends `${ModelType}:${infer TModelId}` ? TModelId : never;
type ApiForKey<TGroups extends ModelGroups, TKey extends ModelKey<TGroups>> = {
[TApi in keyof TGroups]: TKey extends keyof TGroups[TApi] ? TApi : never;
}[keyof TGroups];
export type ChatModelCatalog<TGroups extends ModelGroups, TProvider extends ProviderId> = {
[TKey in KeyForType<TGroups, "chat"> as ModelId<TKey>]: Model<ApiForKey<TGroups, TKey> & Api> & {
id: ModelId<TKey>;
provider: TProvider;
};
};
export function flattenModelCatalog<const TProvider extends ProviderId, const TGroups extends ModelGroups>(
export type ImageModelCatalog<TGroups extends ModelGroups, TProvider extends ProviderId> = {
[TKey in KeyForType<TGroups, "image"> as ModelId<TKey>]: ImageModel<ApiForKey<TGroups, TKey> & ImageApi> & {
id: ModelId<TKey>;
provider: TProvider;
};
};
export type ClassifierModelCatalog<TGroups extends ModelGroups, TProvider extends ProviderId> = {
[TKey in KeyForType<TGroups, "classifier"> as ModelId<TKey>]: ClassifierModel<
ApiForKey<TGroups, TKey> & ClassifierApi
> & {
id: ModelId<TKey>;
provider: TProvider;
};
};
function flattenModelCatalog(groups: ModelGroups, type: ModelType): Record<string, object> {
return Object.fromEntries(
Object.values(groups)
.flatMap((models) => Object.values(models))
.filter((model) => (model as { type?: unknown }).type === type)
.map((model) => [(model as { id: string }).id, model]),
);
}
export function flattenChatModelCatalog<const TProvider extends ProviderId, const TGroups extends ModelGroups>(
_provider: TProvider,
groups: TGroups,
): ModelCatalog<TGroups, TProvider> {
return Object.assign({}, ...Object.values(groups)) as ModelCatalog<TGroups, TProvider>;
): ChatModelCatalog<TGroups, TProvider> {
return flattenModelCatalog(groups, "chat") as ChatModelCatalog<TGroups, TProvider>;
}
export function flattenImageModelCatalog<const TProvider extends ProviderId, const TGroups extends ModelGroups>(
_provider: TProvider,
groups: TGroups,
): ImageModelCatalog<TGroups, TProvider> {
return flattenModelCatalog(groups, "image") as ImageModelCatalog<TGroups, TProvider>;
}
export function flattenClassifierModelCatalog<const TProvider extends ProviderId, const TGroups extends ModelGroups>(
_provider: TProvider,
groups: TGroups,
): ClassifierModelCatalog<TGroups, TProvider> {
return flattenModelCatalog(groups, "classifier") as ClassifierModelCatalog<TGroups, TProvider>;
}