Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: 1.26.1
go-version: 1.26.2
cache: true

- name: Run GoReleaser
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ concurrency:
cancel-in-progress: true

env:
GO_VERSION: "1.26.1"
GO_VERSION: "1.26.2"

# Restrict token permissions to minimum required
permissions:
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Guidance for AI models (like Claude) working with this codebase.

**GOModel** is a high-performance AI gateway in Go that routes requests to multiple AI model providers (OpenAI, Anthropic, Gemini, Groq, xAI, Oracle, Ollama). LiteLLM killer.

**Go:** 1.26.1
**Go:** 1.26.2
**Repo:** https://github.com/ENTERPILOT/GOModel

- **Stage:** Development - backward compatibility is not a concern
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Build stage — run on the build host's native arch for speed, cross-compile for target
FROM --platform=$BUILDPLATFORM golang:1.26.1-alpine3.23 AS builder
FROM --platform=$BUILDPLATFORM golang:1.26.2-alpine3.23 AS builder

ARG TARGETOS
ARG TARGETARCH
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ Example model identifiers are illustrative and subject to change; consult provid

### Running from Source

**Prerequisites:** Go 1.26+
**Prerequisites:** Go 1.26.2+

1. Create a `.env` file:

Expand Down
2 changes: 1 addition & 1 deletion docs/2026-03-23_benchmark_scripts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ gateway in the middle.

## Prerequisites

- Go 1.26+
- Go 1.26.2+
- Python 3.10+
- `hey`
- `litellm`
Expand Down
2 changes: 1 addition & 1 deletion docs/about/benchmarks.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ All the tooling used in the published benchmark is available in this repository.

### Prerequisites

- Go 1.26+
- Go 1.26.2+
- Python 3.10+ with `matplotlib` and `numpy`
- `jq`, `curl`
- A Groq API key (or any OpenAI-compatible provider — adjust the script)
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module gomodel

go 1.26.1
go 1.26.2

require (
github.com/andybalholm/brotli v1.2.1
Expand Down
215 changes: 201 additions & 14 deletions internal/admin/dashboard/static/css/dashboard.css
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,10 @@

* { box-sizing: border-box; margin: 0; padding: 0; }

[x-cloak] {
display: none !important;
}

body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: var(--bg);
Expand Down Expand Up @@ -193,29 +197,169 @@ body {
border-top: 1px solid var(--border);
}

.api-key-section label {
display: block;
font-size: 11px;
.api-key-section {
display: grid;
gap: 8px;
}

.api-key-open-btn {
width: 100%;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 8px 10px;
background: transparent;
border: 1px solid var(--accent);
border-radius: var(--radius);
color: var(--accent);
font-size: 13px;
font-family: inherit;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
cursor: pointer;
transition: background-color 0.15s, border-color 0.15s;
}

.api-key-open-icon {
width: 15px;
height: 15px;
flex: 0 0 15px;
}

.api-key-open-btn:hover {
background: color-mix(in srgb, var(--accent) 10%, transparent);
border-color: color-mix(in srgb, var(--accent) 78%, var(--text));
color: color-mix(in srgb, var(--accent) 78%, var(--text));
}

.api-key-open-btn:focus-visible {
outline: 2px solid color-mix(in srgb, var(--accent) 36%, transparent);
outline-offset: 2px;
}

.auth-dialog-backdrop {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.48);
z-index: 80;
}

.auth-dialog-shell {
position: fixed;
inset: 0;
z-index: 90;
display: grid;
place-items: center;
padding: 20px;
}

.auth-dialog {
width: min(440px, 100%);
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 24px 70px rgba(0, 0, 0, 0.38);
padding: 22px;
}

.auth-dialog-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
margin-bottom: 12px;
}

.auth-dialog h2 {
font-size: 22px;
line-height: 1.2;
margin-top: 2px;
}

.auth-dialog-close {
display: inline-flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
background: var(--bg);
border: 1px solid var(--border);
border-radius: 6px;
color: var(--text-muted);
margin-bottom: 6px;
cursor: pointer;
font: inherit;
line-height: 1;
}

