Skip to content
Open
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
42 changes: 42 additions & 0 deletions astrbot/core/config/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -1739,6 +1739,48 @@ class ChatProviderTemplate(TypedDict):
"timeout": 20,
"proxy": "",
},
"Zhipu Embedding": {
"id": "zhipu_embedding",
"type": "openai_embedding",
"provider": "zhipu",
"provider_type": "embedding",
"hint": "provider_group.provider.zhipu_embedding.hint",
"enable": True,
"embedding_api_key": "",
"embedding_api_base": "https://open.bigmodel.cn/api/paas/v4",
"embedding_model": "embedding-3",
"embedding_dimensions": 2048,
"timeout": 20,
"proxy": "",
},
"Volcengine Embedding": {
"id": "volcengine_embedding",
"type": "openai_embedding",
"provider": "volcengine",
"provider_type": "embedding",
"hint": "provider_group.provider.volcengine_embedding.hint",
"enable": True,
"embedding_api_key": "",
"embedding_api_base": "https://ark.cn-beijing.volces.com/api/v3",
"embedding_model": "doubao-embedding-vision",
"embedding_dimensions": 2048,
"timeout": 20,
"proxy": "",
},
"Ollama Embedding": {
"id": "ollama_embedding",
"type": "openai_embedding",
"provider": "ollama",
"provider_type": "embedding",
"hint": "provider_group.provider.ollama_embedding.hint",
"enable": True,
"embedding_api_key": "ollama",
"embedding_api_base": "http://127.0.0.1:11434",
"embedding_model": "embeddinggemma",
"embedding_dimensions": 768,
"timeout": 20,
"proxy": "",
},
"Gemini Embedding": {
"id": "gemini_embedding",
"type": "gemini_embedding",
Expand Down
24 changes: 18 additions & 6 deletions astrbot/core/provider/sources/openai_embedding_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,35 @@ def __init__(self, provider_config: dict, provider_settings: dict) -> None:
self.provider_settings = provider_settings
proxy = provider_config.get("proxy", "")
provider_id = provider_config.get("id", "unknown_id")
http_client = None
self._http_client = None
if proxy:
logger.info(f"[OpenAI Embedding] {provider_id} Using proxy: {proxy}")
http_client = httpx.AsyncClient(proxy=proxy)
self._http_client = httpx.AsyncClient(proxy=proxy)
# 处理 API base URL:带路径的地址保持原样,纯域名自动补 /v1
from urllib.parse import urlsplit

api_base = (
provider_config.get("embedding_api_base", "https://api.openai.com/v1")
.strip()
.removesuffix("/")
.removesuffix("/embeddings")
)
if api_base and not api_base.endswith("/v1") and not api_base.endswith("/v4"):
# /v4 see #5699
api_base = api_base + "/v1"
if api_base:
parsed = urlsplit(api_base)
# 无 scheme 时 urlsplit 会把 host 当 path,需要补上 scheme
if not parsed.scheme:
api_base = f"https://{api_base}"
parsed = urlsplit(api_base)
# 只在纯域名(无路径或只有 /)时追加 /v1,带路径的地址保持原样
# 这样智谱 /api/paas/v4、火山 /api/v3 等不会被破坏
if not parsed.path or parsed.path == "/":
api_base = f"{api_base}/v1"
logger.info(f"[OpenAI Embedding] {provider_id} Using API Base: {api_base}")
self.client = AsyncOpenAI(
api_key=provider_config.get("embedding_api_key"),
base_url=api_base,
timeout=int(provider_config.get("timeout", 20)),
http_client=http_client,
http_client=self._http_client,
)
self.model = provider_config.get("embedding_model", "text-embedding-3-small")

Expand Down Expand Up @@ -88,3 +98,5 @@ def get_dim(self) -> int:
async def terminate(self):
if self.client:
await self.client.close()
if self._http_client:
await self._http_client.aclose()
11 changes: 6 additions & 5 deletions dashboard/src/components/shared/AstrBotConfig.vue
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ const providerHint = computed(() => {
const hint = props.iterable?.hint
if (typeof hint !== 'string' || !hint) return ''

if (
hint === 'provider_group.provider.openai_embedding.hint'
|| hint === 'provider_group.provider.gemini_embedding.hint'
) {
return ''
// Embedding 类型的提示在 embedding_api_base 字段旁边显示,不在卡片标题处重复显示
if (hint.startsWith('provider_group.provider.') && hint.endsWith('.hint')) {
const providerKey = hint.slice('provider_group.provider.'.length, -'.hint'.length)
const embeddingTypes = ['openai_embedding', 'gemini_embedding', 'zhipu_embedding', 'volcengine_embedding', 'ollama_embedding']
if (embeddingTypes.includes(providerKey)) return ''
}

return hint
Expand All @@ -67,6 +67,7 @@ const getItemHint = (itemKey, itemMeta) => {

if (itemKey !== 'embedding_api_base') return ''

// 所有 openai_embedding 类型的预设(包括智谱、火山、Ollama)共享 openai_embedding 的提示
const providerType = props.iterable?.type
if (providerType === 'openai_embedding') {
return getRaw('provider_group.provider.openai_embedding.hint')
Expand Down
11 changes: 10 additions & 1 deletion dashboard/src/i18n/locales/en-US/features/config-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -1237,7 +1237,16 @@
"description": "API Base URL"
},
"openai_embedding": {
"hint": "If testing fails, try adding /v1 at the end to be compatible with some OpenAI API versions."
"hint": "For OpenAI and compatible embedding services. AstrBot appends /v1 only when the API Base URL has no path; URLs with paths (e.g. /api/paas/v4, /api/v3) are preserved as-is."
},
"zhipu_embedding": {
"hint": "Zhipu preset defaults to https://open.bigmodel.cn/api/paas/v4 and embedding-3, preserving the /api/paas/v4 path."
},
"volcengine_embedding": {
"hint": "Volcengine preset defaults to https://ark.cn-beijing.volces.com/api/v3 and doubao-embedding-vision, preserving the /api/v3 path."
},
"ollama_embedding": {
"hint": "Ollama preset defaults to local http://127.0.0.1:11434, model embeddinggemma, and 768 dimensions. Run ollama pull embeddinggemma before use."
},
"gemini_embedding": {
"hint": "Gemini Embedding does not require manually adding /v1beta."
Expand Down
11 changes: 10 additions & 1 deletion dashboard/src/i18n/locales/ru-RU/features/config-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -1234,7 +1234,16 @@
"description": "Адрес прокси-сервера"
},
"openai_embedding": {
"hint": "Если тест не проходит, попробуйте добавить /v1 в конец embedding_api_base для совместимости с некоторыми версиями OpenAI API."
"hint": "Для OpenAI и совместимых embedding-сервисов. AstrBot добавляет /v1 только если API Base URL не содержит пути; URL с путями (например /api/paas/v4, /api/v3) сохраняются без изменений."
},
"zhipu_embedding": {
"hint": "Пресет Zhipu: https://open.bigmodel.cn/api/paas/v4 и embedding-3, путь /api/paas/v4 сохраняется."
},
"volcengine_embedding": {
"hint": "Пресет Volcengine: https://ark.cn-beijing.volces.com/api/v3 и doubao-embedding-vision, путь /api/v3 сохраняется."
},
"ollama_embedding": {
"hint": "Пресет Ollama: локальный http://127.0.0.1:11434, модель embeddinggemma, 768 измерений. Перед использованием выполните ollama pull embeddinggemma."
},
"gemini_embedding": {
"hint": "Gemini Embedding не требует ручного добавления /v1beta."
Expand Down
11 changes: 10 additions & 1 deletion dashboard/src/i18n/locales/zh-CN/features/config-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -1239,7 +1239,16 @@
"description": "API Base URL"
},
"openai_embedding": {
"hint": "如果测试不通过,可以尝试添加 /v1 在末尾以兼容部分 OpenAI API 版本。"
"hint": "适用于 OpenAI 及兼容其 API 的嵌入服务。纯域名地址会自动补 /v1;带路径的地址(如 /api/paas/v4)保持原样。"
},
"zhipu_embedding": {
"hint": "智谱 Embedding 预设,默认使用 https://open.bigmodel.cn/api/paas/v4 和 embedding-3 模型。"
},
"volcengine_embedding": {
"hint": "火山引擎 Embedding 预设,默认使用 https://ark.cn-beijing.volces.com/api/v3 和 doubao-embedding-vision 模型。"
},
"ollama_embedding": {
"hint": "Ollama Embedding 预设,默认指向本地 http://127.0.0.1:11434,模型 embeddinggemma,维度 768。使用前请先运行 ollama pull embeddinggemma。"
},
"gemini_embedding": {
"hint": "Gemini Embedding 无需手动添加 /v1beta。"
Expand Down
4 changes: 3 additions & 1 deletion docs/en/use/knowledge-base.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@

Open the service provider page, click "Add Service Provider", and select Embedding.

Currently, AstrBot supports embedding vector services compatible with OpenAI API and Gemini API.
Currently, AstrBot includes built-in presets for OpenAI Embedding, Zhipu Embedding, Volcengine Embedding, Ollama Embedding, and Gemini Embedding.

To connect other OpenAI-compatible embedding services, use the OpenAI Embedding preset. When `embedding api base` only contains the host, AstrBot automatically appends `/v1`. If the URL already contains a path (e.g., Zhipu `/api/paas/v4` or Volcengine `/api/v3`), AstrBot preserves that path as-is.

Click on the provider card above to enter the configuration page and fill in the configuration.

Expand Down
4 changes: 3 additions & 1 deletion docs/zh/use/knowledge-base.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@

打开服务提供商页面,点击新增服务提供商,选择 Embedding。

目前 AstrBot 支持兼容 OpenAI API 和 Gemini API 的嵌入向量服务。
目前 AstrBot 内置了 OpenAI Embedding、智谱 Embedding、火山引擎 Embedding、Ollama Embedding 和 Gemini Embedding 预设。

如果需要接入其他兼容 OpenAI API 的嵌入服务,使用 OpenAI Embedding 预设即可。当 `embedding api base` 只填写域名时,AstrBot 会自动补上 `/v1`;如果填写的是带路径的地址(例如智谱的 `/api/paas/v4` 或火山引擎的 `/api/v3`),AstrBot 会保持原样。

点击上面的提供商卡片进入配置页面,填写配置。

Expand Down
Loading