|
|
@@ -1,17 +1,17 @@
|
|
|
import { createMemo, createSignal } from "solid-js"
|
|
|
import { useLocal } from "../context/local"
|
|
|
-import { map, pipe, filter, sortBy, take } from "remeda"
|
|
|
+import { map, pipe, flatMap, entries, filter, sortBy, take } from "remeda"
|
|
|
import { DialogSelect } from "../ui/dialog-select"
|
|
|
import { useDialog } from "../ui/dialog"
|
|
|
import { createDialogProviderOptions, DialogProvider } from "./dialog-provider"
|
|
|
import { DialogVariant } from "./dialog-variant"
|
|
|
import * as fuzzysort from "fuzzysort"
|
|
|
import { useConnected } from "./use-connected"
|
|
|
-import { useData } from "../context/data"
|
|
|
+import { useSync } from "../context/sync"
|
|
|
|
|
|
export function DialogModel(props: { providerID?: string }) {
|
|
|
const local = useLocal()
|
|
|
- const data = useData()
|
|
|
+ const sync = useSync()
|
|
|
const dialog = useDialog()
|
|
|
const [query, setQuery] = createSignal("")
|
|
|
|
|
|
@@ -29,21 +29,19 @@ export function DialogModel(props: { providerID?: string }) {
|
|
|
function toOptions(items: typeof favorites, category: string) {
|
|
|
if (!showSections) return []
|
|
|
return items.flatMap((item) => {
|
|
|
- const provider = data.location.provider.list()?.find((provider) => provider.id === item.providerID)
|
|
|
+ const provider = sync.data.provider.find((provider) => provider.id === item.providerID)
|
|
|
if (!provider) return []
|
|
|
- const model = data.location.model
|
|
|
- .list()
|
|
|
- ?.find((model) => model.providerID === item.providerID && model.id === item.modelID)
|
|
|
+ const model = provider.models[item.modelID]
|
|
|
if (!model) return []
|
|
|
return [
|
|
|
{
|
|
|
key: item,
|
|
|
value: { providerID: provider.id, modelID: model.id },
|
|
|
- title: model.name,
|
|
|
+ title: model.name ?? item.modelID,
|
|
|
description: provider.name,
|
|
|
category,
|
|
|
disabled: provider.id === "opencode" && model.id.includes("-nano"),
|
|
|
- footer: model.cost[0]?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
|
|
|
+ footer: model.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
|
|
|
onSelect: () => {
|
|
|
onSelect(provider.id, model.id)
|
|
|
},
|
|
|
@@ -61,43 +59,50 @@ export function DialogModel(props: { providerID?: string }) {
|
|
|
)
|
|
|
|
|
|
const providerOptions = pipe(
|
|
|
- data.location.model.list() ?? [],
|
|
|
- filter((model) => model.status !== "deprecated"),
|
|
|
- filter((model) => (props.providerID ? model.providerID === props.providerID : true)),
|
|
|
+ sync.data.provider,
|
|
|
sortBy(
|
|
|
- (model) => model.providerID !== "opencode",
|
|
|
- (model) => data.location.provider.list()?.find((provider) => provider.id === model.providerID)?.name ?? "",
|
|
|
- [(model) => model.time.released, "desc"],
|
|
|
+ (provider) => provider.id !== "opencode",
|
|
|
+ (provider) => provider.name,
|
|
|
+ ),
|
|
|
+ flatMap((provider) =>
|
|
|
+ pipe(
|
|
|
+ provider.models,
|
|
|
+ entries(),
|
|
|
+ filter(([_, info]) => info.status !== "deprecated"),
|
|
|
+ filter(([_, info]) => (props.providerID ? info.providerID === props.providerID : true)),
|
|
|
+ map(([model, info]) => ({
|
|
|
+ value: { providerID: provider.id, modelID: model },
|
|
|
+ title: info.name ?? model,
|
|
|
+ releaseDate: info.release_date,
|
|
|
+ description: favorites.some((item) => item.providerID === provider.id && item.modelID === model)
|
|
|
+ ? "(Favorite)"
|
|
|
+ : undefined,
|
|
|
+ category: connected() ? provider.name : undefined,
|
|
|
+ disabled: provider.id === "opencode" && model.includes("-nano"),
|
|
|
+ footer: info.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
|
|
|
+ onSelect() {
|
|
|
+ onSelect(provider.id, model)
|
|
|
+ },
|
|
|
+ })),
|
|
|
+ filter((option) => {
|
|
|
+ if (!showSections) return true
|
|
|
+ if (
|
|
|
+ favorites.some(
|
|
|
+ (item) => item.providerID === option.value.providerID && item.modelID === option.value.modelID,
|
|
|
+ )
|
|
|
+ )
|
|
|
+ return false
|
|
|
+ if (
|
|
|
+ recents.some(
|
|
|
+ (item) => item.providerID === option.value.providerID && item.modelID === option.value.modelID,
|
|
|
+ )
|
|
|
+ )
|
|
|
+ return false
|
|
|
+ return true
|
|
|
+ }),
|
|
|
+ (options) => sortModelOptions(options, props.providerID !== undefined),
|
|
|
+ ),
|
|
|
),
|
|
|
- map((model) => ({
|
|
|
- value: { providerID: model.providerID, modelID: model.id },
|
|
|
- title: model.name,
|
|
|
- releaseDate: model.time.released,
|
|
|
- description: favorites.some((item) => item.providerID === model.providerID && item.modelID === model.id)
|
|
|
- ? "(Favorite)"
|
|
|
- : undefined,
|
|
|
- category: connected()
|
|
|
- ? data.location.provider.list()?.find((provider) => provider.id === model.providerID)?.name
|
|
|
- : undefined,
|
|
|
- disabled: !model.enabled || (model.providerID === "opencode" && model.id.includes("-nano")),
|
|
|
- footer: model.cost[0]?.input === 0 && model.providerID === "opencode" ? "Free" : undefined,
|
|
|
- onSelect() {
|
|
|
- onSelect(model.providerID, model.id)
|
|
|
- },
|
|
|
- })),
|
|
|
- filter((option) => {
|
|
|
- if (!showSections) return true
|
|
|
- if (
|
|
|
- favorites.some((item) => item.providerID === option.value.providerID && item.modelID === option.value.modelID)
|
|
|
- )
|
|
|
- return false
|
|
|
- if (
|
|
|
- recents.some((item) => item.providerID === option.value.providerID && item.modelID === option.value.modelID)
|
|
|
- )
|
|
|
- return false
|
|
|
- return true
|
|
|
- }),
|
|
|
- (options) => sortModelOptions(options, props.providerID !== undefined),
|
|
|
)
|
|
|
|
|
|
const popularProviders = !connected()
|
|
|
@@ -122,7 +127,7 @@ export function DialogModel(props: { providerID?: string }) {
|
|
|
})
|
|
|
|
|
|
const provider = createMemo(() =>
|
|
|
- props.providerID ? data.location.provider.list()?.find((item) => item.id === props.providerID) : null,
|
|
|
+ props.providerID ? sync.data.provider.find((item) => item.id === props.providerID) : null,
|
|
|
)
|
|
|
|
|
|
const title = createMemo(() => {
|