.auth-dialog-close:hover {
color: var(--text);
background: var(--bg-surface-hover);
}

.auth-dialog-hint {
color: var(--text-muted);
font-size: 13px;
}

.api-key-section input {
.auth-dialog-error {
color: var(--danger);
font-size: 13px;
font-weight: 600;
}

.auth-dialog-form {
display: grid;
gap: 10px;
margin-top: 18px;
}

.auth-dialog-input-shell {
position: relative;
}

.auth-dialog-input-icon {
position: absolute;
left: 12px;
top: 50%;
width: 16px;
height: 16px;
color: var(--text-muted);
pointer-events: none;
transform: translateY(-50%);
}

.auth-dialog-input-shell:focus-within .auth-dialog-input-icon {
color: var(--accent);
}

.auth-dialog-input {
width: 100%;
padding: 8px 10px;
padding: 11px 12px 11px 38px;
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius);
color: var(--text);
font-size: 13px;
font-size: 14px;
font-family: inherit;
outline: none;
}

.api-key-section input:focus {
.auth-dialog-input:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);
}

.auth-dialog-submit-icon {
width: 16px;
height: 16px;
flex: 0 0 16px;
}

.auth-dialog-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 8px;
}

/* Theme toggle — compact pill */
Expand Down Expand Up @@ -1083,6 +1227,14 @@ body {
flex-wrap: wrap;
}

.auth-banner {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
}

/* Table */
.table-toolbar {
display: flex;
Expand Down Expand Up @@ -2000,8 +2152,18 @@ td.col-price {
}

.usage-log-select {
padding: 8px 12px;
background: var(--bg);
appearance: none;
-webkit-appearance: none;
padding: 8px 34px 8px 12px;
background-color: var(--bg);
background-image:
linear-gradient(45deg, transparent 50%, currentcolor 50%),
linear-gradient(135deg, currentcolor 50%, transparent 50%);
background-position:
calc(100% - 17px) 50%,
calc(100% - 12px) 50%;
background-repeat: no-repeat;
background-size: 5px 5px;
border: 1px solid var(--border);
border-radius: var(--radius);
color: var(--text);
Expand All @@ -2012,6 +2174,11 @@ td.col-price {
min-width: 140px;
}

.usage-log-select:disabled {
cursor: default;
opacity: 0.65;
}

.usage-log-select:focus {
border-color: var(--accent);
}
Expand Down Expand Up @@ -3188,12 +3355,32 @@ body.conversation-drawer-open {
.sidebar-header h1, .badge { display: none; }
.sidebar-nav .nav-item { justify-content: center; padding: 10px; }
.sidebar-nav .nav-item span { display: none; }
.sidebar-footer { padding: 8px; }
.sidebar-footer .api-key-section { display: none; }
.sidebar-footer { display: grid; gap: 8px; padding: 8px; }
.sidebar-footer .api-key-section { display: grid; }
.sidebar.sidebar-collapsed .sidebar-footer .api-key-section { display: grid; }
.sidebar-footer .api-key-open-btn {
width: 36px;
height: 36px;
min-height: 36px;
justify-self: center;
padding: 0;
}
.sidebar-footer .api-key-open-btn span {
display: none;
}
.sidebar-footer .api-key-open-icon {
width: 16px;
height: 16px;
flex-basis: 16px;
}
.sidebar-footer .theme-toggle { display: none; }
.sidebar-footer .theme-toggle-mobile { display: flex; margin: 0 auto; }
.sidebar-toggle { display: none; }
.content { width: 100%; margin: 0 auto; padding: 20px; }
.auth-dialog-shell { align-items: end; padding: 12px; }
.auth-dialog { padding: 18px; }
.auth-dialog-actions { flex-direction: column-reverse; }
.auth-dialog-actions .pagination-btn { width: 100%; }
.cards { grid-template-columns: repeat(2, 1fr); }

.provider-status-flag {
Expand Down
Loading
Loading