Compare commits

..

35 Commits

Author SHA1 Message Date
diegosouzapw 70465ada4d feat(release): v1.8.1 — usage API proxy support
Build Electron Desktop App / Validate version (push) Failing after 35s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-03 12:06:42 -03:00
Diego Rodrigues de Sa e Souza 8ddea153d3 Merge pull request #195 from diegosouzapw/fix/issue-194-usage-proxy
fix: route usage API quota fetches through configured proxy (#194)
2026-03-03 12:05:55 -03:00
diegosouzapw 8dca8fba6b fix: route usage API quota fetches through configured proxy (#194) 2026-03-03 12:04:59 -03:00
diegosouzapw f21ba7df64 feat(release): v1.8.0 — empty tool_use.name validation, Windows electron fix
Build Electron Desktop App / Validate version (push) Failing after 31s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-03 11:21:31 -03:00
Diego Rodrigues de Sa e Souza ef917e42d1 Merge pull request #190 from benzntech/fix/electron-windows-collect-installers
fix: Windows electron release — collect portable exe by pattern
2026-03-03 11:19:53 -03:00
Diego Rodrigues de Sa e Souza 865a1b9b2c Merge pull request #193 from diegosouzapw/fix/issue-191-empty-tool-use-name
fix: validate empty tool_use.name to prevent Claude 400 errors (#191)
2026-03-03 11:19:45 -03:00
diegosouzapw de8a0836a8 fix: validate empty tool_use.name to prevent Claude 400 errors (#191) 2026-03-03 11:18:53 -03:00
benzntech b8272c55d7 fix: address review — break after first portable exe, remove debug ls 2026-03-03 09:27:31 +05:30
benzntech 8d93c13f9a fix: collect portable exe by pattern instead of hardcoded filename
electron-builder produces 'OmniRoute 1.6.9.exe' (with version) as the
portable exe, not 'OmniRoute.exe'. The hardcoded check failed, returning
exit code 1 and breaking every Windows build in the release workflow.

Now finds the portable exe by excluding 'Setup' (NSIS installer) and
blockmap files, then copies it as OmniRoute.exe for the release assets.
2026-03-03 09:20:24 +05:30
diegosouzapw 8152b030bf chore: bump version to 1.7.14 and update CHANGELOG
Build Electron Desktop App / Validate version (push) Failing after 37s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-02 19:18:38 -03:00
diegosouzapw 9352ac767f Merge PR #188: fix passthrough stream for Responses SSE (#186) 2026-03-02 19:17:38 -03:00
diegosouzapw 5f20029ff7 fix: make passthrough stream format-aware for Responses SSE (#186)
Passthrough mode now detects Responses SSE payloads (parsed.type starts
with 'response.') and skips Chat Completions-specific sanitization:
- sanitizeStreamingChunk() only runs on Chat Completions payloads
- fixInvalidId() and hasValuableContent() checks skipped for Responses
- Usage extraction still runs for both formats
- Content length tracking adapted for Responses delta format

This prevents potential stream corruption when Responses SSE data
triggers idFixed or other Chat Completions-specific rewrite conditions.
2026-03-02 19:13:34 -03:00
diegosouzapw dbd00117c8 chore: bump to 1.7.13 (npm republish)
Build Electron Desktop App / Validate version (push) Failing after 31s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-02 18:51:24 -03:00
diegosouzapw 2902a0fe26 chore: bump version to 1.7.12
Build Electron Desktop App / Validate version (push) Failing after 30s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-02 18:47:07 -03:00
diegosouzapw 7ba57634c1 feat: add blackbox.ai to dashboard frontend (#175)
- Added blackbox provider to APIKEY_PROVIDERS in providers.ts
- Added blackbox pricing entries in pricing.ts
- Added blackbox to ProviderId typedef in types.ts
- Added blackbox models endpoint config in models/route.ts
2026-03-02 18:46:48 -03:00
diegosouzapw 211dde25d0 chore: bump version to 1.7.11 and update CHANGELOG
Build Electron Desktop App / Validate version (push) Failing after 28s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-02 18:33:08 -03:00
diegosouzapw 57ff59aef2 Merge PR #183: fix projectId warnings + add blackbox.ai provider (#175, #176)
- Added warning logs when generateProjectId() is used as fallback
- Prefer translator-set body.project before generating a new fallback
- Added blackbox.ai as OpenAI-compatible provider with 6 models + logo
- Includes improvement from Copilot PRs #184 and #185
2026-03-02 18:32:08 -03:00
Diego Rodrigues de Sa e Souza c39faba2b5 Update open-sse/executors/antigravity.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-02 18:22:49 -03:00
diegosouzapw 212bca2e1e fix: add projectId warning logs and blackbox.ai provider (#175, #176)
- Added warning logs when generateProjectId() is used as fallback
  in antigravity.ts and openai-to-gemini.ts (3 locations), helping
  admins diagnose 404 errors from fake GCP project IDs (#176)
- Added blackbox.ai as new OpenAI-compatible provider with 6 models
  (GPT-4o, Gemini 2.5 Flash, Claude Sonnet 4, DeepSeek V3,
  Blackbox AI, Blackbox AI Pro) and provider logo (#175)
2026-03-02 17:58:43 -03:00
Diego Rodrigues de Sa e Souza f807c56e31 Merge pull request #182 from diegosouzapw/dependabot/npm_and_yarn/development-51b319602c
deps: bump the development group with 2 updates
2026-03-02 17:47:43 -03:00
Diego Rodrigues de Sa e Souza 5510c25040 Merge pull request #181 from diegosouzapw/dependabot/npm_and_yarn/production-d7c3d31362
deps: bump wreq-js from 2.0.1 to 2.1.1 in the production group
2026-03-02 17:47:26 -03:00
dependabot[bot] 9d884d2d60 deps: bump the development group with 2 updates
Bumps the development group with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [lint-staged](https://github.com/lint-staged/lint-staged).


Updates `@types/node` from 25.3.0 to 25.3.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `lint-staged` from 16.2.7 to 16.3.1
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v16.2.7...v16.3.1)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development
- dependency-name: lint-staged
  dependency-version: 16.3.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 20:22:45 +00:00
dependabot[bot] f26fa67374 deps: bump wreq-js from 2.0.1 to 2.1.1 in the production group
Bumps the production group with 1 update: [wreq-js](https://github.com/sqdshguy/wreq-js).


Updates `wreq-js` from 2.0.1 to 2.1.1
- [Release notes](https://github.com/sqdshguy/wreq-js/releases)
- [Commits](https://github.com/sqdshguy/wreq-js/compare/v2.0.1...v2.1.1)

---
updated-dependencies:
- dependency-name: wreq-js
  dependency-version: 2.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 20:22:16 +00:00
diegosouzapw ccb314e065 feat: update agent workflows to use PR-based flow with user verification
Refactor resolve-issues and review-prs workflows to create branches
and PRs instead of committing directly. Add mandatory stop points
for user verification before merging, closing issues, or releasing.
Includes deploy step to local VPS after release.
2026-03-02 16:37:17 -03:00
diegosouzapw 0517dcf0b7 chore: bump version to 1.7.10 and update CHANGELOG
Build Electron Desktop App / Validate version (push) Failing after 39s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-02 15:31:38 -03:00
diegosouzapw b7f0665ce9 fix: streaming tool calls missing id and wrong finish_reason in Responses→ChatCompletions translation (#180)
- Added tool_calls[].id and type:'function' to argument delta chunks
  so OpenAI-compatible clients can associate argument fragments with
  the correct tool call
- Changed finish_reason from hardcoded 'stop' to 'tool_calls' when
  tool calls were emitted (in flush, response.completed, and final chunk)
- Fixes state desync in agentic clients (OpenCode, Claude Code, etc.)
  where the assistant thinks tools already ran
2026-03-02 15:30:54 -03:00
diegosouzapw 144628755d chore: bump version to 1.7.9 and update CHANGELOG
Build Electron Desktop App / Validate version (push) Failing after 29s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-02 14:55:56 -03:00
diegosouzapw 7c5bb2c6b6 Merge PR #179: docs: update Cline URL to OpenClaw 2026-03-02 14:55:13 -03:00
diegosouzapw afadb0fea1 Merge PR #178: fix: add JWT_SECRET env to electron release build step 2026-03-02 14:54:51 -03:00
MAINER4IK b6c9c8a822 Change Cline to OpenClaw :)) 2026-03-02 22:28:01 +05:00
benzntech 11f43ca65c fix: add JWT_SECRET env to electron release build step
The Next.js build in electron-release.yml fails because the secrets
validator detects missing JWT_SECRET and exits with code 1. This adds
the env var to the build step, matching the pattern used in ci.yml.
2026-03-02 22:50:33 +05:30
diegosouzapw 8dce812a4d chore: bump version to 1.7.8 and update CHANGELOG
Build Electron Desktop App / Validate version (push) Failing after 35s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-02 12:14:58 -03:00
diegosouzapw 93047069b6 Merge PR #174: feat: add theme color settings and complete media/theme i18n 2026-03-02 12:13:53 -03:00
diegosouzapw c4f1990aff fix: address agent review issues for theme color settings (#174)
Code Quality Improvements:
- Export COLOR_THEMES from themeStore.ts for reuse (DRY)
- Add coral preset to color list (fixes default inconsistency)
- Sync local customThemeColor state reactively via Zustand subscribe
- Add hex color validation with visual feedback (red border + disabled button)
- Remove dead /themes route from Header.tsx (page doesn't exist)
- Add CSS color-mix() fallback for older browsers
- Add themeCoral i18n key to all 30 locale files
2026-03-02 12:12:52 -03:00
mainer4ik 6e2816f08b feat: add theme color settings and complete media/theme i18n 2026-03-02 18:37:27 +05:00
55 changed files with 1335 additions and 163 deletions
+29 -16
View File
@@ -6,7 +6,7 @@ description: Fetch all open GitHub issues, analyze bugs, resolve what's possible
## Overview
This workflow fetches all open issues from the project's GitHub repository, classifies them, analyzes bugs, resolves what can be fixed, and triages issues with insufficient information. **It does NOT commit or release automatically** — it presents a report and waits for user validation before proceeding.
This workflow fetches all open issues from the project's GitHub repository, classifies them, analyzes bugs, resolves what can be fixed, and triages issues with insufficient information. **It does NOT merge or release automatically** — it creates a PR and waits for user validation before merging.
## Steps
@@ -60,11 +60,12 @@ Call the `/issue-triage` workflow (located at `~/.gemini/antigravity/global_work
Proceed with resolution:
1. **Research** — Search the codebase for files related to the issue
2. **Root Cause** — Identify the root cause by reading the relevant source files
3. **Implement Fix** — Apply the fix following existing code patterns and conventions
4. **Test** — Build the project and run tests to verify the fix
5. **DO NOT commit yet** — Leave changes staged but uncommitted
1. **Create a fix branch**`git checkout -b fix/issue-<NUMBER>-<short-description>`
2. **Research** — Search the codebase for files related to the issue
3. **Root Cause** — Identify the root cause by reading the relevant source files
4. **Implement Fix** — Apply the fix following existing code patterns and conventions
5. **Test** — Build the project and run tests to verify the fix
6. **Commit** — Commit with message format: `fix: <description> (#<issue_number>)`
### 5. Generate Report & Wait for Validation
@@ -83,25 +84,37 @@ Present a summary report to the user via `notify_user` with `BlockedOnUser: true
- If the user requests changes → Apply the requested adjustments first, then present the report again
- If the user rejects → Revert the changes and stop
### 6. Commit All Fixes (only after user approval)
### 6. Commit & Push Fix Branch (only after user approval)
After the user validates:
- Commit each fix individually with message format: `fix: <description> (#<issue_number>)`
- Each fix should be its own commit for clean git history
- Push the fix branch: `git push origin fix/issue-<NUMBER>-<short-description>`
- Create a PR: `gh pr create --title "fix: <description> (#<issue_number>)" --body "<details>" --base main`
### 7. Close Resolved Issues
### 7. 🛑 WAIT — Notify User & Await PR Verification
For each successfully fixed issue:
// turbo
**This is a mandatory stop point.** Use `notify_user` with `BlockedOnUser: true`:
- Close with a comment: `gh issue close <NUMBER> --repo <owner>/<repo> --comment "Fixed in <commit_hash>. The fix will be included in the next release."`
- Inform the user that the PR was created and is **awaiting their verification**
- Include the PR number, URL, and a summary of what was changed
- **DO NOT merge, close issues, generate releases, or deploy until the user confirms**
### 8. Update Docs & Release
Wait for the user to respond:
If any fixes were committed:
- **User confirms** → Proceed to step 8
- **User requests changes** → Apply changes, push to the same branch, notify again
- **User rejects** → Close the PR and stop
1. Run the `/update-docs` workflow (at `~/.gemini/antigravity/global_workflows/update-docs.md`) to update CHANGELOG and README
2. Run the `/generate-release` workflow (at `.agents/workflows/generate-release.md`) to bump version, tag, and publish
### 8. Merge, Close Issues & Release (only after user confirms PR)
After the user confirms the PR:
1. **Merge** the PR: `gh pr merge <NUMBER> --merge --repo <owner>/<repo>` or via local merge
2. **Close** resolved issues with a comment: `gh issue close <NUMBER> --repo <owner>/<repo> --comment "Fixed in <commit_hash>. The fix will be included in the next release."`
3. **Switch to main**: `git checkout main && git pull`
4. Run the `/update-docs` workflow (at `~/.gemini/antigravity/global_workflows/update-docs.md`) to update CHANGELOG and README
5. Run the `/generate-release` workflow (at `.agents/workflows/generate-release.md`) to bump version, tag, and publish
6. Deploy to local VPS: `ssh root@192.168.0.15 "npm install -g omniroute@<VERSION> && pm2 restart omniroute"`
If NO fixes were committed, skip this step and just present the report.
+35 -11
View File
@@ -6,7 +6,7 @@ description: Analyze open Pull Requests from the project's GitHub repository, ge
## Overview
This workflow fetches all open PRs from the project's GitHub repository, performs a critical analysis of each one, generates a detailed report, and waits for user approval before proceeding with implementation.
This workflow fetches all open PRs from the project's GitHub repository, performs a critical analysis of each one, generates a detailed report, and waits for user approval before proceeding with implementation. **All improvements are committed on top of the PR branch** and the user must verify before merge.
## Steps
@@ -94,28 +94,52 @@ Perform a **global impact assessment** to verify whether the PR changes are comp
### 6. Implementation (if approved)
- Checkout the PR branch or apply changes locally
- Checkout the PR branch: `gh pr checkout <NUMBER>`
- Implement any required fixes identified in the analysis
- If the Cross-Layer Analysis (3f) identified missing frontend/backend counterparts, implement them in this step
- If the Cross-Layer Analysis (3f) identified missing frontend/backend counterparts, implement them
- **Commit improvements on top of the PR branch** with descriptive commit messages
- Run the project's test suite to verify nothing breaks
// turbo
- Run: `npm test` or equivalent test command
- Build the project to verify compilation
// turbo
- Run: `npm run build` or equivalent build command
- If all checks pass, prepare the merge
- Push the updated branch: `git push origin <branch-name>`
### 7. Thank the Contributor
### 7. 🛑 WAIT — Notify User & Await PR Verification
- After the PR is approved (and before or after merging), post a **thank-you comment** on the PR via the GitHub UI or API
**This is a mandatory stop point.** Use `notify_user` with `BlockedOnUser: true`:
- Inform the user that the PR has been **improved and pushed**, and is **awaiting their verification**
- Include:
- PR number and URL
- Summary of improvements/fixes applied
- Build/test status
- List of files changed
- **DO NOT merge, generate releases, or deploy until the user confirms**
Wait for the user to respond:
- **User confirms** → Proceed to step 8
- **User requests more changes** → Apply changes, push to the same branch, notify again
- **User rejects** → Leave a review comment and stop
### 8. Thank the Contributor
- Post a **thank-you comment** on the PR via the GitHub API
- The message should:
- Thank the author by name/username for their contribution
- Briefly mention what the PR accomplishes
- Briefly mention what the PR accomplishes and any improvements applied
- Be friendly, professional, and encouraging
- Example: _"Thanks @author for this great contribution! 🎉 The [feature/fix] is now merged and will be part of the next release. We appreciate your effort!"_
### 8. Post-Merge (if applicable)
### 9. Merge & Release (only after user confirms PR)
- Update CHANGELOG.md with the new feature
- Consider version bump if warranted
- Follow the `/generate-release` workflow if a release is needed
After the user confirms the PR:
1. **Merge** the PR into main (local merge with `--no-ff` or via `gh pr merge`)
2. **Push** to main: `git push origin main`
3. **Clean up** the feature branch: `git branch -d <branch-name>`
4. **Update CHANGELOG.md** with the new feature/fix
5. Run the `/generate-release` workflow (at `.agents/workflows/generate-release.md`) to bump version, tag, and publish
6. Deploy to local VPS: `ssh root@192.168.0.15 "npm install -g omniroute@<VERSION> && pm2 restart omniroute"`
+8 -2
View File
@@ -89,6 +89,8 @@ jobs:
run: npm ci
- name: Build Next.js standalone
env:
JWT_SECRET: ci-build-secret-with-sufficient-length-for-validation
run: npm run build
- name: Install Electron dependencies
@@ -108,9 +110,13 @@ jobs:
for file in *${{ matrix.ext }}; do
[ -f "$file" ] && cp "$file" ../../release-assets/
done
# Windows: also copy portable standalone exe
# Windows: also copy portable standalone exe as OmniRoute.exe
if [ "${{ matrix.platform }}" = "windows" ]; then
[ -f "OmniRoute.exe" ] && cp OmniRoute.exe ../../release-assets/
for file in *.exe; do
# Skip the NSIS installer (contains "Setup")
case "$file" in *Setup*) continue ;; esac
[ -f "$file" ] && cp "$file" "../../release-assets/OmniRoute.exe" && break
done
fi
- name: Upload artifacts
+67
View File
@@ -7,6 +7,73 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
---
## [1.8.1] — 2026-03-03
### 🐛 Bug Fixes
- **Usage API Proxy Support** — Quota/usage fetch calls (`/api/usage/[connectionId]`) now route through the dashboard-configured proxy (Global → Provider → Key level). Previously, usage fetchers used bare `fetch()` which bypassed the Global Proxy setting, causing "fetch failed" errors in Docker deployments behind a proxy. Fixes #194
## [1.8.0] — 2026-03-03
### 🐛 Bug Fixes
- **Empty `tool_use.name` Validation** — Fixed intermittent HTTP 400 errors when using Claude Code through OmniRoute. Assistant messages with empty `tool_use.name` fields (from interrupted tool calls or malformed history) are now validated and filtered at two layers: the `openai-to-claude` request translator and the `prepareClaudeRequest` sanitizer. Fixes #191
- **Windows Electron Release** — Fixed the "Collect installers" step failing in every Windows build since v1.7.5+. `electron-builder` produces versioned portable exe filenames (e.g., `OmniRoute 1.6.9.exe`), not the hardcoded `OmniRoute.exe` the workflow expected. Now finds the portable exe dynamically by pattern. PR #190 by @benzntech
## [1.7.14] — 2026-03-02
### 🐛 Bug Fixes
- **Responses SSE Passthrough** — Passthrough mode is now format-aware: Responses SSE payloads (`response.*` type) skip Chat Completions-specific sanitization (`sanitizeStreamingChunk`, `fixInvalidId`, `hasValuableContent`), preventing potential stream corruption for Responses-native clients. Usage extraction still works for both formats. Fixes #186
### ✨ Features
- **Blackbox AI Dashboard** — Added blackbox.ai provider to the dashboard frontend (providers page, pricing, models endpoint). Completes #175
## [1.7.11] — 2026-03-02
### ✨ Features
- **Blackbox AI Provider** — Added blackbox.ai as a new OpenAI-compatible provider with 6 default models (GPT-4o, Gemini 2.5 Flash, Claude Sonnet 4, DeepSeek V3, Blackbox AI, Blackbox AI Pro) and provider logo. Fixes #175
### 🐛 Bug Fixes
- **Antigravity 404 Error** — Added warning logs when `generateProjectId()` generates a fallback project ID because `credentials.projectId` is null. The executor now prefers the translator-set `body.project` before generating a new fallback, eliminating duplicate warnings and ID mismatch. Fixes #176. Includes improvements from PRs #184 and #185
## [1.7.10] — 2026-03-02
### 🐛 Bug Fixes
- **Streaming Tool Calls (Responses→ChatCompletions)** — Fixed two issues in the `openaiResponsesToOpenAIResponse` translator that broke tool call execution in agentic clients (OpenCode, Claude Code, Cursor, etc.): (1) Argument delta chunks now include `tool_calls[].id` and `type: "function"` so clients can associate argument fragments correctly. (2) `finish_reason` is now `"tool_calls"` instead of hardcoded `"stop"` when tool calls occurred. Fixes #180
## [1.7.9] — 2026-03-02
### 🐛 Bug Fixes
- **Electron CI Build** — Added `JWT_SECRET` environment variable to the Electron release workflow `Build Next.js standalone` step, fixing build failures in GitHub Actions. PR #178 by @benzntech
### 📝 Documentation
- **README** — Updated OpenClaw link from `cline/cline` to `openclaw/openclaw` to reflect the project rename. PR #179 by @MAINER4IK
## [1.7.8] — 2026-03-02
### ✨ New Features
- **Theme Color Customization** — Users can now select from 7 preset accent colors (Coral, Blue, Red, Green, Violet, Orange, Cyan) or define a custom color via color picker/hex input. The chosen color dynamically updates `--color-primary` and `--color-primary-hover` CSS variables across the entire UI. PR #174 by @mainer4ik
### 🌐 Multi-Language Sync
- **Theme & Media i18n** — Added `themeCoral`, `themeBlue`, `themeRed`, `themeGreen`, `themeViolet`, `themeOrange`, `themeCyan`, `themeAccent`, `themeAccentDesc`, `themeCustom`, `themeCreate`, and media section translations across all **30 language locales**
### 🔧 Code Quality (Review Improvements)
- Exported `COLOR_THEMES` constant from `themeStore.ts` for DRY reuse
- Added hex color validation with visual feedback (red border + disabled apply button)
- Synced local state via Zustand `subscribe` pattern for cross-tab consistency
- Removed dead `/themes` route from Header.tsx
- Added CSS `color-mix()` fallback for older browsers
## [1.7.7] — 2026-03-02
### 🐛 Bug Fixes
+1 -1
View File
@@ -32,7 +32,7 @@ _Connect any AI-powered IDE or CLI tool through OmniRoute — free API gateway f
<table>
<tr>
<td align="center" width="110">
<a href="https://github.com/cline/cline">
<a href="https://github.com/openclaw/openclaw">
<img src="./public/providers/openclaw.png" alt="OpenClaw" width="48"/><br/>
<b>OpenClaw</b>
</a><br/>
+19
View File
@@ -641,6 +641,25 @@ export const REGISTRY: Record<string, RegistryEntry> = {
],
},
blackbox: {
id: "blackbox",
alias: "bb",
format: "openai",
executor: "default",
baseUrl: "https://api.blackbox.ai/v1/chat/completions",
modelsUrl: "https://api.blackbox.ai/v1/models",
authType: "apikey",
authHeader: "bearer",
models: [
{ id: "gpt-4o", name: "GPT-4o" },
{ id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" },
{ id: "claude-sonnet-4", name: "Claude Sonnet 4" },
{ id: "deepseek-v3", name: "DeepSeek V3" },
{ id: "blackboxai", name: "Blackbox AI" },
{ id: "blackboxai-pro", name: "Blackbox AI Pro" },
],
},
xai: {
id: "xai",
alias: "xai",
+12 -1
View File
@@ -36,7 +36,18 @@ export class AntigravityExecutor extends BaseExecutor {
}
transformRequest(model, body, stream, credentials) {
const projectId = credentials?.projectId || this.generateProjectId();
const bodyProjectId = body?.project;
const credentialsProjectId = credentials?.projectId;
const hasExplicitProject = !!(bodyProjectId || credentialsProjectId);
const projectId = bodyProjectId || credentialsProjectId || this.generateProjectId();
if (!hasExplicitProject) {
console.warn(
`[Antigravity] ⚠️ No projectId provided via body or credentials — using generated fallback "${projectId}". ` +
`This may cause 404 errors if the account has no active GCP project. ` +
`Ensure the OAuth token includes a valid project or the request includes a project field.`
);
}
// Fix contents for Claude models via Antigravity
const normalizedContents =
@@ -126,6 +126,15 @@ export function prepareClaudeRequest(body, provider = null) {
}
}
// Pass 1.4: Filter out tool_use blocks with empty names (causes Claude 400 error)
for (const msg of filtered) {
if (msg.role === "assistant" && Array.isArray(msg.content)) {
msg.content = msg.content.filter(
(block) => block.type !== "tool_use" || (block.name && block.name.trim())
);
}
}
// Pass 1.5: Fix tool_use/tool_result ordering
// Each tool_use must have tool_result in the NEXT message (not same message with other content)
filtered = fixToolUseOrdering(filtered);
@@ -228,7 +228,10 @@ function getContentBlocksFromMessage(msg, toolNameMap = new Map()) {
});
} else if (part.type === "tool_use") {
// Tool name already has prefix from tool declarations, keep as-is
blocks.push({ type: "tool_use", id: part.id, name: part.name, input: part.input });
// CRITICAL: Skip tool_use blocks with empty name (causes Claude 400 error)
if (part.name && part.name.trim()) {
blocks.push({ type: "tool_use", id: part.id, name: part.name, input: part.input });
}
}
}
} else if (msg.content) {
@@ -241,8 +244,12 @@ function getContentBlocksFromMessage(msg, toolNameMap = new Map()) {
if (msg.tool_calls && Array.isArray(msg.tool_calls)) {
for (const tc of msg.tool_calls) {
if (tc.type === "function") {
// CRITICAL: Skip tool_calls with empty function name (causes Claude 400 error)
const fnName = tc.function?.name;
if (!fnName || !fnName.trim()) continue;
// Apply prefix to tool name
const toolName = CLAUDE_OAUTH_TOOL_PREFIX + tc.function.name;
const toolName = CLAUDE_OAUTH_TOOL_PREFIX + fnName;
blocks.push({
type: "tool_use",
id: tc.id,
@@ -271,8 +271,16 @@ export function openaiToGeminiCLIRequest(model, body, stream) {
// Wrap Gemini CLI format in Cloud Code wrapper
function wrapInCloudCodeEnvelope(model, geminiCLI, credentials = null, isAntigravity = false) {
const hasRealProject = !!credentials?.projectId;
const projectId = credentials?.projectId || generateProjectId();
if (!hasRealProject) {
console.warn(
`[${isAntigravity ? "Antigravity" : "GeminiCLI"}] ⚠️ No projectId in credentials — using generated fallback "${projectId}". ` +
`This may cause 404 errors. Ensure the OAuth token includes a valid GCP project.`
);
}
const cleanModel = model.includes("/") ? model.split("/").pop()! : model;
const envelope: Record<string, any> = {
@@ -315,10 +323,17 @@ function wrapInCloudCodeEnvelope(model, geminiCLI, credentials = null, isAntigra
return envelope;
}
// Wrap Claude format in Cloud Code envelope for Antigravity
function wrapInCloudCodeEnvelopeForClaude(model, claudeRequest, credentials = null) {
const hasRealProject = !!credentials?.projectId;
const projectId = credentials?.projectId || generateProjectId();
if (!hasRealProject) {
console.warn(
`[Antigravity/Claude] ⚠️ No projectId in credentials — using generated fallback "${projectId}". ` +
`This may cause 404 errors. Ensure the OAuth token includes a valid GCP project.`
);
}
const cleanModel = model.includes("/") ? model.split("/").pop()! : model;
const envelope: Record<string, any> = {
@@ -364,6 +364,7 @@ export function openaiResponsesToOpenAIResponse(chunk, state) {
// Flush: send final chunk with finish_reason
if (!state.finishReasonSent && state.started) {
state.finishReasonSent = true;
const hadToolCalls = (state.toolCallIndex || 0) > 0;
return {
id: state.chatId || `chatcmpl-${Date.now()}`,
object: "chat.completion.chunk",
@@ -373,7 +374,7 @@ export function openaiResponsesToOpenAIResponse(chunk, state) {
{
index: 0,
delta: {},
finish_reason: "stop",
finish_reason: hadToolCalls ? "tool_calls" : "stop",
},
],
};
@@ -468,6 +469,8 @@ export function openaiResponsesToOpenAIResponse(chunk, state) {
tool_calls: [
{
index: state.toolCallIndex,
id: state.currentToolCallId,
type: "function",
function: { arguments: argsDelta },
},
],
@@ -517,7 +520,9 @@ export function openaiResponsesToOpenAIResponse(chunk, state) {
if (!state.finishReasonSent) {
state.finishReasonSent = true;
state.finishReason = "stop"; // Mark for usage injection in stream.js
const hadToolCalls = (state.toolCallIndex || 0) > 0;
const reason = hadToolCalls ? "tool_calls" : "stop";
state.finishReason = reason; // Mark for usage injection in stream.js
const finalChunk: Record<string, any> = {
id: state.chatId,
@@ -528,7 +533,7 @@ export function openaiResponsesToOpenAIResponse(chunk, state) {
{
index: 0,
delta: {},
finish_reason: "stop",
finish_reason: reason,
},
],
};
+60 -40
View File
@@ -136,51 +136,71 @@ export function createSSEStream(options: any = {}) {
try {
let parsed = JSON.parse(trimmed.slice(5).trim());
// Sanitize: strip non-standard fields for OpenAI SDK compatibility
parsed = sanitizeStreamingChunk(parsed);
// Detect Responses SSE payloads (have a `type` field like "response.created",
// "response.output_item.added", etc.) and skip Chat Completions-specific
// sanitization to avoid corrupting the stream for Responses-native clients.
const isResponsesSSE =
parsed.type &&
typeof parsed.type === "string" &&
parsed.type.startsWith("response.");
const idFixed = fixInvalidId(parsed);
if (!hasValuableContent(parsed, FORMATS.OPENAI)) {
continue;
}
const delta = parsed.choices?.[0]?.delta;
// Extract <think> tags from streaming content
if (delta?.content && typeof delta.content === "string") {
const { content, thinking } = extractThinkingFromContent(delta.content);
delta.content = content;
if (thinking && !delta.reasoning_content) {
delta.reasoning_content = thinking;
if (isResponsesSSE) {
// Responses SSE: only extract usage, forward payload as-is
const extracted = extractUsage(parsed);
if (extracted) {
usage = extracted;
}
}
// Track content length from Responses format
if (parsed.delta && typeof parsed.delta === "string") {
totalContentLength += parsed.delta.length;
}
} else {
// Chat Completions: full sanitization pipeline
parsed = sanitizeStreamingChunk(parsed);
const content = delta?.content || delta?.reasoning_content;
if (content && typeof content === "string") {
totalContentLength += content.length;
}
const idFixed = fixInvalidId(parsed);
const extracted = extractUsage(parsed);
if (extracted) {
usage = extracted;
}
if (!hasValuableContent(parsed, FORMATS.OPENAI)) {
continue;
}
const isFinishChunk = parsed.choices?.[0]?.finish_reason;
if (isFinishChunk && !hasValidUsage(parsed.usage)) {
const estimated = estimateUsage(body, totalContentLength, FORMATS.OPENAI);
parsed.usage = filterUsageForFormat(estimated, FORMATS.OPENAI);
output = `data: ${JSON.stringify(parsed)}\n`;
usage = estimated;
injectedUsage = true;
} else if (isFinishChunk && usage) {
const buffered = addBufferToUsage(usage);
parsed.usage = filterUsageForFormat(buffered, FORMATS.OPENAI);
output = `data: ${JSON.stringify(parsed)}\n`;
injectedUsage = true;
} else if (idFixed) {
output = `data: ${JSON.stringify(parsed)}\n`;
injectedUsage = true;
const delta = parsed.choices?.[0]?.delta;
// Extract <think> tags from streaming content
if (delta?.content && typeof delta.content === "string") {
const { content, thinking } = extractThinkingFromContent(delta.content);
delta.content = content;
if (thinking && !delta.reasoning_content) {
delta.reasoning_content = thinking;
}
}
const content = delta?.content || delta?.reasoning_content;
if (content && typeof content === "string") {
totalContentLength += content.length;
}
const extracted = extractUsage(parsed);
if (extracted) {
usage = extracted;
}
const isFinishChunk = parsed.choices?.[0]?.finish_reason;
if (isFinishChunk && !hasValidUsage(parsed.usage)) {
const estimated = estimateUsage(body, totalContentLength, FORMATS.OPENAI);
parsed.usage = filterUsageForFormat(estimated, FORMATS.OPENAI);
output = `data: ${JSON.stringify(parsed)}\n`;
usage = estimated;
injectedUsage = true;
} else if (isFinishChunk && usage) {
const buffered = addBufferToUsage(usage);
parsed.usage = filterUsageForFormat(buffered, FORMATS.OPENAI);
output = `data: ${JSON.stringify(parsed)}\n`;
injectedUsage = true;
} else if (idFixed) {
output = `data: ${JSON.stringify(parsed)}\n`;
injectedUsage = true;
}
}
} catch {}
}
+24 -41
View File
@@ -1,12 +1,12 @@
{
"name": "omniroute",
"version": "1.7.7",
"version": "1.8.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "omniroute",
"version": "1.7.7",
"version": "1.8.0",
"hasInstallScript": true,
"license": "MIT",
"workspaces": [
@@ -3063,9 +3063,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "25.3.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz",
"integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==",
"version": "25.3.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz",
"integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==",
"license": "MIT",
"dependencies": {
"undici-types": "~7.18.0"
@@ -7763,19 +7763,18 @@
}
},
"node_modules/lint-staged": {
"version": "16.2.7",
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz",
"integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==",
"version": "16.3.1",
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.3.1.tgz",
"integrity": "sha512-bqvvquXzFBAlSbluugR4KXAe4XnO/QZcKVszpkBtqLWa2KEiVy8n6Xp38OeUbv/gOJOX4Vo9u5pFt/ADvbm42Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"commander": "^14.0.2",
"commander": "^14.0.3",
"listr2": "^9.0.5",
"micromatch": "^4.0.8",
"nano-spawn": "^2.0.0",
"pidtree": "^0.6.0",
"string-argv": "^0.3.2",
"yaml": "^2.8.1"
"tinyexec": "^1.0.2",
"yaml": "^2.8.2"
},
"bin": {
"lint-staged": "bin/lint-staged.js"
@@ -8084,19 +8083,6 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/nano-spawn": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz",
"integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=20.17"
},
"funding": {
"url": "https://github.com/sindresorhus/nano-spawn?sponsor=1"
}
},
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -8730,19 +8716,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pidtree": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
"integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
"dev": true,
"license": "MIT",
"bin": {
"pidtree": "bin/pidtree.js"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/pino": {
"version": "10.3.1",
"resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz",
@@ -10384,6 +10357,16 @@
"integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
"license": "MIT"
},
"node_modules/tinyexec": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
"integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
@@ -11100,9 +11083,9 @@
"license": "ISC"
},
"node_modules/wreq-js": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/wreq-js/-/wreq-js-2.0.1.tgz",
"integrity": "sha512-7GcZpzVtRX/A5pqu2QXTcqKTiYJZZRIRiosJ94GT1+taQivysZmjvkwzk8IvLz1oE1P1rGWG8ujDLCYxusM1aQ==",
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/wreq-js/-/wreq-js-2.1.1.tgz",
"integrity": "sha512-nJBOMBTczqcyHpF8a8YdPyxb30htK2RxuAfr6O8a6oyKHj2nRPjXbZcGXrquIdZx1b+6NV/GHweD3OqWwE7n4A==",
"cpu": [
"x64",
"arm64"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "omniroute",
"version": "1.7.7",
"version": "1.8.1",
"description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
"type": "module",
"bin": {
Binary file not shown.

After

Width:  |  Height:  |  Size: 441 KiB

@@ -1,16 +1,30 @@
"use client";
import { useState, useEffect } from "react";
import { Card, Toggle } from "@/shared/components";
import { Button, Card, Toggle } from "@/shared/components";
import { useTheme } from "@/shared/hooks/useTheme";
import useThemeStore, { COLOR_THEMES } from "@/store/themeStore";
import { cn } from "@/shared/utils/cn";
import { useTranslations } from "next-intl";
export default function AppearanceTab() {
const { theme, setTheme, isDark } = useTheme();
const { colorTheme, customColor, setColorTheme, setCustomColorTheme } = useThemeStore();
const t = useTranslations("settings");
const [settings, setSettings] = useState<Record<string, any>>({});
const [loading, setLoading] = useState(true);
const [customThemeColor, setCustomThemeColor] = useState(customColor || "#3b82f6");
const isValidHex = /^#([0-9a-fA-F]{6})$/.test(customThemeColor.startsWith("#") ? customThemeColor : `#${customThemeColor}`);
// Subscribe to store changes (e.g. from another tab) via Zustand external subscription
useEffect(() => {
const unsubscribe = useThemeStore.subscribe((state) => {
if (state.customColor && state.customColor !== customThemeColor) {
setCustomThemeColor(state.customColor);
}
});
return unsubscribe;
}, []); // eslint-disable-line react-hooks/exhaustive-deps
const themeOptionLabels: Record<string, string> = {
light: t("themeLight"),
dark: t("themeDark"),
@@ -47,6 +61,16 @@ export default function AppearanceTab() {
}
};
const presetThemes = [
{ id: "coral", color: COLOR_THEMES.coral, label: t("themeCoral") },
{ id: "blue", color: COLOR_THEMES.blue, label: t("themeBlue") },
{ id: "red", color: COLOR_THEMES.red, label: t("themeRed") },
{ id: "green", color: COLOR_THEMES.green, label: t("themeGreen") },
{ id: "violet", color: COLOR_THEMES.violet, label: t("themeViolet") },
{ id: "orange", color: COLOR_THEMES.orange, label: t("themeOrange") },
{ id: "cyan", color: COLOR_THEMES.cyan, label: t("themeCyan") },
];
return (
<Card>
<div className="flex items-center gap-3 mb-4">
@@ -94,6 +118,56 @@ export default function AppearanceTab() {
</div>
</div>
<div className="pt-4 border-t border-border">
<p className="font-medium mb-1">{t("themeAccent")}</p>
<p className="text-sm text-text-muted mb-3">{t("themeAccentDesc")}</p>
<div className="grid grid-cols-1 sm:grid-cols-2 gap-2 mb-3">
{presetThemes.map((item) => {
const active = colorTheme === item.id;
return (
<button
key={item.id}
onClick={() => setColorTheme(item.id)}
className={cn(
"flex items-center justify-between gap-2 p-2 rounded-lg border transition-colors",
active
? "border-primary bg-primary/10 text-primary"
: "border-border hover:bg-surface/50 text-text-main"
)}
>
<span className="flex items-center gap-2">
<span
className="size-4 rounded-full border border-black/10 dark:border-white/20"
style={{ backgroundColor: item.color }}
/>
<span className="text-sm font-medium">{item.label}</span>
</span>
</button>
);
})}
</div>
<div className="flex items-center gap-2">
<input
type="color"
value={customThemeColor}
onChange={(e) => setCustomThemeColor(e.target.value)}
className="h-10 w-12 rounded border border-border bg-surface cursor-pointer"
aria-label={t("themeCustom")}
/>
<input
type="text"
value={customThemeColor}
onChange={(e) => setCustomThemeColor(e.target.value)}
placeholder="#3b82f6"
maxLength={7}
className={`flex-1 h-10 px-3 rounded-lg bg-surface border text-sm text-text-main focus:outline-none ${isValidHex ? "border-border focus:border-primary" : "border-red-400 focus:border-red-500"}`}
/>
<Button onClick={() => setCustomColorTheme(customThemeColor)} disabled={!isValidHex}>{t("themeCreate")}</Button>
</div>
</div>
<div className="pt-4 border-t border-border">
<div className="flex items-center justify-between">
<div>
@@ -143,6 +143,14 @@ const PROVIDER_MODELS_CONFIG = {
authPrefix: "Bearer ",
parseResponse: (data) => data.data || data.models || [],
},
blackbox: {
url: "https://api.blackbox.ai/v1/models",
method: "GET",
headers: { "Content-Type": "application/json" },
authHeader: "Authorization",
authPrefix: "Bearer ",
parseResponse: (data) => data.data || data.models || [],
},
xai: {
url: "https://api.x.ai/v1/models",
method: "GET",
+9 -3
View File
@@ -1,8 +1,9 @@
import { getProviderConnectionById, updateProviderConnection } from "@/lib/localDb";
import { getProviderConnectionById, updateProviderConnection, resolveProxyForConnection } from "@/lib/localDb";
import { getMachineId } from "@/shared/utils/machine";
import { getUsageForProvider } from "@omniroute/open-sse/services/usage.ts";
import { getExecutor } from "@omniroute/open-sse/executors/index.ts";
import { syncToCloud } from "@/lib/cloudSync";
import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts";
/**
* Sync to cloud if enabled
@@ -139,8 +140,13 @@ export async function GET(request: Request, { params }: { params: Promise<{ conn
);
}
// Fetch usage from provider API
const usage = await getUsageForProvider(connection);
// Resolve proxy for this connection (key → combo → provider → global → direct)
const proxyInfo = await resolveProxyForConnection(connectionId);
// Fetch usage from provider API, wrapped in proxy context
const usage = await runWithProxyContext(proxyInfo?.proxy || null, () =>
getUsageForProvider(connection)
);
return Response.json(usage);
} catch (error) {
console.error("[Usage API] Error fetching usage:", error);
+3 -2
View File
@@ -141,9 +141,10 @@ body {
-moz-osx-font-smoothing: grayscale;
}
/* Selection */
/* Selection — with fallback for browsers that don't support color-mix() */
::selection {
background-color: rgba(229, 77, 94, 0.2);
background-color: rgba(229, 77, 94, 0.22);
background-color: color-mix(in srgb, var(--color-primary) 22%, transparent);
color: var(--color-primary);
}
+1 -1
View File
@@ -8,7 +8,7 @@
*/
/**
* @typedef {'openai'|'claude'|'gemini'|'codex'|'qwen'|'deepseek'|'cohere'|'groq'|'mistral'|'openrouter'} ProviderId
* @typedef {'openai'|'claude'|'gemini'|'codex'|'qwen'|'deepseek'|'cohere'|'groq'|'blackbox'|'mistral'|'openrouter'} ProviderId
*/
/**
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "تم قطع اتصال الخادم",
"serverDisconnectedMsg": "تم إيقاف الخادم الوكيل أو يتم إعادة تشغيله.",
"expandSidebar": "قم بتوسيع الشريط الجانبي",
"collapseSidebar": "طي الشريط الجانبي"
"collapseSidebar": "طي الشريط الجانبي",
"media": "الوسائط"
},
"header": {
"logout": "تسجيل الخروج",
@@ -1095,6 +1096,17 @@
"themeSystem": "النظام",
"hideHealthLogs": "إخفاء سجلات التحقق من الصحة",
"hideHealthLogsDesc": "عند التشغيل، قم بمنع رسائل [HealthCheck] في وحدة تحكم الخادم",
"themeAccent": "لون السمة",
"themeAccentDesc": "اختر لونًا جاهزًا أو أنشئ سمتك الخاصة بلون واحد",
"themeCreate": "إنشاء سمة",
"themeCustom": "سمة مخصصة",
"themeCoral": "مرجاني",
"themeBlue": "أزرق",
"themeRed": "أحمر",
"themeGreen": "أخضر",
"themeViolet": "بنفسجي",
"themeOrange": "برتقالي",
"themeCyan": "سماوي",
"promptCache": "ذاكرة التخزين المؤقت الفوري",
"flushCache": "مسح ذاكرة التخزين المؤقت",
"flushing": "فلاشينغ…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "يتم توفير OmniRoute \"كما هو\" دون أي ضمان من أي نوع. نحن لسنا مسؤولين عن أي تكاليف يتم تكبدها من خلال استخدام واجهة برمجة التطبيقات (API)، أو انقطاع الخدمة، أو فقدان البيانات. احتفظ دائمًا بنسخ احتياطية من التكوين الخاص بك.",
"termsSection6Title": "6. المصدر المفتوح",
"termsSection6Text": "OmniRoute هو برنامج مفتوح المصدر. ولك الحرية في فحصه وتعديله وتوزيعه بموجب شروط ترخيصه."
},
"media": {
"title": "استوديو الوسائط",
"subtitle": "أنشئ صورًا وفيديوهات وموسيقى",
"model": "Model",
"prompt": "Prompt",
"generate": "إنشاء",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Връзката със сървъра е прекъсната",
"serverDisconnectedMsg": "Прокси сървърът е спрян или се рестартира.",
"expandSidebar": "Разширете страничната лента",
"collapseSidebar": "Свиване на страничната лента"
"collapseSidebar": "Свиване на страничната лента",
"media": "Медия"
},
"header": {
"logout": "Изход",
@@ -1095,6 +1096,17 @@
"themeSystem": "система",
"hideHealthLogs": "Скриване на журналите за проверка на здравето",
"hideHealthLogsDesc": "Когато е ВКЛЮЧЕНО, потиска съобщенията [HealthCheck] в сървърната конзола",
"themeAccent": "Цвят на темата",
"themeAccentDesc": "Изберете готов цвят или създайте своя тема с един цвят",
"themeCreate": "Създай тема",
"themeCustom": "Персонална тема",
"themeCoral": "Коралов",
"themeBlue": "Син",
"themeRed": "Червен",
"themeGreen": "Зелен",
"themeViolet": "Виолетов",
"themeOrange": "Оранжев",
"themeCyan": "Циан",
"promptCache": "Кеш на подканите",
"flushCache": "Прочистване на кеша",
"flushing": "Зачервяване...",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute се предоставя „както е“ без каквато и да е гаранция. Ние не носим отговорност за каквито и да било разходи, възникнали поради използване на API, прекъсвания на услугата или загуба на данни. Винаги поддържайте резервни копия на вашата конфигурация.",
"termsSection6Title": "6. Отворен код",
"termsSection6Text": "OmniRoute е софтуер с отворен код. Вие сте свободни да го инспектирате, модифицирате и разпространявате съгласно условията на неговия лиценз."
},
"media": {
"title": "Медиен център",
"subtitle": "Генерирайте изображения, видеа и музика",
"model": "Model",
"prompt": "Prompt",
"generate": "Генерирай",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Server afbrudt",
"serverDisconnectedMsg": "Proxyserveren er blevet stoppet eller genstarter.",
"expandSidebar": "Udvid sidebjælken",
"collapseSidebar": "Skjul sidebjælken"
"collapseSidebar": "Skjul sidebjælken",
"media": "Medier"
},
"header": {
"logout": "Log ud",
@@ -1095,6 +1096,17 @@
"themeSystem": "System",
"hideHealthLogs": "Skjul logs til sundhedstjek",
"hideHealthLogsDesc": "Når ON, skal du undertrykke [HealthCheck]-meddelelser i serverkonsollen",
"themeAccent": "Temafarve",
"themeAccentDesc": "Vælg en forudindstillet farve eller opret dit eget tema med én farve",
"themeCreate": "Opret tema",
"themeCustom": "Brugerdefineret tema",
"themeCoral": "Koral",
"themeBlue": "Blå",
"themeRed": "Rød",
"themeGreen": "Grøn",
"themeViolet": "Lilla",
"themeOrange": "Orange",
"themeCyan": "Cyan",
"promptCache": "Spørg cache",
"flushCache": "Skyl cache",
"flushing": "Skyller...",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute leveres \"som den er\" uden garanti af nogen art. Vi er ikke ansvarlige for omkostninger, der påløber som følge af API-brug, serviceforstyrrelser eller tab af data. Vedligehold altid sikkerhedskopier af din konfiguration.",
"termsSection6Title": "6. Open Source",
"termsSection6Text": "OmniRoute er open source-software. Du kan frit inspicere, ændre og distribuere den i henhold til licensbetingelserne."
},
"media": {
"title": "Medieværksted",
"subtitle": "Generér billeder, videoer og musik",
"model": "Model",
"prompt": "Prompt",
"generate": "Generer",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Serververbindung getrennt",
"serverDisconnectedMsg": "Der Proxyserver wurde gestoppt oder wird neu gestartet.",
"expandSidebar": "Seitenleiste erweitern",
"collapseSidebar": "Seitenleiste einklappen"
"collapseSidebar": "Seitenleiste einklappen",
"media": "Medien"
},
"header": {
"logout": "Abmelden",
@@ -1095,6 +1096,17 @@
"themeSystem": "System",
"hideHealthLogs": "Gesundheitsprüfungsprotokolle ausblenden",
"hideHealthLogsDesc": "Wenn diese Option aktiviert ist, werden [HealthCheck]-Meldungen in der Serverkonsole unterdrückt",
"themeAccent": "Themenfarbe",
"themeAccentDesc": "Wähle eine voreingestellte Farbe oder erstelle dein eigenes Thema mit einer Farbe",
"themeCreate": "Thema erstellen",
"themeCustom": "Benutzerdefiniertes Thema",
"themeCoral": "Koralle",
"themeBlue": "Blau",
"themeRed": "Rot",
"themeGreen": "Grün",
"themeViolet": "Violett",
"themeOrange": "Orange",
"themeCyan": "Cyan",
"promptCache": "Prompt-Cache",
"flushCache": "Cache leeren",
"flushing": "Spülen…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute wird „wie besehen“ ohne Gewährleistung jeglicher Art bereitgestellt. Wir sind nicht verantwortlich für Kosten, die durch API-Nutzung, Dienstunterbrechungen oder Datenverlust entstehen. Bewahren Sie immer Backups Ihrer Konfiguration auf.",
"termsSection6Title": "6. Open Source",
"termsSection6Text": "OmniRoute ist Open-Source-Software. Es steht Ihnen frei, es im Rahmen der Lizenzbedingungen zu prüfen, zu ändern und zu verbreiten."
},
"media": {
"title": "Medien-Playground",
"subtitle": "Erstelle Bilder, Videos und Musik",
"model": "Model",
"prompt": "Prompt",
"generate": "Generieren",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+35 -3
View File
@@ -89,7 +89,27 @@
"serverDisconnected": "Server Disconnected",
"serverDisconnectedMsg": "The proxy server has been stopped or is restarting.",
"expandSidebar": "Expand sidebar",
"collapseSidebar": "Collapse sidebar"
"collapseSidebar": "Collapse sidebar",
"themes": "Themes",
"presetColors": "Popular colors",
"createTheme": "Create theme",
"chooseColor": "Pick one color",
"themeCoral": "Coral",
"themeBlue": "Blue",
"themeRed": "Red",
"themeGreen": "Green",
"themeViolet": "Violet",
"themeOrange": "Orange",
"themeCyan": "Cyan"
},
"themesPage": {
"title": "Themes",
"description": "Choose a preset theme or create your own with a single color",
"presetColors": "Popular colors",
"customTheme": "Custom theme",
"customThemeDesc": "Click create theme and pick one color",
"createTheme": "Create theme",
"activePreset": "Active theme"
},
"header": {
"logout": "Logout",
@@ -113,7 +133,9 @@
"openaiCompatible": "OpenAI Compatible",
"anthropicCompatible": "Anthropic Compatible",
"media": "Media",
"mediaDescription": "Generate images, videos, and music"
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
},
"home": {
"quickStart": "Quick Start",
@@ -265,7 +287,7 @@
},
"media": {
"title": "Media Playground",
"subtitle": "Generate images, videos, and music using your configured providers",
"subtitle": "Generate images, videos, and music",
"model": "Model",
"prompt": "Prompt",
"generate": "Generate",
@@ -1113,6 +1135,16 @@
"themeSystem": "System",
"hideHealthLogs": "Hide Health Check Logs",
"hideHealthLogsDesc": "When ON, suppress [HealthCheck] messages in server console",
"themeAccent": "Theme color",
"themeAccentDesc": "Choose a preset color or create your own theme with one color",
"themeCreate": "Create theme",
"themeCustom": "Custom theme",
"themeBlue": "Blue",
"themeRed": "Red",
"themeGreen": "Green",
"themeViolet": "Violet",
"themeOrange": "Orange",
"themeCyan": "Cyan",
"promptCache": "Prompt Cache",
"flushCache": "Flush Cache",
"flushing": "Flushing…",
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Servidor desconectado",
"serverDisconnectedMsg": "El servidor proxy se ha detenido o se está reiniciando.",
"expandSidebar": "Expandir barra lateral",
"collapseSidebar": "Contraer barra lateral"
"collapseSidebar": "Contraer barra lateral",
"media": "Multimedia"
},
"header": {
"logout": "Cerrar sesión",
@@ -1095,6 +1096,17 @@
"themeSystem": "Sistema",
"hideHealthLogs": "Ocultar registros de verificación de estado",
"hideHealthLogsDesc": "Cuando está activado, suprime los mensajes [HealthCheck] en la consola del servidor",
"themeAccent": "Color del tema",
"themeAccentDesc": "Elige un color predefinido o crea tu propio tema con un solo color",
"themeCreate": "Crear tema",
"themeCustom": "Tema personalizado",
"themeCoral": "Coral",
"themeBlue": "Azul",
"themeRed": "Rojo",
"themeGreen": "Verde",
"themeViolet": "Violeta",
"themeOrange": "Naranja",
"themeCyan": "Cian",
"promptCache": "Caché de aviso",
"flushCache": "Vaciar caché",
"flushing": "Sonrojándose…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute se proporciona \"tal cual\" sin garantía de ningún tipo. No somos responsables de los costos incurridos por el uso de API, interrupciones del servicio o pérdida de datos. Mantenga siempre copias de seguridad de su configuración.",
"termsSection6Title": "6. Código abierto",
"termsSection6Text": "OmniRoute es un software de código abierto. Usted es libre de inspeccionarlo, modificarlo y distribuirlo según los términos de su licencia."
},
"media": {
"title": "Zona multimedia",
"subtitle": "Genera imágenes, videos y música",
"model": "Model",
"prompt": "Prompt",
"generate": "Generar",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Palvelin yhteys katkaistu",
"serverDisconnectedMsg": "Välityspalvelin on pysäytetty tai käynnistyy uudelleen.",
"expandSidebar": "Laajenna sivupalkki",
"collapseSidebar": "Tiivistä sivupalkki"
"collapseSidebar": "Tiivistä sivupalkki",
"media": "Media"
},
"header": {
"logout": "Kirjaudu ulos",
@@ -1095,6 +1096,17 @@
"themeSystem": "Järjestelmä",
"hideHealthLogs": "Piilota kuntotarkastuslokit",
"hideHealthLogsDesc": "Kun PÄÄLLÄ, estä [HealthCheck]-viestit palvelinkonsolissa",
"themeAccent": "Teeman väri",
"themeAccentDesc": "Valitse valmis väri tai luo oma teemasi yhdellä värillä",
"themeCreate": "Luo teema",
"themeCustom": "Mukautettu teema",
"themeCoral": "Koralli",
"themeBlue": "Sininen",
"themeRed": "Punainen",
"themeGreen": "Vihreä",
"themeViolet": "Violetti",
"themeOrange": "Oranssi",
"themeCyan": "Syaani",
"promptCache": "Kehotusvälimuisti",
"flushCache": "Tyhjennä välimuisti",
"flushing": "Huuhdellaan…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute toimitetaan \"sellaisenaan\" ilman minkäänlaista takuuta. Emme ole vastuussa kustannuksista, jotka aiheutuvat API:n käytöstä, palveluhäiriöistä tai tietojen katoamisesta. Pidä aina varmuuskopiot asetuksistasi.",
"termsSection6Title": "6. Avoin lähdekoodi",
"termsSection6Text": "OmniRoute on avoimen lähdekoodin ohjelmisto. Voit vapaasti tarkastaa, muokata ja jakaa sitä sen lisenssiehtojen mukaisesti."
},
"media": {
"title": "Mediatyöpaja",
"subtitle": "Luo kuvia, videoita ja musiikkia",
"model": "Model",
"prompt": "Prompt",
"generate": "Luo",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Serveur déconnecté",
"serverDisconnectedMsg": "Le serveur proxy a été arrêté ou est en train de redémarrer.",
"expandSidebar": "Développer la barre latérale",
"collapseSidebar": "Réduire la barre latérale"
"collapseSidebar": "Réduire la barre latérale",
"media": "Médias"
},
"header": {
"logout": "Déconnexion",
@@ -1095,6 +1096,17 @@
"themeSystem": "Système",
"hideHealthLogs": "Masquer les journaux de contrôle de santé",
"hideHealthLogsDesc": "Lorsqu'il est activé, supprimez les messages [HealthCheck] dans la console du serveur",
"themeAccent": "Couleur du thème",
"themeAccentDesc": "Choisissez une couleur prédéfinie ou créez votre propre thème avec une seule couleur",
"themeCreate": "Créer un thème",
"themeCustom": "Thème personnalisé",
"themeCoral": "Corail",
"themeBlue": "Bleu",
"themeRed": "Rouge",
"themeGreen": "Vert",
"themeViolet": "Violet",
"themeOrange": "Orange",
"themeCyan": "Cyan",
"promptCache": "Cache d'invite",
"flushCache": "Vider le cache",
"flushing": "Rinçage…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute est fourni « tel quel », sans garantie d'aucune sorte. Nous ne sommes pas responsables des coûts occasionnés par l'utilisation de l'API, les interruptions de service ou la perte de données. Conservez toujours des sauvegardes de votre configuration.",
"termsSection6Title": "6. Ouvrir la source",
"termsSection6Text": "OmniRoute est un logiciel open source. Vous êtes libre de l'inspecter, de le modifier et de le distribuer selon les termes de sa licence."
},
"media": {
"title": "Espace média",
"subtitle": "Générez des images, des vidéos et de la musique",
"model": "Model",
"prompt": "Prompt",
"generate": "Générer",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "השרת מנותק",
"serverDisconnectedMsg": "שרת ה-proxy נעצר או מופעל מחדש.",
"expandSidebar": "הרחב את סרגל הצד",
"collapseSidebar": "כווץ את סרגל הצד"
"collapseSidebar": "כווץ את סרגל הצד",
"media": "מדיה"
},
"header": {
"logout": "התנתק",
@@ -1095,6 +1096,17 @@
"themeSystem": "מערכת",
"hideHealthLogs": "הסתר יומני בדיקת בריאות",
"hideHealthLogsDesc": "כאשר מופעל, דחק הודעות [HealthCheck] במסוף השרת",
"themeAccent": "צבע ערכת נושא",
"themeAccentDesc": "בחר צבע מוכן מראש או צור ערכת נושא משלך עם צבע אחד",
"themeCreate": "צור ערכת נושא",
"themeCustom": "ערכת נושא מותאמת אישית",
"themeCoral": "אלמוג",
"themeBlue": "כחול",
"themeRed": "אדום",
"themeGreen": "ירוק",
"themeViolet": "סגול",
"themeOrange": "כתום",
"themeCyan": "ציאן",
"promptCache": "הפקודה מטמון",
"flushCache": "לשטוף את המטמון",
"flushing": "שוטף…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute מסופק \"כמות שהוא\" ללא אחריות מכל סוג שהוא. איננו אחראים לכל עלויות שייגרמו כתוצאה משימוש ב-API, שיבושים בשירות או אובדן נתונים. שמור תמיד גיבויים של התצורה שלך.",
"termsSection6Title": "6. קוד פתוח",
"termsSection6Text": "OmniRoute היא תוכנת קוד פתוח. אתה חופשי לבדוק, לשנות ולהפיץ אותו תחת תנאי הרישיון שלו."
},
"media": {
"title": "אולפן מדיה",
"subtitle": "צור תמונות, סרטונים ומוזיקה",
"model": "Model",
"prompt": "Prompt",
"generate": "צור",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "A szerver leválasztva",
"serverDisconnectedMsg": "A proxyszerver leállt vagy újraindul.",
"expandSidebar": "Az oldalsáv kibontása",
"collapseSidebar": "Oldalsáv összecsukása"
"collapseSidebar": "Oldalsáv összecsukása",
"media": "Média"
},
"header": {
"logout": "Kijelentkezés",
@@ -1095,6 +1096,17 @@
"themeSystem": "Rendszer",
"hideHealthLogs": "Állapotellenőrzési naplók elrejtése",
"hideHealthLogsDesc": "Ha BE van kapcsolva, tiltsa le a [HealthCheck] üzeneteket a kiszolgálókonzolon",
"themeAccent": "Téma színe",
"themeAccentDesc": "Válassz előre beállított színt, vagy készíts saját témát egy színből",
"themeCreate": "Téma létrehozása",
"themeCustom": "Egyéni téma",
"themeCoral": "Korall",
"themeBlue": "Kék",
"themeRed": "Piros",
"themeGreen": "Zöld",
"themeViolet": "Ibolya",
"themeOrange": "Narancs",
"themeCyan": "Cián",
"promptCache": "Prompt Cache",
"flushCache": "Öblítse ki a gyorsítótárat",
"flushing": "Öblítés…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "Az OmniRoute \"ahogy van\" mindenféle garancia nélkül biztosított. Nem vállalunk felelősséget az API használatából, a szolgáltatás megszakadásából vagy az adatvesztésből eredő költségekért. Mindig készítsen biztonsági másolatot a konfigurációjáról.",
"termsSection6Title": "6. Nyílt forráskód",
"termsSection6Text": "Az OmniRoute egy nyílt forráskódú szoftver. Ön szabadon megvizsgálhatja, módosíthatja és terjesztheti a licenc feltételei szerint."
},
"media": {
"title": "Média játszótér",
"subtitle": "Képek, videók és zene generálása",
"model": "Model",
"prompt": "Prompt",
"generate": "Generálás",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Server Terputus",
"serverDisconnectedMsg": "Server proxy telah dihentikan atau dimulai ulang.",
"expandSidebar": "Luaskan bilah sisi",
"collapseSidebar": "Ciutkan bilah sisi"
"collapseSidebar": "Ciutkan bilah sisi",
"media": "Media"
},
"header": {
"logout": "Keluar",
@@ -1095,6 +1096,17 @@
"themeSystem": "Sistem",
"hideHealthLogs": "Sembunyikan Log Pemeriksaan Kesehatan",
"hideHealthLogsDesc": "Saat AKTIF, sembunyikan pesan [HealthCheck] di konsol server",
"themeAccent": "Warna tema",
"themeAccentDesc": "Pilih warna preset atau buat tema Anda sendiri dengan satu warna",
"themeCreate": "Buat tema",
"themeCustom": "Tema kustom",
"themeCoral": "Koral",
"themeBlue": "Biru",
"themeRed": "Merah",
"themeGreen": "Hijau",
"themeViolet": "Ungu",
"themeOrange": "Oranye",
"themeCyan": "Sian",
"promptCache": "Tembolok Cepat",
"flushCache": "Siram Cache",
"flushing": "Pembilasan…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute disediakan \"sebagaimana adanya\" tanpa jaminan apa pun. Kami tidak bertanggung jawab atas segala biaya yang timbul akibat penggunaan API, gangguan layanan, atau kehilangan data. Selalu simpan cadangan konfigurasi Anda.",
"termsSection6Title": "6. Sumber Terbuka",
"termsSection6Text": "OmniRoute adalah perangkat lunak sumber terbuka. Anda bebas memeriksa, memodifikasi, dan mendistribusikannya berdasarkan ketentuan lisensinya."
},
"media": {
"title": "Playground Media",
"subtitle": "Hasilkan gambar, video, dan musik",
"model": "Model",
"prompt": "Prompt",
"generate": "Hasilkan",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "सर्वर डिसकनेक्ट हो गया",
"serverDisconnectedMsg": "प्रॉक्सी सर्वर बंद कर दिया गया है या पुनः प्रारंभ हो रहा है।",
"expandSidebar": "साइडबार का विस्तार करें",
"collapseSidebar": "साइडबार को संक्षिप्त करें"
"collapseSidebar": "साइडबार को संक्षिप्त करें",
"media": "मीडिया"
},
"header": {
"logout": "लॉगआउट करें",
@@ -1095,6 +1096,17 @@
"themeSystem": "सिस्टम",
"hideHealthLogs": "स्वास्थ्य जांच लॉग छुपाएं",
"hideHealthLogsDesc": "चालू होने पर, सर्वर कंसोल में [हेल्थचेक] संदेशों को दबाएँ",
"themeAccent": "थीम का रंग",
"themeAccentDesc": "एक प्रीसेट रंग चुनें या एक ही रंग से अपनी थीम बनाएं",
"themeCreate": "थीम बनाएं",
"themeCustom": "कस्टम थीम",
"themeCoral": "Koral",
"themeBlue": "नीला",
"themeRed": "लाल",
"themeGreen": "हरा",
"themeViolet": "बैंगनी",
"themeOrange": "नारंगी",
"themeCyan": "सियान",
"promptCache": "शीघ्र कैश",
"flushCache": "कैश फ्लश करें",
"flushing": "निस्तब्धता...",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "ओम्निरूट को किसी भी प्रकार की वारंटी के बिना \"जैसा है\" प्रदान किया जाता है। हम एपीआई उपयोग, सेवा व्यवधान या डेटा हानि के कारण होने वाली किसी भी लागत के लिए ज़िम्मेदार नहीं हैं। हमेशा अपने कॉन्फ़िगरेशन का बैकअप बनाए रखें।",
"termsSection6Title": "6. खुला स्रोत",
"termsSection6Text": "ओमनीरूट ओपन-सोर्स सॉफ्टवेयर है। आप इसके लाइसेंस की शर्तों के तहत इसका निरीक्षण, संशोधन और वितरण करने के लिए स्वतंत्र हैं।"
},
"media": {
"title": "मीडिया प्लेग्राउंड",
"subtitle": "छवियाँ, वीडियो और संगीत उत्पन्न करें",
"model": "Model",
"prompt": "Prompt",
"generate": "उत्पन्न करें",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Server disconnesso",
"serverDisconnectedMsg": "Il server proxy è stato arrestato o si sta riavviando.",
"expandSidebar": "Espandi la barra laterale",
"collapseSidebar": "Comprimi la barra laterale"
"collapseSidebar": "Comprimi la barra laterale",
"media": "Media"
},
"header": {
"logout": "Esci",
@@ -1095,6 +1096,17 @@
"themeSystem": "Sistema",
"hideHealthLogs": "Nascondi i registri di controllo dello stato",
"hideHealthLogsDesc": "Quando è attivo, elimina i messaggi [HealthCheck] nella console del server",
"themeAccent": "Colore del tema",
"themeAccentDesc": "Scegli un colore predefinito o crea il tuo tema con un solo colore",
"themeCreate": "Crea tema",
"themeCustom": "Tema personalizzato",
"themeCoral": "Corallo",
"themeBlue": "Blu",
"themeRed": "Rosso",
"themeGreen": "Verde",
"themeViolet": "Viola",
"themeOrange": "Arancione",
"themeCyan": "Ciano",
"promptCache": "Cache dei suggerimenti",
"flushCache": "Svuota cache",
"flushing": "Lavaggio…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute viene fornito \"così com'è\" senza garanzie di alcun tipo. Non siamo responsabili per eventuali costi sostenuti per l'utilizzo dell'API, interruzioni del servizio o perdita di dati. Mantieni sempre i backup della tua configurazione.",
"termsSection6Title": "6. Sorgente aperta",
"termsSection6Text": "OmniRoute è un software open source. Sei libero di esaminarlo, modificarlo e distribuirlo secondo i termini della sua licenza."
},
"media": {
"title": "Area Media",
"subtitle": "Genera immagini, video e musica",
"model": "Model",
"prompt": "Prompt",
"generate": "Genera",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "サーバーが切断されました",
"serverDisconnectedMsg": "プロキシ サーバーが停止しているか、再起動中です。",
"expandSidebar": "サイドバーを展開する",
"collapseSidebar": "サイドバーを折りたたむ"
"collapseSidebar": "サイドバーを折りたたむ",
"media": "メディア"
},
"header": {
"logout": "ログアウト",
@@ -1095,6 +1096,17 @@
"themeSystem": "システム",
"hideHealthLogs": "ヘルスチェックログを非表示にする",
"hideHealthLogsDesc": "ON の場合、サーバー コンソールで [HealthCheck] メッセージを抑制します",
"themeAccent": "テーマカラー",
"themeAccentDesc": "プリセットカラーを選ぶか、1色で独自のテーマを作成します",
"themeCreate": "テーマを作成",
"themeCustom": "カスタムテーマ",
"themeCoral": "コーラル",
"themeBlue": "青",
"themeRed": "赤",
"themeGreen": "緑",
"themeViolet": "紫",
"themeOrange": "オレンジ",
"themeCyan": "シアン",
"promptCache": "プロンプトキャッシュ",
"flushCache": "キャッシュのフラッシュ",
"flushing": "フラッシング…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute は、いかなる種類の保証もなく「現状のまま」提供されます。 API の使用、サービスの中断、またはデータの損失によって発生する費用については、当社は責任を負いません。構成のバックアップを常に維持してください。",
"termsSection6Title": "6. オープンソース",
"termsSection6Text": "OmniRoute はオープンソース ソフトウェアです。ライセンス条項に基づいて、自由に検査、変更、配布することができます。"
},
"media": {
"title": "メディアプレイグラウンド",
"subtitle": "画像、動画、音楽を生成",
"model": "Model",
"prompt": "Prompt",
"generate": "生成",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "서버 연결 끊김",
"serverDisconnectedMsg": "프록시 서버가 중지되었거나 다시 시작되는 중입니다.",
"expandSidebar": "사이드바 확장",
"collapseSidebar": "사이드바 접기"
"collapseSidebar": "사이드바 접기",
"media": "미디어"
},
"header": {
"logout": "로그아웃",
@@ -1095,6 +1096,17 @@
"themeSystem": "시스템",
"hideHealthLogs": "상태 확인 로그 숨기기",
"hideHealthLogsDesc": "ON일 때, 서버 콘솔에서 [HealthCheck] 메시지를 억제합니다.",
"themeAccent": "테마 색상",
"themeAccentDesc": "미리 설정된 색상을 선택하거나 단일 색상으로 나만의 테마를 만드세요",
"themeCreate": "테마 만들기",
"themeCustom": "사용자 지정 테마",
"themeCoral": "코랄",
"themeBlue": "파랑",
"themeRed": "빨강",
"themeGreen": "초록",
"themeViolet": "보라",
"themeOrange": "주황",
"themeCyan": "시안",
"promptCache": "프롬프트 캐시",
"flushCache": "캐시 플러시",
"flushing": "플러싱…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute는 어떠한 종류의 보증도 없이 \"있는 그대로\" 제공됩니다. API 사용, 서비스 중단 또는 데이터 손실로 인해 발생하는 비용에 대해 당사는 책임을 지지 않습니다. 항상 구성의 백업을 유지하십시오.",
"termsSection6Title": "6. 오픈 소스",
"termsSection6Text": "OmniRoute는 오픈 소스 소프트웨어입니다. 라이센스 조건에 따라 자유롭게 검사, 수정 및 배포할 수 있습니다."
},
"media": {
"title": "미디어 플레이그라운드",
"subtitle": "이미지, 비디오, 음악 생성",
"model": "Model",
"prompt": "Prompt",
"generate": "생성",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Pelayan Terputus Sambungan",
"serverDisconnectedMsg": "Pelayan proksi telah dihentikan atau dimulakan semula.",
"expandSidebar": "Kembangkan bar sisi",
"collapseSidebar": "Runtuhkan bar sisi"
"collapseSidebar": "Runtuhkan bar sisi",
"media": "Media"
},
"header": {
"logout": "Log keluar",
@@ -1095,6 +1096,17 @@
"themeSystem": "Sistem",
"hideHealthLogs": "Sembunyikan Log Pemeriksaan Kesihatan",
"hideHealthLogsDesc": "Apabila HIDUP, sekat mesej [HealthCheck] dalam konsol pelayan",
"themeAccent": "Warna tema",
"themeAccentDesc": "Pilih warna pratetap atau cipta tema anda sendiri dengan satu warna",
"themeCreate": "Cipta tema",
"themeCustom": "Tema tersuai",
"themeCoral": "Koral",
"themeBlue": "Biru",
"themeRed": "Merah",
"themeGreen": "Hijau",
"themeViolet": "Ungu",
"themeOrange": "Oren",
"themeCyan": "Sian",
"promptCache": "Cache Prompt",
"flushCache": "Flush Cache",
"flushing": "Membilas…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute disediakan \"seadanya\" tanpa sebarang jenis waranti. Kami tidak bertanggungjawab untuk sebarang kos yang ditanggung melalui penggunaan API, gangguan perkhidmatan atau kehilangan data. Sentiasa kekalkan sandaran konfigurasi anda.",
"termsSection6Title": "6. Sumber Terbuka",
"termsSection6Text": "OmniRoute ialah perisian sumber terbuka. Anda bebas untuk memeriksa, mengubah suai dan mengedarkannya di bawah syarat lesennya."
},
"media": {
"title": "Ruang Media",
"subtitle": "Jana imej, video dan muzik",
"model": "Model",
"prompt": "Prompt",
"generate": "Jana",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Serververbinding verbroken",
"serverDisconnectedMsg": "De proxyserver is gestopt of wordt opnieuw opgestart.",
"expandSidebar": "Vouw zijbalk uit",
"collapseSidebar": "Zijbalk samenvouwen"
"collapseSidebar": "Zijbalk samenvouwen",
"media": "Media"
},
"header": {
"logout": "Uitloggen",
@@ -1095,6 +1096,17 @@
"themeSystem": "Systeem",
"hideHealthLogs": "Statuschecklogboeken verbergen",
"hideHealthLogsDesc": "Indien AAN: onderdruk [HealthCheck]-berichten in de serverconsole",
"themeAccent": "Themakleur",
"themeAccentDesc": "Kies een vooraf ingestelde kleur of maak je eigen thema met één kleur",
"themeCreate": "Thema maken",
"themeCustom": "Aangepast thema",
"themeCoral": "Koraal",
"themeBlue": "Blauw",
"themeRed": "Rood",
"themeGreen": "Groen",
"themeViolet": "Violet",
"themeOrange": "Oranje",
"themeCyan": "Cyaan",
"promptCache": "Snelle cache",
"flushCache": "Cache leegmaken",
"flushing": "Doorspoelen…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute wordt geleverd \"zoals het is\" zonder enige vorm van garantie. Wij zijn niet verantwoordelijk voor eventuele kosten die voortvloeien uit API-gebruik, serviceonderbrekingen of gegevensverlies. Zorg altijd voor back-ups van uw configuratie.",
"termsSection6Title": "6. Open-source",
"termsSection6Text": "OmniRoute is open source-software. U bent vrij om het te inspecteren, wijzigen en distribueren onder de voorwaarden van de licentie."
},
"media": {
"title": "Media-werkplaats",
"subtitle": "Genereer afbeeldingen, videos en muziek",
"model": "Model",
"prompt": "Prompt",
"generate": "Genereren",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Server frakoblet",
"serverDisconnectedMsg": "Proxy-serveren er stoppet eller starter på nytt.",
"expandSidebar": "Utvid sidefeltet",
"collapseSidebar": "Skjul sidefeltet"
"collapseSidebar": "Skjul sidefeltet",
"media": "Medier"
},
"header": {
"logout": "Logg ut",
@@ -1095,6 +1096,17 @@
"themeSystem": "System",
"hideHealthLogs": "Skjul helsesjekklogger",
"hideHealthLogsDesc": "Når PÅ, undertrykk [HealthCheck]-meldinger i serverkonsollen",
"themeAccent": "Temafarge",
"themeAccentDesc": "Velg en forhåndsinnstilt farge eller lag ditt eget tema med én farge",
"themeCreate": "Opprett tema",
"themeCustom": "Egendefinert tema",
"themeCoral": "Korall",
"themeBlue": "Blå",
"themeRed": "Rød",
"themeGreen": "Grønn",
"themeViolet": "Fiolett",
"themeOrange": "Oransje",
"themeCyan": "Cyan",
"promptCache": "Spør Cache",
"flushCache": "Skyll cache",
"flushing": "Skyller …",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute leveres \"som den er\" uten garanti av noe slag. Vi er ikke ansvarlige for kostnader som påløper gjennom API-bruk, tjenesteavbrudd eller tap av data. Oppretthold alltid sikkerhetskopier av konfigurasjonen din.",
"termsSection6Title": "6. Åpen kildekode",
"termsSection6Text": "OmniRoute er åpen kildekode-programvare. Du står fritt til å inspisere, modifisere og distribuere den under lisensvilkårene."
},
"media": {
"title": "Medialab",
"subtitle": "Generer bilder, videoer og musikk",
"model": "Model",
"prompt": "Prompt",
"generate": "Generer",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Nadiskonekta ang Server",
"serverDisconnectedMsg": "Ang proxy server ay itinigil o nagre-restart.",
"expandSidebar": "Palawakin ang sidebar",
"collapseSidebar": "I-collapse ang sidebar"
"collapseSidebar": "I-collapse ang sidebar",
"media": "Media"
},
"header": {
"logout": "Mag-logout",
@@ -1095,6 +1096,17 @@
"themeSystem": "Sistema",
"hideHealthLogs": "Itago ang Health Check Logs",
"hideHealthLogsDesc": "Kapag NAKA-ON, sugpuin ang mga mensahe ng [HealthCheck] sa server console",
"themeAccent": "Kulay ng tema",
"themeAccentDesc": "Pumili ng preset na kulay o gumawa ng sarili mong tema gamit ang isang kulay",
"themeCreate": "Gumawa ng tema",
"themeCustom": "Custom na tema",
"themeCoral": "Koral",
"themeBlue": "Asul",
"themeRed": "Pula",
"themeGreen": "Berde",
"themeViolet": "Lila",
"themeOrange": "Kahel",
"themeCyan": "Siyan",
"promptCache": "Prompt Cache",
"flushCache": "Flush Cache",
"flushing": "Nag-flush...",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "Ang OmniRoute ay ibinigay \"as is\" nang walang anumang uri ng warranty. Hindi kami mananagot para sa anumang mga gastos na natamo sa pamamagitan ng paggamit ng API, pagkaantala ng serbisyo, o pagkawala ng data. Palaging panatilihin ang mga backup ng iyong configuration.",
"termsSection6Title": "6. Open Source",
"termsSection6Text": "Ang OmniRoute ay open-source na software. Malaya kang suriin, baguhin, at ipamahagi ito sa ilalim ng mga tuntunin ng lisensya nito."
},
"media": {
"title": "Media Playground",
"subtitle": "Bumuo ng mga larawan, video, at musika",
"model": "Model",
"prompt": "Prompt",
"generate": "Bumuo",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Serwer odłączony",
"serverDisconnectedMsg": "Serwer proxy został zatrzymany lub uruchamia się ponownie.",
"expandSidebar": "Rozwiń pasek boczny",
"collapseSidebar": "Zwiń pasek boczny"
"collapseSidebar": "Zwiń pasek boczny",
"media": "Media"
},
"header": {
"logout": "Wyloguj się",
@@ -1095,6 +1096,17 @@
"themeSystem": "Systemu",
"hideHealthLogs": "Ukryj dzienniki kontroli stanu",
"hideHealthLogsDesc": "Gdy opcja jest włączona, pomiń komunikaty [HealthCheck] w konsoli serwera",
"themeAccent": "Kolor motywu",
"themeAccentDesc": "Wybierz gotowy kolor lub utwórz własny motyw z jednego koloru",
"themeCreate": "Utwórz motyw",
"themeCustom": "Motyw niestandardowy",
"themeCoral": "Koralowy",
"themeBlue": "Niebieski",
"themeRed": "Czerwony",
"themeGreen": "Zielony",
"themeViolet": "Fioletowy",
"themeOrange": "Pomarańczowy",
"themeCyan": "Cyjan",
"promptCache": "Natychmiastowa pamięć podręczna",
"flushCache": "Opróżnij pamięć podręczną",
"flushing": "Płukanie…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "Usługa OmniRoute jest dostarczana w stanie takim, w jakim jest, bez jakiejkolwiek gwarancji. Nie ponosimy odpowiedzialności za jakiekolwiek koszty powstałe w wyniku korzystania z API, zakłóceń w świadczeniu usług lub utraty danych. Zawsze twórz kopie zapasowe swojej konfiguracji.",
"termsSection6Title": "6. Otwarte źródło",
"termsSection6Text": "OmniRoute jest oprogramowaniem typu open source. Możesz go przeglądać, modyfikować i rozpowszechniać zgodnie z warunkami licencji."
},
"media": {
"title": "Studio multimediów",
"subtitle": "Generuj obrazy, wideo i muzykę",
"model": "Model",
"prompt": "Prompt",
"generate": "Generuj",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+12 -1
View File
@@ -265,7 +265,7 @@
},
"media": {
"title": "Playground de Mídia",
"subtitle": "Gere imagens, vídeos e músicas usando seus provedores configurados",
"subtitle": "Gere imagens, vídeos e música",
"model": "Modelo",
"prompt": "Prompt",
"generate": "Gerar",
@@ -1113,6 +1113,17 @@
"themeSystem": "Sistema",
"hideHealthLogs": "Ocultar Logs de Health Check",
"hideHealthLogsDesc": "Quando ATIVADO, suprime mensagens [HealthCheck] no console do servidor",
"themeAccent": "Cor do tema",
"themeAccentDesc": "Escolha uma cor predefinida ou crie seu próprio tema com uma cor",
"themeCreate": "Criar tema",
"themeCustom": "Tema personalizado",
"themeCoral": "Coral",
"themeBlue": "Azul",
"themeRed": "Vermelho",
"themeGreen": "Verde",
"themeViolet": "Violeta",
"themeOrange": "Laranja",
"themeCyan": "Ciano",
"promptCache": "Cache de Prompt",
"flushCache": "Limpar Cache",
"flushing": "Limpando…",
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Servidor desconectado",
"serverDisconnectedMsg": "O servidor proxy foi interrompido ou está reiniciando.",
"expandSidebar": "Expandir barra lateral",
"collapseSidebar": "Recolher barra lateral"
"collapseSidebar": "Recolher barra lateral",
"media": "Mídia"
},
"header": {
"logout": "Sair",
@@ -1095,6 +1096,17 @@
"themeSystem": "Sistema",
"hideHealthLogs": "Ocultar registros de verificação de integridade",
"hideHealthLogsDesc": "Quando ativado, suprime mensagens [HealthCheck] no console do servidor",
"themeAccent": "Cor do tema",
"themeAccentDesc": "Escolha uma cor predefinida ou crie seu próprio tema com uma cor",
"themeCreate": "Criar tema",
"themeCustom": "Tema personalizado",
"themeCoral": "Coral",
"themeBlue": "Azul",
"themeRed": "Vermelho",
"themeGreen": "Verde",
"themeViolet": "Violeta",
"themeOrange": "Laranja",
"themeCyan": "Ciano",
"promptCache": "Cache de prompt",
"flushCache": "Liberar cache",
"flushing": "Rubor…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute é fornecido \"como está\" sem qualquer tipo de garantia. Não somos responsáveis por quaisquer custos incorridos através do uso da API, interrupções de serviço ou perda de dados. Sempre mantenha backups de sua configuração.",
"termsSection6Title": "6. Código aberto",
"termsSection6Text": "OmniRoute é um software de código aberto. Você é livre para inspecioná-lo, modificá-lo e distribuí-lo sob os termos de sua licença."
},
"media": {
"title": "Playground de Mídia",
"subtitle": "Gere imagens, vídeos e música",
"model": "Model",
"prompt": "Prompt",
"generate": "Gerar",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Server deconectat",
"serverDisconnectedMsg": "Serverul proxy a fost oprit sau repornește.",
"expandSidebar": "Extinde bara laterală",
"collapseSidebar": "Restrângeți bara laterală"
"collapseSidebar": "Restrângeți bara laterală",
"media": "Media"
},
"header": {
"logout": "Deconectare",
@@ -1095,6 +1096,17 @@
"themeSystem": "Sistem",
"hideHealthLogs": "Ascundeți jurnalele de verificare a stării de sănătate",
"hideHealthLogsDesc": "Când este ACTIVAT, suprimați mesajele [HealthCheck] din consola serverului",
"themeAccent": "Culoarea temei",
"themeAccentDesc": "Alege o culoare presetată sau creează-ți propria temă cu o singură culoare",
"themeCreate": "Creează temă",
"themeCustom": "Temă personalizată",
"themeCoral": "Coral",
"themeBlue": "Albastru",
"themeRed": "Roșu",
"themeGreen": "Verde",
"themeViolet": "Violet",
"themeOrange": "Portocaliu",
"themeCyan": "Cian",
"promptCache": "Prompt Cache",
"flushCache": "Spălați memoria cache",
"flushing": "Spălare…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute este furnizat „ca atare”, fără garanții de niciun fel. Nu suntem responsabili pentru costurile suportate prin utilizarea API-ului, întreruperile serviciilor sau pierderea datelor. Păstrați întotdeauna copii de siguranță ale configurației dvs.",
"termsSection6Title": "6. Open Source",
"termsSection6Text": "OmniRoute este un software open-source. Sunteți liber să îl inspectați, să modificați și să îl distribuiți în conformitate cu termenii licenței sale."
},
"media": {
"title": "Studio media",
"subtitle": "Generează imagini, videoclipuri și muzică",
"model": "Model",
"prompt": "Prompt",
"generate": "Generează",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+50 -2
View File
@@ -88,7 +88,28 @@
"serverDisconnected": "Сервер отключен",
"serverDisconnectedMsg": "Прокси-сервер остановлен или перезагружается.",
"expandSidebar": "Развернуть боковую панель",
"collapseSidebar": "Свернуть боковую панель"
"collapseSidebar": "Свернуть боковую панель",
"themes": "Темы",
"presetColors": "Популярные цвета",
"createTheme": "Создать тему",
"chooseColor": "Выберите один цвет",
"themeCoral": "Коралловый",
"themeBlue": "Синий",
"themeRed": "Красный",
"themeGreen": "Зелёный",
"themeViolet": "Фиолетовый",
"themeOrange": "Оранжевый",
"themeCyan": "Голубой",
"media": "Медиа"
},
"themesPage": {
"title": "Темы",
"description": "Выбери готовую тему или создай свою из одного цвета",
"presetColors": "Популярные цвета",
"customTheme": "Своя тема",
"customThemeDesc": "Нажми создать тему и выбери один цвет",
"createTheme": "Создать тему",
"activePreset": "Активная тема"
},
"header": {
"logout": "Выход из системы",
@@ -110,7 +131,9 @@
"settings": "Настройки",
"settingsDescription": "Управляйте своими предпочтениями",
"openaiCompatible": "Совместимость с OpenAI",
"anthropicCompatible": "Антропная совместимость"
"anthropicCompatible": "Антропная совместимость",
"themes": "Темы",
"themesDescription": "Выберите цветовую тему для всей панели"
},
"home": {
"quickStart": "Быстрый старт",
@@ -1095,6 +1118,16 @@
"themeSystem": "Система",
"hideHealthLogs": "Скрыть журналы проверки работоспособности",
"hideHealthLogsDesc": "Если включено, подавлять сообщения [HealthCheck] в консоли сервера.",
"themeAccent": "Цвет темы",
"themeAccentDesc": "Выберите готовый цвет или создайте свою тему из одного цвета",
"themeCreate": "Создать тему",
"themeCustom": "Своя тема",
"themeBlue": "Синий",
"themeRed": "Красный",
"themeGreen": "Зелёный",
"themeViolet": "Фиолетовый",
"themeOrange": "Оранжевый",
"themeCyan": "Голубой",
"promptCache": "Подскажите кэш",
"flushCache": "Очистить кэш",
"flushing": "Промывка…",
@@ -2059,5 +2092,20 @@
"termsSection5Text": "OmniRoute предоставляется «как есть» без каких-либо гарантий. Мы не несем ответственности за любые расходы, понесенные в результате использования API, перебоев в обслуживании или потери данных. Всегда сохраняйте резервные копии вашей конфигурации.",
"termsSection6Title": "6. Открытый исходный код",
"termsSection6Text": "OmniRoute — это программное обеспечение с открытым исходным кодом. Вы можете свободно просматривать, изменять и распространять его в соответствии с условиями лицензии."
},
"media": {
"title": "Медиа-площадка",
"subtitle": "Генерируйте изображения, видео и музыку",
"model": "Model",
"prompt": "Prompt",
"generate": "Сгенерировать",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Server odpojený",
"serverDisconnectedMsg": "Proxy server bol zastavený alebo sa reštartuje.",
"expandSidebar": "Rozbaliť bočný panel",
"collapseSidebar": "Zbaliť bočný panel"
"collapseSidebar": "Zbaliť bočný panel",
"media": "Médiá"
},
"header": {
"logout": "Odhlásiť sa",
@@ -1095,6 +1096,17 @@
"themeSystem": "Systém",
"hideHealthLogs": "Skryť denníky kontroly stavu",
"hideHealthLogsDesc": "Keď je ZAPNUTÉ, potláčajte správy [HealthCheck] v konzole servera",
"themeAccent": "Farba témy",
"themeAccentDesc": "Vyberte prednastavenú farbu alebo si vytvorte vlastnú tému jednou farbou",
"themeCreate": "Vytvoriť tému",
"themeCustom": "Vlastná téma",
"themeCoral": "Koralový",
"themeBlue": "Modrá",
"themeRed": "Červená",
"themeGreen": "Zelená",
"themeViolet": "Fialová",
"themeOrange": "Oranžová",
"themeCyan": "Azúrová",
"promptCache": "Prompt Cache",
"flushCache": "Vyprázdniť vyrovnávaciu pamäť",
"flushing": "Splachovanie…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute sa poskytuje „tak ako je“ bez záruky akéhokoľvek druhu. Nezodpovedáme za žiadne náklady vzniknuté používaním API, prerušením služieb alebo stratou údajov. Vždy si zálohujte svoju konfiguráciu.",
"termsSection6Title": "6. Otvorený zdroj",
"termsSection6Text": "OmniRoute je softvér s otvoreným zdrojovým kódom. Môžete ho voľne kontrolovať, upravovať a distribuovať v súlade s podmienkami jeho licencie."
},
"media": {
"title": "Mediálne ihrisko",
"subtitle": "Generujte obrázky, videá a hudbu",
"model": "Model",
"prompt": "Prompt",
"generate": "Generovať",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Server frånkopplad",
"serverDisconnectedMsg": "Proxyservern har stoppats eller startar om.",
"expandSidebar": "Expandera sidofältet",
"collapseSidebar": "Dölj sidofältet"
"collapseSidebar": "Dölj sidofältet",
"media": "Media"
},
"header": {
"logout": "Logga ut",
@@ -1095,6 +1096,17 @@
"themeSystem": "System",
"hideHealthLogs": "Dölj loggar för hälsokontroll",
"hideHealthLogsDesc": "När PÅ, dämpa [HealthCheck]-meddelanden i serverkonsolen",
"themeAccent": "Temafärg",
"themeAccentDesc": "Välj en förinställd färg eller skapa ditt eget tema med en färg",
"themeCreate": "Skapa tema",
"themeCustom": "Anpassat tema",
"themeCoral": "Korall",
"themeBlue": "Blå",
"themeRed": "Röd",
"themeGreen": "Grön",
"themeViolet": "Violett",
"themeOrange": "Orange",
"themeCyan": "Cyan",
"promptCache": "Fråga Cache",
"flushCache": "Spola cachen",
"flushing": "Spolar...",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute tillhandahålls \"i befintligt skick\" utan garanti av något slag. Vi ansvarar inte för några kostnader som uppstår genom API-användning, tjänstavbrott eller dataförlust. Behåll alltid säkerhetskopior av din konfiguration.",
"termsSection6Title": "6. Öppen källkod",
"termsSection6Text": "OmniRoute är programvara med öppen källkod. Du är fri att inspektera, modifiera och distribuera den enligt villkoren i dess licens."
},
"media": {
"title": "Medialabb",
"subtitle": "Generera bilder, videor och musik",
"model": "Model",
"prompt": "Prompt",
"generate": "Generera",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "เซิร์ฟเวอร์ถูกตัดการเชื่อมต่อ",
"serverDisconnectedMsg": "พร็อกซีเซิร์ฟเวอร์ถูกหยุดหรือกำลังรีสตาร์ท",
"expandSidebar": "ขยายแถบด้านข้าง",
"collapseSidebar": "ยุบแถบด้านข้าง"
"collapseSidebar": "ยุบแถบด้านข้าง",
"media": "สื่อ"
},
"header": {
"logout": "ออกจากระบบ",
@@ -1095,6 +1096,17 @@
"themeSystem": "ระบบ",
"hideHealthLogs": "ซ่อนบันทึกการตรวจสุขภาพ",
"hideHealthLogsDesc": "เมื่อเปิด ให้ระงับข้อความ [HealthCheck] ในคอนโซลเซิร์ฟเวอร์",
"themeAccent": "สีธีม",
"themeAccentDesc": "เลือกสีสำเร็จรูปหรือสร้างธีมของคุณเองด้วยสีเดียว",
"themeCreate": "สร้างธีม",
"themeCustom": "ธีมกำหนดเอง",
"themeCoral": "คอรัล",
"themeBlue": "น้ำเงิน",
"themeRed": "แดง",
"themeGreen": "เขียว",
"themeViolet": "ม่วง",
"themeOrange": "ส้ม",
"themeCyan": "ไซแอน",
"promptCache": "แคชพร้อมท์",
"flushCache": "ล้างแคช",
"flushing": "กำลังฟลัชชิง…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute มีให้ \"ตามสภาพ\" โดยไม่มีการรับประกันใดๆ เราจะไม่รับผิดชอบต่อค่าใช้จ่ายใดๆ ที่เกิดขึ้นจากการใช้ API การหยุดชะงักของบริการ หรือการสูญหายของข้อมูล สำรองข้อมูลการกำหนดค่าของคุณไว้เสมอ",
"termsSection6Title": "6. โอเพ่นซอร์ส",
"termsSection6Text": "OmniRoute เป็นซอฟต์แวร์โอเพ่นซอร์ส คุณมีอิสระที่จะตรวจสอบ แก้ไข และแจกจ่ายภายใต้เงื่อนไขของใบอนุญาต"
},
"media": {
"title": "สนามทดลองสื่อ",
"subtitle": "สร้างภาพ วิดีโอ และเพลง",
"model": "Model",
"prompt": "Prompt",
"generate": "สร้าง",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Сервер відключено",
"serverDisconnectedMsg": "Проксі-сервер зупинено або перезавантажується.",
"expandSidebar": "Розгорнути бічну панель",
"collapseSidebar": "Згорнути бічну панель"
"collapseSidebar": "Згорнути бічну панель",
"media": "Медіа"
},
"header": {
"logout": "Вийти",
@@ -1095,6 +1096,17 @@
"themeSystem": "система",
"hideHealthLogs": "Приховати журнали перевірки справності",
"hideHealthLogsDesc": "Коли ввімкнено, блокувати повідомлення [HealthCheck] на консолі сервера",
"themeAccent": "Колір теми",
"themeAccentDesc": "Оберіть готовий колір або створіть власну тему з одного кольору",
"themeCreate": "Створити тему",
"themeCustom": "Користувацька тема",
"themeCoral": "Кораловий",
"themeBlue": "Синій",
"themeRed": "Червоний",
"themeGreen": "Зелений",
"themeViolet": "Фіолетовий",
"themeOrange": "Помаранчевий",
"themeCyan": "Ціан",
"promptCache": "Кеш підказок",
"flushCache": "Очистити кеш",
"flushing": "Промивання…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute надається «як є» без будь-яких гарантій. Ми не несемо відповідальності за будь-які витрати, пов’язані з використанням API, перебоями в роботі служби або втратою даних. Завжди створюйте резервні копії вашої конфігурації.",
"termsSection6Title": "6. Відкритий код",
"termsSection6Text": "OmniRoute — це програмне забезпечення з відкритим кодом. Ви можете вільно перевіряти, змінювати та поширювати його відповідно до умов його ліцензії."
},
"media": {
"title": "Медіа-майданчик",
"subtitle": "Генеруйте зображення, відео та музику",
"model": "Model",
"prompt": "Prompt",
"generate": "Згенерувати",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "Máy chủ bị ngắt kết nối",
"serverDisconnectedMsg": "Máy chủ proxy đã bị dừng hoặc đang khởi động lại.",
"expandSidebar": "Mở rộng thanh bên",
"collapseSidebar": "Thu gọn thanh bên"
"collapseSidebar": "Thu gọn thanh bên",
"media": "Phương tiện"
},
"header": {
"logout": "Đăng xuất",
@@ -1095,6 +1096,17 @@
"themeSystem": "Hệ thống",
"hideHealthLogs": "Ẩn nhật ký kiểm tra sức khỏe",
"hideHealthLogsDesc": "Khi BẬT, hãy chặn thông báo [HealthCheck] trong bảng điều khiển máy chủ",
"themeAccent": "Màu chủ đề",
"themeAccentDesc": "Chọn màu đặt sẵn hoặc tạo chủ đề của riêng bạn bằng một màu",
"themeCreate": "Tạo chủ đề",
"themeCustom": "Chủ đề tùy chỉnh",
"themeCoral": "San hô",
"themeBlue": "Xanh dương",
"themeRed": "Đỏ",
"themeGreen": "Xanh lá",
"themeViolet": "Tím",
"themeOrange": "Cam",
"themeCyan": "Lục lam",
"promptCache": "Bộ nhớ đệm nhắc nhở",
"flushCache": "Xóa bộ nhớ đệm",
"flushing": "Đang xả…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute được cung cấp \"nguyên trạng\" mà không có bất kỳ hình thức bảo hành nào. Chúng tôi không chịu trách nhiệm về bất kỳ chi phí nào phát sinh do sử dụng API, gián đoạn dịch vụ hoặc mất dữ liệu. Luôn duy trì bản sao lưu cấu hình của bạn.",
"termsSection6Title": "6. Nguồn mở",
"termsSection6Text": "OmniRoute là phần mềm mã nguồn mở. Bạn có thể tự do kiểm tra, sửa đổi và phân phối nó theo các điều khoản trong giấy phép."
},
"media": {
"title": "Sân chơi phương tiện",
"subtitle": "Tạo hình ảnh, video và âm nhạc",
"model": "Model",
"prompt": "Prompt",
"generate": "Tạo",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+28 -1
View File
@@ -88,7 +88,8 @@
"serverDisconnected": "服务器已断开连接",
"serverDisconnectedMsg": "代理服务器已停止或正在重新启动。",
"expandSidebar": "展开侧边栏",
"collapseSidebar": "折叠侧边栏"
"collapseSidebar": "折叠侧边栏",
"media": "媒体"
},
"header": {
"logout": "退出",
@@ -1095,6 +1096,17 @@
"themeSystem": "系统",
"hideHealthLogs": "隐藏健康检查日志",
"hideHealthLogsDesc": "当打开时,抑制服务器控制台中的 [HealthCheck] 消息",
"themeAccent": "主题颜色",
"themeAccentDesc": "选择预设颜色,或使用单一颜色创建你自己的主题",
"themeCreate": "创建主题",
"themeCustom": "自定义主题",
"themeCoral": "珊瑚色",
"themeBlue": "蓝色",
"themeRed": "红色",
"themeGreen": "绿色",
"themeViolet": "紫色",
"themeOrange": "橙色",
"themeCyan": "青色",
"promptCache": "提示缓存",
"flushCache": "刷新缓存",
"flushing": "法拉盛…",
@@ -2059,5 +2071,20 @@
"termsSection5Text": "OmniRoute 按“原样”提供,不提供任何形式的保证。我们不对因 API 使用、服务中断或数据丢失而产生的任何费用负责。始终维护配置的备份。",
"termsSection6Title": "6. 开源",
"termsSection6Text": "OmniRoute 是开源软件。您可以根据其许可条款自由检查、修改和分发它。"
},
"media": {
"title": "媒体工作台",
"subtitle": "生成图像、视频和音乐",
"model": "Model",
"prompt": "Prompt",
"generate": "生成",
"generating": "Generating...",
"loadingModels": "Loading available models...",
"noModels": "No models available. Configure providers with media capabilities first.",
"error": "Generation Failed",
"result": "Result",
"imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
"videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
"musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
}
}
+1
View File
@@ -90,6 +90,7 @@ function usePageInfo(pathname: string | null) {
return { title: t("endpoint"), description: t("endpointDescription"), breadcrumbs: [] };
if (pathname.includes("/profile"))
return { title: t("settings"), description: t("settingsDescription"), breadcrumbs: [] };
// Note: /themes page removed theme settings live in /settings → AppearanceTab
return { title: "", description: "", breadcrumbs: [] };
}
-1
View File
@@ -11,7 +11,6 @@ import Button from "./Button";
import { ConfirmModal } from "./Modal";
import CloudSyncStatus from "./CloudSyncStatus";
import { useTranslations } from "next-intl";
// Nav items use i18n keys resolved inside the component
const navItemDefs = [
{ href: "/dashboard", i18nKey: "home", icon: "home", exact: true },
+10
View File
@@ -528,6 +528,16 @@ export const DEFAULT_PRICING = {
"qwen/qwen3-32b": { input: 0, output: 0, cached: 0, reasoning: 0, cache_creation: 0 },
},
// Blackbox AI
blackbox: {
"gpt-4o": { input: 0, output: 0, cached: 0, reasoning: 0, cache_creation: 0 },
"gemini-2.5-flash": { input: 0, output: 0, cached: 0, reasoning: 0, cache_creation: 0 },
"claude-sonnet-4": { input: 0, output: 0, cached: 0, reasoning: 0, cache_creation: 0 },
"deepseek-v3": { input: 0, output: 0, cached: 0, reasoning: 0, cache_creation: 0 },
blackboxai: { input: 0, output: 0, cached: 0, reasoning: 0, cache_creation: 0 },
"blackboxai-pro": { input: 0, output: 0, cached: 0, reasoning: 0, cache_creation: 0 },
},
// Fireworks
fireworks: {
"accounts/fireworks/models/gpt-oss-120b": {
+9
View File
@@ -145,6 +145,15 @@ export const APIKEY_PROVIDERS = {
textIcon: "GQ",
website: "https://groq.com",
},
blackbox: {
id: "blackbox",
alias: "bb",
name: "Blackbox AI",
icon: "view_in_ar",
color: "#1A1A2E",
textIcon: "BB",
website: "https://blackbox.ai",
},
xai: {
id: "xai",
alias: "xai",
+68 -3
View File
@@ -6,7 +6,11 @@ import { THEME_CONFIG } from "@/shared/constants/config";
interface ThemeState {
theme: string;
colorTheme: string;
customColor: string;
setTheme: (theme: string) => void;
setColorTheme: (colorTheme: string) => void;
setCustomColorTheme: (color: string) => void;
toggleTheme: () => void;
initTheme: () => void;
}
@@ -15,12 +19,25 @@ const useThemeStore = create<ThemeState>()(
persist(
(set, get) => ({
theme: THEME_CONFIG.defaultTheme,
colorTheme: "coral",
customColor: "#3b82f6",
setTheme: (theme) => {
set({ theme });
applyTheme(theme);
},
setColorTheme: (colorTheme) => {
set({ colorTheme });
applyColorTheme(colorTheme, get().customColor);
},
setCustomColorTheme: (color) => {
const normalized = normalizeHexColor(color);
set({ colorTheme: "custom", customColor: normalized });
applyColorTheme("custom", normalized);
},
toggleTheme: () => {
const currentTheme = get().theme;
const newTheme = currentTheme === "dark" ? "light" : "dark";
@@ -29,8 +46,9 @@ const useThemeStore = create<ThemeState>()(
},
initTheme: () => {
const theme = get().theme;
const { theme, colorTheme, customColor } = get();
applyTheme(theme);
applyColorTheme(colorTheme, customColor);
},
}),
{
@@ -39,13 +57,22 @@ const useThemeStore = create<ThemeState>()(
)
);
// Apply theme to document
export const COLOR_THEMES: Record<string, string> = {
coral: "#e54d5e",
blue: "#3b82f6",
red: "#ef4444",
green: "#22c55e",
violet: "#8b5cf6",
orange: "#f97316",
cyan: "#06b6d4",
};
// Apply light/dark theme to document
function applyTheme(theme: string) {
if (typeof window === "undefined") return;
const root = document.documentElement;
const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
const effectiveTheme = theme === "system" ? systemTheme : theme;
if (effectiveTheme === "dark") {
@@ -55,4 +82,42 @@ function applyTheme(theme: string) {
}
}
function applyColorTheme(colorTheme: string, customColor: string) {
if (typeof window === "undefined") return;
const root = document.documentElement;
const baseColor =
colorTheme === "custom"
? normalizeHexColor(customColor)
: COLOR_THEMES[colorTheme] || COLOR_THEMES.coral;
const hoverColor = shadeHexColor(baseColor, -0.14);
root.style.setProperty("--color-primary", baseColor);
root.style.setProperty("--color-primary-hover", hoverColor);
}
function normalizeHexColor(color: string) {
const value = (color || "").trim();
const hex = value.startsWith("#") ? value : `#${value}`;
const valid = /^#([0-9a-fA-F]{6})$/.test(hex);
return valid ? hex.toLowerCase() : "#3b82f6";
}
function shadeHexColor(hex: string, percent: number) {
const normalized = normalizeHexColor(hex).slice(1);
const r = parseInt(normalized.slice(0, 2), 16);
const g = parseInt(normalized.slice(2, 4), 16);
const b = parseInt(normalized.slice(4, 6), 16);
const shade = (channel: number) => {
const target = percent < 0 ? 0 : 255;
const amount = Math.round((target - channel) * Math.abs(percent));
const next = percent < 0 ? channel - amount : channel + amount;
return Math.max(0, Math.min(255, next));
};
const toHex = (channel: number) => channel.toString(16).padStart(2, "0");
return `#${toHex(shade(r))}${toHex(shade(g))}${toHex(shade(b))}`;
}
export default useThemeStore;