forked from retoor/devplacepy
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:
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user