Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
174 commits
Select commit Hold shift + click to select a range
726814b
feat(aliases): add model_aliases table, types, and repo
Menci Jun 25, 2026
a4ac67e
feat(protocols): add Floway extension fields and per-upstream sanitizers
Menci Jun 25, 2026
e1891e1
feat(translate): emit Floway extension fields to upstream slots
Menci Jun 25, 2026
6ea9404
test(translate): cover Floway extension emission across all nine pairs
Menci Jun 25, 2026
d7e9fe0
feat(gateway): weave alias matching into model resolution fan-out
Menci Jun 25, 2026
8305153
feat(gateway): apply alias rules, synthesize /v1/models entries, set …
Menci Jun 25, 2026
8f2ce38
fix(aliases): address final review (header on passthrough, streaming-…
Menci Jun 25, 2026
17a7877
revert(translate): restore pre-extension native field translation on …
Menci Jun 25, 2026
6d13258
feat(aliases): drop responses entry shim; enumerate aliases per upstr…
Menci Jun 25, 2026
fcb360a
revert(translate): restore pre-extension native field translation on …
Menci Jun 25, 2026
96afa83
refactor(aliases): split upstream-label prefix from composeAliasDispl…
Menci Jun 25, 2026
6e3a6d7
refactor(aliases): synthesize alias listing entries inside getModelsF…
Menci Jun 25, 2026
06c789b
fix(aliases): dedupe alias listing emissions whose public id collides
Menci Jun 25, 2026
e118cd1
feat(web): render alias rule badges on dashboard model rows
Menci Jun 25, 2026
f98aa6c
feat(web): alias badges read as key: value with outline style
Menci Jun 25, 2026
ca6fac5
chore(aliases): strip uncommitted-spec references from comments
Menci Jun 25, 2026
322e5ab
fix(translate): propagate native service_tier on responses-via-messages
Menci Jun 25, 2026
6c6425f
Merge remote-tracking branch 'origin/main' into floway/model-aliases
Menci Jun 25, 2026
9f38cef
refactor(aliases): inline AliasMatchResult single-field wrapper
Menci Jun 25, 2026
1fd7bba
refactor(aliases): inline single-use display/listing helpers
Menci Jun 25, 2026
7d4a3e3
refactor(aliases): collapse passthrough drop-trace into the shared sa…
Menci Jun 25, 2026
e79d27b
docs(aliases): note summary='auto' is an explicit no-op on Messages t…
Menci Jun 25, 2026
7122dc7
feat(aliases): drop redundant anthropicSpeed alias knob
Menci Jun 25, 2026
34bbfa5
Merge remote-tracking branch 'origin/main' into floway/model-aliases
Menci Jun 25, 2026
8824e82
feat(aliases): extend ModelAliasesRepo with save/create/delete
Menci Jun 25, 2026
9abf5c2
feat(aliases): add REST CRUD endpoints under /api/aliases
Menci Jun 25, 2026
26d3dd9
feat(web): alias-list settings card + edit dialog
Menci Jun 25, 2026
c435534
chore(aliases): drop dead helpers and stale comments in control plane
Menci Jun 25, 2026
26f08e1
fix(aliases): make 0047 display_name seed idempotent
Menci Jun 25, 2026
e6a6862
fix(aliases): drop dead anthropicBeta body write on Gemini apply path
Menci Jun 25, 2026
784e19e
perf(web): drop duplicate /api/models reload on alias save
Menci Jun 25, 2026
1a54f39
feat(aliases): allow PATCH to rename alias by changing the PK
Menci Jun 26, 2026
7763ad9
fix(ui): dark theme combobox component with creatable values
Menci Jun 26, 2026
a5e729a
refactor(web): flatten alias edit dialog and trim AliasRow
Menci Jun 26, 2026
ff479e4
feat(ui): combobox auto-opens on input focus
Menci Jun 26, 2026
5a25752
feat(protocols): move composeAliasDisplayName to protocols/common
Menci Jun 26, 2026
39ba187
refactor(web): alias edit dialog second-round polish
Menci Jun 26, 2026
1aa0a55
feat(web): add 'fast' to Service tier combobox suggestions
Menci Jun 26, 2026
db15d10
refactor(web): Adaptive reasoning gets a section label; switch reads …
Menci Jun 26, 2026
66360bf
refactor(web): always-show combobox + drop effort hint + footer warni…
Menci Jun 26, 2026
00aa242
feat(web): expand alias warnings (effort/budget mismatch) + bold fiel…
Menci Jun 26, 2026
d8e2b9a
refactor(web): collapse alias warning cards into one amber card with …
Menci Jun 26, 2026
e3ecae9
feat(protocols): expose aliasedFrom.displayName + formatAliasRulesInl…
Menci Jun 26, 2026
6045ab8
refactor(web): alias model rows render as 3-line text block in /dashb…
Menci Jun 26, 2026
1989a38
refactor(web): AliasRow renders as 3-line text block, matching the /m…
Menci Jun 26, 2026
6f61605
style(web): match alias rules-summary font size to the id-mapping lin…
Menci Jun 26, 2026
d43f6d8
Revert "refactor(web): alias model rows render as 3-line text block i…
Menci Jun 26, 2026
33373d2
style(web): shrink alias id-mapping and rules-summary to text-xs
Menci Jun 26, 2026
d7433ef
chore(aliases): scrap v1 implementation
Menci Jun 26, 2026
c2fee82
feat(aliases): v2 migration + seed
Menci Jun 26, 2026
7c8034b
feat(aliases): backend types + repo + routes
Menci Jun 26, 2026
e6c5e0c
feat(aliases): data-plane resolver + per-protocol rule overlay
Menci Jun 26, 2026
67ec5a2
feat(aliases): /v1/models listing + protocol shape
Menci Jun 26, 2026
6866286
feat(aliases): dashboard UI
Menci Jun 26, 2026
5ab0190
perf(aliases): hoist registry calls out of per-target availability loop
Menci Jun 26, 2026
2b4374e
fix(aliases/web): exclude alias entries from the rule-warning catalog…
Menci Jun 26, 2026
191ac32
test(aliases): pin Messages-overlay silent drop for reasoning.summary
Menci Jun 26, 2026
8918773
docs(aliases): note that intersectArrays preserves head-order
Menci Jun 26, 2026
2774bc2
cleanup(aliases): drop unused interpretation field and unionEndpoints…
Menci Jun 26, 2026
fa6c8e6
cleanup(aliases): trim verbose comments in gateway alias surface
Menci Jun 26, 2026
1f116ad
cleanup(aliases): drop unused GatewayCtx.c field and stubAuthedContext
Menci Jun 26, 2026
0e90243
cleanup(aliases): hoist alias-no-target message into shared helper
Menci Jun 26, 2026
adaefc2
cleanup(aliases): strip in-branch-history and spec references from tr…
Menci Jun 26, 2026
6ac44b2
cleanup(aliases): tighten Combobox normalized-item type
Menci Jun 26, 2026
8952cb3
cleanup(aliases/web): inline aliasHasShadowWarning at its single call…
Menci Jun 26, 2026
3d3d08d
cleanup(aliases): strip spec references and verbose comments
Menci Jun 26, 2026
6c85138
cleanup(aliases): fix-up typecheck post-cleanup
Menci Jun 26, 2026
0bf6498
cleanup(aliases): single-source the alias-no-target message string
Menci Jun 26, 2026
ffb3374
test(aliases/web): pin findCatalogModel against alias-row shadowing a…
Menci Jun 26, 2026
f065e2d
cleanup(aliases): move aliasFailureFromError to chat/shared/errors.ts
Menci Jun 26, 2026
a12986d
refactor(aliases): unify alias resolution across every data-plane end…
Menci Jun 26, 2026
5dd407a
refactor(aliases): make ReasoningEffort/Summary/Verbosity/ServiceTier…
Menci Jun 26, 2026
012442b
cleanup(aliases): drop the unused ChatAliasRules.reasoning.mandatory …
Menci Jun 26, 2026
b7bd361
cleanup(aliases): drop the unused anthropic_beta IR extension and Gem…
Menci Jun 26, 2026
9e54f70
cleanup(aliases): extract mergeAliasesIntoModels and inline deriveDis…
Menci Jun 26, 2026
f5d827c
cleanup(aliases): badge field key, drop targetCount, collapse model-w…
Menci Jun 26, 2026
7c1c85b
cleanup(aliases): make Combobox live-watch the sole writer and reconc…
Menci Jun 26, 2026
84809a2
feat(aliases/web): two-column rule grid in the expanded target row
Menci Jun 26, 2026
77407f4
feat(aliases/web): kind-aware target combobox, mismatch warning, disa…
Menci Jun 26, 2026
423116e
refactor(aliases/web): AliasRow caption — mono-id, kind, target count…
Menci Jun 26, 2026
8487e4c
refactor(aliases/web): AliasRow title stamps the alias id next to the…
Menci Jun 26, 2026
4d34d7f
fix(aliases): settings reads the raw catalog so shadow + kind warning…
Menci Jun 26, 2026
59b0b8b
style(aliases/web): drop bg + rounded from dialog footer's /v1/models…
Menci Jun 26, 2026
6a5fbae
style(aliases/web): Models heading reads sentence case + hint copy
Menci Jun 26, 2026
4dee8a0
feat(aliases): add announced_metadata_json column to model_aliases
Menci Jun 26, 2026
2dbc990
feat(aliases): wire announced_metadata through repo + zod + DTOs
Menci Jun 26, 2026
7cd1fe5
feat(aliases): announced metadata = override + rule-aware intersection
Menci Jun 26, 2026
07a8081
feat(aliases/web): AnnouncedMetadataEditor component
Menci Jun 26, 2026
27ed319
feat(aliases/web): announced-metadata section on the edit dialog
Menci Jun 26, 2026
079c3de
feat(aliases): alias entry advertises intersected endpoints in /v1/mo…
Menci Jun 26, 2026
3ac4f53
Revert "feat(aliases): alias entry advertises intersected endpoints i…
Menci Jun 26, 2026
d0ccf97
refactor(aliases/web): extract ChatMetadataEditor shared by alias dia…
Menci Jun 26, 2026
c9b69bc
feat(aliases): alias entry advertises the union of target endpoints i…
Menci Jun 26, 2026
ddb405b
fix(aliases): resolver pool narrows to targets that serve the inbound…
Menci Jun 26, 2026
56a1b63
Merge remote-tracking branch 'origin/main' into floway/model-aliases
Menci Jun 26, 2026
8de3eea
docs(aliases): clarify AnnouncedMetadata override granularity
Menci Jun 26, 2026
2860aee
cleanup(aliases): import ChatModelInfo from api/types instead of rede…
Menci Jun 26, 2026
c0e5c05
docs(aliases): align the five mirror docstrings to the corrected over…
Menci Jun 26, 2026
9d7bc3e
refactor(aliases): extract shared unionEndpoints helper
Menci Jun 26, 2026
731414d
refactor(aliases): tighten ModelResolution.aliasResolution to nullable
Menci Jun 26, 2026
56eba8b
cleanup(responses): drop redundant runtime guards in responsesAttempt…
Menci Jun 26, 2026
ddddd94
cleanup(aliases): collapse repeated alias-pipeline narrative to one c…
Menci Jun 26, 2026
1982e1f
refactor(aliases/web): collapse useModels factories sharing one core
Menci Jun 26, 2026
f3baa59
refactor(aliases): make PublicModel.endpoints required
Menci Jun 26, 2026
8df50e1
refactor(codex): remove hardcoded codex-auto-review alias; let the al…
Menci Jun 26, 2026
ce74a37
cleanup(codex): drop dead slugInternalModel allocation in computeCatalog
Menci Jun 26, 2026
6a88cc0
docs(aliases/tests): correct the alias-resolver mock docstrings
Menci Jun 26, 2026
6354266
cleanup(aliases/tests): drop the broken inline comment in the candida…
Menci Jun 26, 2026
275e9a8
style(aliases/web): hint copy stays put + Switch label says Manual
Menci Jun 27, 2026
197977a
style(aliases/web): drop the imprecise "leave blank to inherit" hint
Menci Jun 27, 2026
ea2ea1d
style(aliases/web): announced-metadata hint explains why rule-pinned …
Menci Jun 27, 2026
e298485
style(aliases/web): trim announced-metadata hint to just the default-…
Menci Jun 27, 2026
e1021c9
refactor(aliases): Gemini catalog reuses mergeAliasesIntoModels
Menci Jun 27, 2026
062d2ef
refactor(aliases): codex 1p catalog rides synthesizeListedAliases for…
Menci Jun 27, 2026
a49d0a9
refactor(aliases): unify chat + passthrough model-resolve wrappers
Menci Jun 27, 2026
0058715
fix(aliases/codex): codex catalog honors the operator-set context_win…
Menci Jun 27, 2026
836a20d
Merge remote-tracking branch 'origin/main' into floway/model-aliases
Menci Jun 27, 2026
aeb007c
chore(aliases): merge migrations 0046 + 0047 into a single 0046
Menci Jun 27, 2026
e48ea8a
feat(provider): add enumerateAddressableRedirects hook + per-impl wiring
Menci Jun 27, 2026
17a73b5
feat(gateway): introduce enumerateAddressableModelIds engine
Menci Jun 27, 2026
acd852d
refactor(gateway): rewire alias listing + codex catalog through the a…
Menci Jun 27, 2026
9e969eb
feat(gateway): hide alias entries whose targets are all unreachable
Menci Jun 27, 2026
2cca6ff
feat(control-plane): /api/models?include_unlisted=true exposes addres…
Menci Jun 27, 2026
a3fbe24
feat(web): alias surfaces read the addressable catalog and warn on no…
Menci Jun 27, 2026
f1f4a4a
docs(provider-copilot): align enumerateAddressableRedirects comment w…
Menci Jun 27, 2026
8f32295
fix(gateway): per-upstream catalog miss in enumerateAddressableModelI…
Menci Jun 27, 2026
57279e9
refactor(web): collapse alias-warning template to a single unconditio…
Menci Jun 27, 2026
e465ed4
refactor(addressable): extract listedRealModels helper
Menci Jun 27, 2026
30f57de
refactor(addressable): drop AddressableSurface wrapper
Menci Jun 27, 2026
b1597a3
refactor(registry): drop test-only getInternalModels from production
Menci Jun 27, 2026
1fc3c71
fix(aliases/codex): slugContextWindow keys on the full addressable su…
Menci Jun 27, 2026
358122f
docs(aliases): drop stale/restating comments across alias surfaces
Menci Jun 27, 2026
7f2bc34
docs(aliases): trim restating / patching-trace comments
Menci Jun 27, 2026
6ac13ac
cleanup(aliases/web): drop unused realModelIds helper + its test
Menci Jun 27, 2026
15fcc15
fix(aliases): alias chat.modalities omits the block when either half …
Menci Jun 27, 2026
8b6295c
cleanup: drop stale/restating comments and the unused stripKeys field…
Menci Jun 27, 2026
6bf1837
fix(aliases/web): frontend modalities mirror omits the block on empty…
Menci Jun 27, 2026
e584f54
docs(aliases/web): drop stale data-field reference on AliasRuleWarning
Menci Jun 27, 2026
bfc5f47
fix(addressable): rethrow AbortError from per-upstream Promise.allSet…
Menci Jun 27, 2026
a06d7e3
refactor(sanitize): require SanitizeTraceCtx — drop the optional fall…
Menci Jun 27, 2026
b36f962
fix(codex): alias catalog window = min over routable targets, not fir…
Menci Jun 27, 2026
8f38b4f
fix(aliases): intersectChat requires both budget.min and budget.max a…
Menci Jun 27, 2026
d1c9d45
fix(control-plane/models): dedupe unlistedRows against listedRows on id
Menci Jun 27, 2026
fd41a3f
refactor(protocols): tighten ReasoningEffort/Summary/Verbosity/Servic…
Menci Jun 27, 2026
29155d4
refactor(chat): drop ChatCandidate alias, use ProviderCandidate directly
Menci Jun 27, 2026
3dab730
refactor(web): extract parseOptionalNumber to a shared util
Menci Jun 27, 2026
2851799
refactor(registry): split getModels — let enumerateAddressableModelId…
Menci Jun 27, 2026
6bc6432
refactor(chat): extract resolveCandidatesAndApplyAlias prelude helper
Menci Jun 27, 2026
5d7e8e9
refactor(web): dedupe PublicModel/ChatModelInfo from @floway-dev/prot…
Menci Jun 27, 2026
28da1a2
refactor(aliases): ModelAliasWireInput = Omit<ModelAlias, server-mana…
Menci Jun 27, 2026
c03079a
refactor(aliases): collapse AliasRules to ChatAliasRules, drop the casts
Menci Jun 27, 2026
056d6eb
refactor(aliases): move ALIAS_RESPONSE_HEADER to its own header.ts
Menci Jun 27, 2026
4c1825f
fix(aliases/web): Adaptive control becomes a tri-state Select
Menci Jun 27, 2026
8731c69
fix(codex): kind-filter alias targets against the addressable surface
Menci Jun 27, 2026
465285d
fix(aliases): stage x-floway-alias on the no-target 404 + share the p…
Menci Jun 27, 2026
de970aa
fix(aliases): AliasNoTargetAvailableError distinguishes endpoint-mism…
Menci Jun 27, 2026
bacb9f7
test(aliases/web): pin announced-metadata.ts as a mirror of the gateway
Menci Jun 27, 2026
9c0d9e6
test(aliases): pin the alias-no-target 404 path on every chat protocol
Menci Jun 27, 2026
a8a2dac
docs(ui/combobox): drop alias-specific examples from a generic primitive
Menci Jun 27, 2026
3b3706b
test(aliases): pin Messages serviceTier sibling-clear regression
Menci Jun 27, 2026
0491363
test(passthrough): pin alias-no-target 404 envelope + x-floway-alias …
Menci Jun 27, 2026
f62de4a
refactor(aliases/prelude): expose effectiveModelId; Gemini stops re-d…
Menci Jun 27, 2026
a972915
feat(control-plane/models): gateway_wide=true bypasses caller cap (ad…
Menci Jun 27, 2026
2c0746d
fix(aliases/web): useRawModelsStore reads the gateway-wide catalog
Menci Jun 27, 2026
51092e1
docs(aliases/web): rewrite no-target warning to match gateway-wide se…
Menci Jun 27, 2026
f8399df
feat(aliases/web): playground filters by effective cap; admin sees ga…
Menci Jun 27, 2026
a11baa2
docs(aliases/web): correct stale gateway_wide=true reference in no-ta…
Menci Jun 27, 2026
0725c31
test(chat/shared): drop unused alias field from TraceLine
Menci Jun 27, 2026
e1fe43e
test(models): drop stale comment about endpoints field
Menci Jun 27, 2026
5c549f2
cleanup(aliases/web): drop fake-robust limits fallback in announced m…
Menci Jun 27, 2026
1a327ea
fix(aliases): split metadata (gateway-wide) from aliasedFrom visibili…
Menci Jun 28, 2026
e48306b
refactor(aliases/web): ModelInfoBar alias-of badge becomes count-based
Menci Jun 28, 2026
afb89a5
fix(aliases/web): alias-of single-target badge uses raw model id, not…
Menci Jun 28, 2026
46626cb
feat(aliases/web): alias rows render the upstream-bindings union
Menci Jun 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
"@unocss/preset-wind3": "^66.5.10",
"@unocss/reset": "^66.5.10",
"@vitejs/plugin-vue": "^6.0.1",
"@vue/test-utils": "^2.4.11",
"happy-dom": "^20.0.0",
"unocss": "^66.5.10",
"unocss-preset-animations": "^1.3.0",
Expand Down
36 changes: 36 additions & 0 deletions apps/web/src/api/test-fixtures.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Test-only fixtures that satisfy the `@floway-dev/protocols/common` PublicModel
// shape. Production rows always carry every required field — see the gateway's
// `toPublicModel` and `toControlPlaneModel` — but tests want to fan out partials
// without retyping `object` / `type` / `display_name` / `limits` / `endpoints`
// every time. The factories merge `over` last so any field the test sets wins.

import type { ControlPlaneModel } from './types.ts';

const baseFields = (): Omit<ControlPlaneModel, 'id' | 'upstreams'> => ({
object: 'model',
type: 'model',
display_name: '',
limits: {},
kind: 'chat',
endpoints: { chatCompletions: {} },
});

export const buildRealModel = (over: Partial<ControlPlaneModel> & { id: string }): ControlPlaneModel => ({
...baseFields(),
upstreams: [{ id: 'u1', name: 'U1', kind: 'custom' }],
...over,
});

export const buildAliasModel = (over: Partial<ControlPlaneModel> & { id: string }): ControlPlaneModel => ({
...baseFields(),
upstreams: [],
aliasedFrom: { name: over.id, kind: 'chat', selection: 'first-available', targets: [] },
...over,
});

export const buildUnlistedModel = (over: Partial<ControlPlaneModel> & { id: string }): ControlPlaneModel => ({
...baseFields(),
upstreams: [{ id: 'u1', name: 'U1', kind: 'custom' }],
unlisted: true,
...over,
});
38 changes: 16 additions & 22 deletions apps/web/src/api/types.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,30 @@
// Control-plane DTOs the SPA consumes — serialized shapes the gateway emits at /api.

import type {
AliasKind,
AliasRules,
AliasSelection,
AliasTarget,
AnnouncedMetadata,
BillingDimension,
ChatAliasRules,
ChatModelInfo,
ModelAlias,
ModelEndpointKey,
ModelEndpoints,
ModelKind,
ModelPricing,
PublicModel,
PublicModelLimits,
} from '@floway-dev/protocols/common';
import type { AddressableForm, ModelPrefixConfig } from '@floway-dev/provider/model-prefix';

export type { BillingDimension, ModelEndpointKey, ModelEndpoints, ModelKind, ModelPricing };
export type { AddressableForm, ModelPrefixConfig };
export type {
AliasKind, AliasRules, AliasSelection, AliasTarget, AnnouncedMetadata, ChatAliasRules, ChatModelInfo, ModelAlias,
PublicModel, PublicModelLimits,
};

export type UpstreamProviderKind = 'custom' | 'azure' | 'copilot' | 'codex' | 'claude-code' | 'ollama';

Expand Down Expand Up @@ -38,7 +52,7 @@ export interface UpstreamModelConfig {
kind: ModelKind;
endpoints: ModelEndpoints;
display_name?: string;
limits?: ModelLimits;
limits?: PublicModelLimits;
cost?: ModelPricing;
flagOverrides?: { enabled: boolean; values: Record<string, boolean> };
chat?: UpstreamChatConfig;
Expand All @@ -57,7 +71,7 @@ export interface CustomRawModel {
name?: string;
created?: number;
owned_by?: string;
limits?: ModelLimits;
limits?: PublicModelLimits;
cost?: ModelPricing;
kind?: ModelKind;
}
Expand Down Expand Up @@ -322,26 +336,6 @@ export interface ApiKey {
dump_retention_seconds: number | null;
}

export interface ModelEndpointInfo {
url: string;
doc?: string;
}

export interface ModelLimits {
max_context_window_tokens?: number;
max_prompt_tokens?: number;
max_output_tokens?: number;
}

export interface PublicModel {
id: string;
display_name?: string;
limits?: ModelLimits;
endpoints?: Record<string, ModelEndpointInfo>;
cost?: ModelPricing;
kind?: ModelKind;
}

export interface ControlPlaneModel extends PublicModel {
upstreams: { kind: UpstreamProviderKind; id: string; name: string }[];
}
Expand Down
Loading