openai-compatible.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { ProviderID, type ModelID } from "../schema"
  2. import * as OpenAICompatibleChat from "../protocols/openai-compatible-chat"
  3. import type { RouteDefaultsInput } from "../route/client"
  4. import { AuthOptions, type ProviderAuthOption } from "../route/auth-options"
  5. import { profiles, type OpenAICompatibleProfile } from "./openai-compatible-profile"
  6. export const id = ProviderID.make("openai-compatible")
  7. type GenericModelOptions = RouteDefaultsInput &
  8. ProviderAuthOption<"optional"> & {
  9. readonly provider?: string
  10. readonly baseURL: string
  11. }
  12. export type FamilyModelOptions = RouteDefaultsInput &
  13. ProviderAuthOption<"optional"> & {
  14. readonly baseURL?: string
  15. }
  16. export const routes = [OpenAICompatibleChat.route]
  17. export const configure = (input: GenericModelOptions) => {
  18. const provider = input.provider ?? "openai-compatible"
  19. const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input
  20. const route = OpenAICompatibleChat.route.with({
  21. ...rest,
  22. provider,
  23. endpoint: { baseURL },
  24. auth: AuthOptions.bearer(input, []),
  25. })
  26. return {
  27. id: ProviderID.make(provider),
  28. model: (modelID: string | ModelID) => route.model({ id: modelID, provider: ProviderID.make(provider) }),
  29. configure,
  30. }
  31. }
  32. const define = (profile: OpenAICompatibleProfile) => {
  33. const configureProfile = (input: FamilyModelOptions = {}) => {
  34. const facade = configure({
  35. ...input,
  36. baseURL: input.baseURL ?? profile.baseURL,
  37. provider: profile.provider,
  38. })
  39. return {
  40. id: ProviderID.make(profile.provider),
  41. model: facade.model,
  42. configure: configureProfile,
  43. }
  44. }
  45. return configureProfile()
  46. }
  47. export const provider = {
  48. id,
  49. configure,
  50. }
  51. export const baseten = define(profiles.baseten)
  52. export const cerebras = define(profiles.cerebras)
  53. export const deepinfra = define(profiles.deepinfra)
  54. export const deepseek = define(profiles.deepseek)
  55. export const fireworks = define(profiles.fireworks)
  56. export const groq = define(profiles.groq)
  57. export const togetherai = define(profiles.togetherai)