CI runs stable (now 1.95) which surfaces two new lints my 1.94 local
check missed:
- collapsible_match in reverse_message_map.rs: collapse the empty
guard branch into a match arm with a guard.
- manual_checked_ops in admin/db.rs: replace the explicit zero check
with checked_div(...).unwrap_or(0).
- collapsible_match in admin/ws.rs: clippy's suggested guard form
fails to compile because Bytes can't be moved in a pattern guard.
Apply a targeted #[allow] with a comment explaining why.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Drop job-level continue-on-error: true (was masking real failures since
each step already handles exit 101 inline). Remove the duplicate
anyllm_batch_engine step that lacked the exit-101 swallow. Canonical
publish order is now: translate -> providers -> client -> batch_engine
-> proxy with 30s sleeps for index propagation.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- tools_map: use std::slice::from_ref over &[clone()] in 4 tests
- gemini_streaming_map: rewrite match as matches!
- backend/mod.rs: move impl BackendClient before #[cfg(test)] mod tests
- middleware: replace .filter().last() with .rfind() (xff parsing)
- middleware: drop dead `|| true` in is_ip_allowed smoke test
- sse: drop blank line between doc comment and assert_sse_ok
- streaming example: collapse nested if-let into outer match arms
- tool_execution tests: array literal over vec! for one-off slices
- live_bedrock: use is_some_and instead of map_or(false, _)
- live_api / live_responses: contains() over iter().any() on &[&str]
All test-only / example changes; no production behavior change.
1130 tests pass, fmt clean, clippy -D warnings clean.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Each new README places the crate inside the anyllm-proxy workspace and
includes verified library-use examples for downstream consumers.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Documents the anyllm_providers crate as a pure compile-time metadata
catalog within the anyllm-proxy workspace, with a TUI integration walk-
through defaulting to Ollama and LM Studio and a categorized list of
all 90 registered providers.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Fixes RUSTSEC-2026-0098 (URI name constraint bypass) and
RUSTSEC-2026-0099 (wildcard name constraint bypass).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Populate model definitions and refine capability flags across provider
stubs, adding context windows, output limits, and per-model capabilities
for chat, tool use, vision, and streaming where applicable.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Field is populated from the DB but scoping enforcement is not yet wired,
so clippy flags it. Keep the field to avoid reshuffling VirtualKeyContext
when enforcement lands.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace top nav with sidebar layout; add shared Modal, Toast, ConfirmDialog, AsyncBoundary components
- Add Routes tab with full CRUD UI backed by new routes_api admin endpoints
- Split admin rate limiter into separate read/write buckets with method-aware middleware
- Add allowed_routes scoping to virtual keys
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
New providers: assemblyai, baidu, blackboxai, brave, cartesia, deepgram,
elevenlabs, exa, iflytek, lmsys, playht, pollinations, serper, siliconflow,
stability, tavily. Registered in mod.rs and registry.rs.
Adds a Providers tab to the admin UI with a ProviderIcon component and
catalog route. Updates backend, streaming, config, and test infrastructure
to align with the expanded provider set. Bumps all crate versions to 0.9.0.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Aligns crate versions with the GitHub release tag so the deb package
filename, crates.io versions, and release tag all agree.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- anyllm_proxy not yet on crates.io; badge now points to anyllm_translate
- deb package version is 0.2.0-1 (Cargo workspace), not 0.9.0-1 (release tag)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add create-release job before upload jobs (gh release upload requires
the release to exist first)
- Add anyllm_providers and anyllm_batch_engine to publish sequence;
proxy depends on both, missing them caused publish to fail
- release-assets and brew-release now depend on create-release
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- secrets context is not allowed in job/step-level if conditions;
move checks into shell (exit 0 if secret unset)
- Fixes YAML/semantic error causing 0s workflow file issue failures
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace heredoc in brew-release job with printf statements to fix YAML
parse error (heredoc content at col 0 broke YAML literal block scalar)
- Add --legacy-peer-deps to npm ci: @vitejs/plugin-react@4.7.0 peer deps
only declare vite ^4-7 but is runtime-compatible with vite 8
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add brew-release CI job that builds versioned macOS tarballs, uploads
them to the GitHub Release, and updates the homebrew-tap cask formula.
Ignore .mcp.json, .repowise/, and .superpowers/ in .gitignore. Add
Makefile.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add sanitize_api_key() to strip curly/smart quotes silently injected by
copy-paste from rich-text sources (Slack, docs). Add strip_v1_suffix()
to prevent doubled /v1/v1 paths when provider URLs already include /v1.
Applied across all config paths (env, simple YAML, LiteLLM YAML, TOML).
Also adds crate structure section to proxy-architecture.md and rebuilds
admin UI dist after vite upgrade.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixes Dependabot alerts #2 (high) and #3 (medium): vite arbitrary file read
via dev server WebSocket and path traversal in optimized deps .map handling.
Patched version required >= 6.4.2; upgraded to 8.0.7. Build verified.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Introduces anyllm_providers crate as metadata-only catalog (ProviderDef,
ModelDef, registry). Wires any provider-id as BACKEND via OpenAIClient.
Adds bedrock_native.rs (Converse/InvokeModel with SigV4) and
generic_passthrough.rs catch-all for Translate mode. Updates config,
backend clients, streaming, token counting, and compatibility tests
to support the expanded provider surface. Updates model pricing and docs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- managed_backends.rs: stamp updated_row.updated_at after SQLite write succeeds,
before inserting into in-memory map, so the PUT response reflects a post-update
timestamp rather than the pre-update value
- providerFields.ts: add hint to rpm/tpm FieldDef entries noting they are stored
for reference and not enforced on managed backends
- queries.ts: type useCatalogProviders queryFn with explicit generic so the
server-guaranteed shape { providers: CatalogProvider[] } is reflected at compile
time; removes the ?? r fallback
- state.rs: correct managed_backends field comment from UUID key to name key
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fix 1: ManagedBackendsSection.tsx line 24 now uses p.display_name instead of
p.name, matching what the Rust catalog handler serializes.
Fix 2: BackendForm.tsx now uses useEffect to initialize providerId when providers
load, eliminating the split identity between state ('') and compensation logic
('value={providerId || providers[0]?.id ?? ''}'). The effect sets providerId to
the first provider when the list first populates and no initial provider is set.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Copy catalog.rs from main; add pub mod catalog + GET routes in admin router
- Add price_per_million_for_model to cost module (missing from this branch)
- Expand CatalogProvider with display_name, status, capabilities, model_count
- BackendForm provider dropdown: use display_name, group by status via optgroup
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add BackendForm and ManagedBackendsSection for creating/editing managed
backends at runtime. Integrate ManagedBackendsSection as first section in
Settings tab. Extend Models form with optional backend_name datalist.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add ManagedBackendsResponse interface to types.ts matching the /admin/api/backends/managed endpoint response shape
- Update useManagedBackends return type from inline { backends: ManagedBackend[] } to ManagedBackendsResponse for reusability
- Add useCatalogProviders hook to queries.ts following existing list hook patterns, handles both { providers: [...] } and bare array responses from /admin/api/catalog/providers
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fix 1: Remove manual updated_at assignment from in-memory state in update
handler. The db::update_managed_backend function independently generates a
new timestamp, so we avoid divergence between in-memory and SQLite. Add
comment explaining the pre-update state.
Fix 2: Add audit detail for update handler showing provider_id, matching
pattern used in create handler.
Fix 3: Add comment to ManagedBackendPatch struct documenting that Option<T>
fields offer no way to clear/NULL a field, guiding UI behavior.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>