feat: add embeddings endpoint and config for OpenAI-compatible text embeddings via gateway

Add POST /openai/v1/embeddings route in openai_gateway router, new config fields for embedding upstream URL/model/key/enabled toggle with defaults pointing to OpenRouter Qwen3 8B, INTERNAL_EMBED_MODEL constant in config.py, documentation in docs_api.py and README.md describing the molodetz~embed model mapping, and embed-call tracking in gateway metrics alongside existing chat/vision counters.
This commit is contained in:
2026-06-14 01:06:18 +00:00
parent 1076696dec
commit c7770ee21a
17 changed files with 662 additions and 62 deletions
+1
View File
@@ -543,6 +543,7 @@ img {
.topnav-right { margin-left: auto; display: flex; align-items: center; gap: 1rem; flex-shrink: 0; }
.topnav-icon { position: relative; padding: 0.375rem; color: var(--text-secondary); font-size: 1.25rem; background: none; border: none; cursor: pointer; font-family: inherit; line-height: 1; }
.topnav-icon:hover { color: var(--text-primary); }
.topnav-icon.active { color: var(--accent); }
.nav-badge {
position: absolute; top: 0; right: 0; z-index: 1; min-width: 16px; height: 16px;
padding: 0 0.25rem; border-radius: 8px; background: var(--accent); color: var(--white);
+61 -7
View File
@@ -1,10 +1,57 @@
/* retoor <retoor@molodetz.nl> */
.tools-page,
.seo-tool {
.tools-page {
max-width: 920px;
margin: 0 auto;
padding: 1.5rem 1rem 3rem;
padding: var(--space-xl) var(--space-lg) var(--space-2xl);
}
.seo-layout {
display: grid;
grid-template-columns: var(--sidebar-width) 1fr;
gap: var(--space-xl);
align-items: start;
}
.seo-main {
min-width: 0;
}
.seo-side-list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: var(--space-sm);
font-size: 0.8125rem;
color: var(--text-secondary);
line-height: 1.5;
}
.seo-side-list li {
padding-left: var(--space-md);
position: relative;
}
.seo-side-list li::before {
content: "";
position: absolute;
left: 0;
top: 0.55em;
width: 5px;
height: 5px;
border-radius: 50%;
background: var(--accent);
}
.seo-form-card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-sm);
padding: var(--space-xl);
margin-bottom: var(--space-xl);
}
.tools-header h1,
@@ -44,10 +91,6 @@
.tool-card-name { font-weight: 600; color: var(--text-primary); }
.tool-card-desc { font-size: 0.8125rem; color: var(--text-secondary); }
.seo-form {
margin-bottom: 1.5rem;
}
.seo-form-row {
display: flex;
flex-wrap: wrap;
@@ -275,6 +318,17 @@
.seo-report-target { color: var(--text-muted); word-break: break-all; }
@media (max-width: 1024px) {
.seo-layout {
grid-template-columns: 1fr;
}
}
@media (max-width: 600px) {
.seo-form-card { padding: var(--space-lg); }
.seo-form-row { flex-direction: column; align-items: stretch; }
.seo-input[type="url"] { flex: 1 1 auto; }
.seo-pages { justify-content: space-between; }
.seo-run-btn { width: 100%; }
.seo-score-card { flex-direction: column; align-items: flex-start; }
}