Add dedicated VLM model configuration and wire it through multi-tenant VLM creation - #10

Merged
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration
Dec 15, 2025
Merged

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation#10
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration

Conversation

CopilotAI commented Dec 15, 2025

Copy link
Copy Markdown
Contributor

VLM model choice was hardcoded and tied to the text LLM model, preventing .env configuration and clear LLM/VLM separation.

  • Configuration
    • Added required vlm_model to LLMConfig via VLM_MODEL (no fallback defaults).
    • Added optional VLM_API_KEY and VLM_BASE_URL for vendor-independent VLM access; falls back to LLM credentials only when VLM-specific values are absent.
    • Preserved vlm_timeout.
  • Multi-tenant behavior
    • Vision model creation now uses the dedicated VLM model and supports VLM-specific key/base URL with consistent fallback.
    • Tenant config merge includes VLM model/key/base URL to allow per-tenant overrides.
  • Environment template
    • Introduced VLM_MODEL as mandatory and documented optional VLM_API_KEY/VLM_BASE_URL in env.example to expose VLM selection and vendor choice.

Example:

# .envVLM_MODEL=seed-1-6-250615# required, independent from LLM_MODEL# VLM_API_KEY=...# VLM_BASE_URL=...# runtime config usageconfig.llm.vlm_model# used for vision model callsconfig.llm.vlm_base_url# VLM-specific endpoint when provided
Original prompt

This section details on the original issue you should resolve

<issue_title>VLM模型配置混乱,硬编码与.env配置不一致</issue_title>
<issue_description>## 问题

  1. LLM_MODEL 在 .env 中配置为 Tongyi-Zhiwen/QwenLong-L1-32B(纯文本模型)
  2. 实际 VLM 模型硬编码在代码中为 seed-1-6-250615(多模态模型)
  3. 没有在 .env 中提供 VLM_MODEL 配置选项

影响

  • 用户无法在 .env 中配置 VLM 模型
  • LLM 和 VLM 的区别不明显,容易混淆
  • 不符合多租户配置的"配置即代码"原则

代码位置

  • /src/multi_tenant.py 第276-369行:VLM 函数硬编码使用 LLM 配置中的模型
  • /src/config.py:缺少 VLM_MODEL 配置字段
  • .env 第17行:只有 LLM_MODEL,没有 VLM_MODEL

建议修复

  1. .env 中添加独立的 VLM_MODEL 配置项
  2. 在 config.py 中为 LLMConfig 添加 vlm_model 字段
  3. 更新多租户实例创建逻辑,使用 vlm_model 而不是 llm 的 model</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
CopilotAI changed the title [WIP] Add VLM model configuration to .env and codeAdd dedicated VLM model configuration and wire it through multi-tenant VLM creationDec 15, 2025
CopilotAI requested a review from BukeLyDecember 15, 2025 09:46

@BukeLyBukeLy left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

按照Comment的来改进

Comment threadsrc/config.py Outdated
api_key: str = Field(..., description="LLM API Key")
base_url: str = Field(..., description="LLM API Base URL")
model: str = Field(default="seed-1-6-250615", description="LLM Model Name")
vlm_model: str = Field(default="seed-1-6-250615", description="VLM Model Name")

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个还是默认回退到seed了,user不设置不一定用这个.直接去掉默认行为,不设置就报错

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已改为必填且仅使用 VLM_MODEL 配置,不再回退默认值(e5548d2)。

Comment threadsrc/config.py Outdated
Comment on lines +41 to +50
def _load_vlm_model(cls, v):
"""
优先读取独立的 VLM_MODEL(保持与 LLM 文本模型解耦)
回退顺序:
1) 显式传入值
2) 环境变量 VLM_MODEL(独立配置)
3) 环境变量 LLM_VLM_MODEL(前缀形式)
4) 默认值
"""
return v or os.getenv("VLM_MODEL") or os.getenv("LLM_VLM_MODEL") or "seed-1-6-250615"

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么要多级回退?我们只兼容一个配置,不引入额外的复杂性

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已去掉多级回退,仅接受独立的 VLM_MODEL(e5548d2)。

Comment threadsrc/multi_tenant.py Outdated

# 从配置中提取参数(支持租户覆盖)
model = llm_config.get("model", self.ark_model)
model = llm_config.get("vlm_model", self.ark_vlm_model)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ark_model是什么?你还在用火山的命名方式吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已移除 ark 命名,统一使用 llm/vlm 前缀并保持含义清晰(e5548d2)。

Comment threadenv.example
Comment on lines 15 to 22
LLM_BASE_URL="https://ark.ap-southeast.bytepluses.com/api/v3"
# 使用的模型名称
LLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(与 LLM_MODEL 解耦)
VLM_MODEL=seed-1-6-250615
# LLM 供应商标识(ark/openai/claude)
LLM_PROVIDER=ark
# VLM 图片理解 API 超时时间(秒,默认 120 秒)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LLM和VLM难道不可以换供应商吗?难道一定要用LLM的Base URL吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已支持 VLM 独立的 API Key/Base URL(env 示例已添加 VLM_API_KEY/VLM_BASE_URL),不再强制复用 LLM Base URL(e5548d2)。

@BukeLy

Copy link
Copy Markdown
Owner

@copilot 修改Review出来的问题 #10 (review)

CopilotAIand others added 2 commits December 15, 2025 09:59
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
@BukeLy
BukeLy marked this pull request as ready for review December 15, 2025 10:12
CopilotAI review requested due to automatic review settings December 15, 2025 10:12
@BukeLy
BukeLy merged commit f7e2565 into mainDec 15, 2025
7 checks passed
@BukeLy
BukeLy deleted the copilot/add-vlm-model-configuration branch December 15, 2025 10:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR decouples VLM (Vision Language Model) configuration from text LLM configuration, enabling independent configuration of vision models through environment variables. Previously, VLM model selection was hardcoded and tied to LLM settings, preventing users from configuring different models or API endpoints for vision tasks.

Key changes:

  • Introduced dedicated VLM configuration fields (vlm_model, vlm_api_key, vlm_base_url) with fallback to LLM credentials when VLM-specific values are not provided
  • Updated multi-tenant manager to use VLM-specific configuration for vision model creation, replacing hardcoded model references
  • Enhanced environment template with VLM configuration options and documentation

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
src/config.pyAdded required vlm_model field and optional vlm_api_key/vlm_base_url fields to LLMConfig; removed unused os import
src/multi_tenant.pyRenamed ark_* variables to llm_* for clarity; added VLM-specific variables with fallback logic; updated _create_vision_model_func to use dedicated VLM configuration
src/tenant_config.pyExtended _merge_llm_config to include VLM fields in tenant configuration merge, enabling per-tenant VLM overrides
env.exampleAdded VLM_MODEL as required configuration; documented optional VLM_API_KEY and VLM_BASE_URL with fallback behavior explanation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/config.py
Comment on lines +24 to +26
vlm_model: str = Field(..., description="VLM Model Name", alias="VLM_MODEL")
vlm_api_key: Optional[str] = Field(default=None, description="VLM API Key", alias="VLM_API_KEY")
vlm_base_url: Optional[str] = Field(default=None, description="VLM API Base URL", alias="VLM_BASE_URL")

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The VLM fields use explicit aliases (VLM_MODEL, VLM_API_KEY, VLM_BASE_URL) that don't follow the LLM_ prefix defined in the Config class. For these aliases to work correctly, the LLMConfig.Config class needs populate_by_name = True. Without this setting, pydantic-settings will not be able to load these environment variables. Other config classes in this file that use aliases (like DeepSeekOCRConfig at line 158) already include this setting.

Copilot uses AI. Check for mistakes.
Comment threadenv.example
Comment on lines +18 to +19
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation says VLM_MODEL is required (必填), but in the code at src/config.py:24, vlm_model uses Field(...) which makes it required at the pydantic validation level. However, the comment also says it should be "independent from LLM_MODEL" (独立于 LLM_MODEL), but the default value for LLM_MODEL and the example value for VLM_MODEL are both the same: seed-1-6-250615. This creates confusion about whether they should actually be different models. Consider clarifying whether VLM_MODEL can use the same model as LLM_MODEL (for models that support both text and vision), or if they must be different models.

Suggested change
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL,需支持图片输入
VLM_MODEL=seed-vlm-1-6-250615 # 示例:与 LLM_MODEL 不同,需为支持视觉的模型

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

VLM模型配置混乱,硬编码与.env配置不一致

3 participants

@BukeLy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation - #10

Merged
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration
Dec 15, 2025
Merged

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation#10
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration

Conversation

CopilotAI commented Dec 15, 2025

Copy link
Copy Markdown
Contributor

VLM model choice was hardcoded and tied to the text LLM model, preventing .env configuration and clear LLM/VLM separation.

  • Configuration
    • Added required vlm_model to LLMConfig via VLM_MODEL (no fallback defaults).
    • Added optional VLM_API_KEY and VLM_BASE_URL for vendor-independent VLM access; falls back to LLM credentials only when VLM-specific values are absent.
    • Preserved vlm_timeout.
  • Multi-tenant behavior
    • Vision model creation now uses the dedicated VLM model and supports VLM-specific key/base URL with consistent fallback.
    • Tenant config merge includes VLM model/key/base URL to allow per-tenant overrides.
  • Environment template
    • Introduced VLM_MODEL as mandatory and documented optional VLM_API_KEY/VLM_BASE_URL in env.example to expose VLM selection and vendor choice.

Example:

# .envVLM_MODEL=seed-1-6-250615# required, independent from LLM_MODEL# VLM_API_KEY=...# VLM_BASE_URL=...# runtime config usageconfig.llm.vlm_model# used for vision model callsconfig.llm.vlm_base_url# VLM-specific endpoint when provided
Original prompt

This section details on the original issue you should resolve

<issue_title>VLM模型配置混乱,硬编码与.env配置不一致</issue_title>
<issue_description>## 问题

  1. LLM_MODEL 在 .env 中配置为 Tongyi-Zhiwen/QwenLong-L1-32B(纯文本模型)
  2. 实际 VLM 模型硬编码在代码中为 seed-1-6-250615(多模态模型)
  3. 没有在 .env 中提供 VLM_MODEL 配置选项

影响

  • 用户无法在 .env 中配置 VLM 模型
  • LLM 和 VLM 的区别不明显,容易混淆
  • 不符合多租户配置的"配置即代码"原则

代码位置

  • /src/multi_tenant.py 第276-369行:VLM 函数硬编码使用 LLM 配置中的模型
  • /src/config.py:缺少 VLM_MODEL 配置字段
  • .env 第17行:只有 LLM_MODEL,没有 VLM_MODEL

建议修复

  1. .env 中添加独立的 VLM_MODEL 配置项
  2. 在 config.py 中为 LLMConfig 添加 vlm_model 字段
  3. 更新多租户实例创建逻辑,使用 vlm_model 而不是 llm 的 model</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
CopilotAI changed the title [WIP] Add VLM model configuration to .env and codeAdd dedicated VLM model configuration and wire it through multi-tenant VLM creationDec 15, 2025
CopilotAI requested a review from BukeLyDecember 15, 2025 09:46

@BukeLyBukeLy left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

按照Comment的来改进

Comment threadsrc/config.py Outdated
api_key: str = Field(..., description="LLM API Key")
base_url: str = Field(..., description="LLM API Base URL")
model: str = Field(default="seed-1-6-250615", description="LLM Model Name")
vlm_model: str = Field(default="seed-1-6-250615", description="VLM Model Name")

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个还是默认回退到seed了,user不设置不一定用这个.直接去掉默认行为,不设置就报错

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已改为必填且仅使用 VLM_MODEL 配置,不再回退默认值(e5548d2)。

Comment threadsrc/config.py Outdated
Comment on lines +41 to +50
def _load_vlm_model(cls, v):
"""
优先读取独立的 VLM_MODEL(保持与 LLM 文本模型解耦)
回退顺序:
1) 显式传入值
2) 环境变量 VLM_MODEL(独立配置)
3) 环境变量 LLM_VLM_MODEL(前缀形式)
4) 默认值
"""
return v or os.getenv("VLM_MODEL") or os.getenv("LLM_VLM_MODEL") or "seed-1-6-250615"

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么要多级回退?我们只兼容一个配置,不引入额外的复杂性

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已去掉多级回退,仅接受独立的 VLM_MODEL(e5548d2)。

Comment threadsrc/multi_tenant.py Outdated

# 从配置中提取参数(支持租户覆盖)
model = llm_config.get("model", self.ark_model)
model = llm_config.get("vlm_model", self.ark_vlm_model)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ark_model是什么?你还在用火山的命名方式吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已移除 ark 命名,统一使用 llm/vlm 前缀并保持含义清晰(e5548d2)。

Comment threadenv.example
Comment on lines 15 to 22
LLM_BASE_URL="https://ark.ap-southeast.bytepluses.com/api/v3"
# 使用的模型名称
LLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(与 LLM_MODEL 解耦)
VLM_MODEL=seed-1-6-250615
# LLM 供应商标识(ark/openai/claude)
LLM_PROVIDER=ark
# VLM 图片理解 API 超时时间(秒,默认 120 秒)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LLM和VLM难道不可以换供应商吗?难道一定要用LLM的Base URL吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已支持 VLM 独立的 API Key/Base URL(env 示例已添加 VLM_API_KEY/VLM_BASE_URL),不再强制复用 LLM Base URL(e5548d2)。

@BukeLy

Copy link
Copy Markdown
Owner

@copilot 修改Review出来的问题 #10 (review)

CopilotAIand others added 2 commits December 15, 2025 09:59
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
@BukeLy
BukeLy marked this pull request as ready for review December 15, 2025 10:12
CopilotAI review requested due to automatic review settings December 15, 2025 10:12
@BukeLy
BukeLy merged commit f7e2565 into mainDec 15, 2025
7 checks passed
@BukeLy
BukeLy deleted the copilot/add-vlm-model-configuration branch December 15, 2025 10:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR decouples VLM (Vision Language Model) configuration from text LLM configuration, enabling independent configuration of vision models through environment variables. Previously, VLM model selection was hardcoded and tied to LLM settings, preventing users from configuring different models or API endpoints for vision tasks.

Key changes:

  • Introduced dedicated VLM configuration fields (vlm_model, vlm_api_key, vlm_base_url) with fallback to LLM credentials when VLM-specific values are not provided
  • Updated multi-tenant manager to use VLM-specific configuration for vision model creation, replacing hardcoded model references
  • Enhanced environment template with VLM configuration options and documentation

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
src/config.pyAdded required vlm_model field and optional vlm_api_key/vlm_base_url fields to LLMConfig; removed unused os import
src/multi_tenant.pyRenamed ark_* variables to llm_* for clarity; added VLM-specific variables with fallback logic; updated _create_vision_model_func to use dedicated VLM configuration
src/tenant_config.pyExtended _merge_llm_config to include VLM fields in tenant configuration merge, enabling per-tenant VLM overrides
env.exampleAdded VLM_MODEL as required configuration; documented optional VLM_API_KEY and VLM_BASE_URL with fallback behavior explanation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/config.py
Comment on lines +24 to +26
vlm_model: str = Field(..., description="VLM Model Name", alias="VLM_MODEL")
vlm_api_key: Optional[str] = Field(default=None, description="VLM API Key", alias="VLM_API_KEY")
vlm_base_url: Optional[str] = Field(default=None, description="VLM API Base URL", alias="VLM_BASE_URL")

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The VLM fields use explicit aliases (VLM_MODEL, VLM_API_KEY, VLM_BASE_URL) that don't follow the LLM_ prefix defined in the Config class. For these aliases to work correctly, the LLMConfig.Config class needs populate_by_name = True. Without this setting, pydantic-settings will not be able to load these environment variables. Other config classes in this file that use aliases (like DeepSeekOCRConfig at line 158) already include this setting.

Copilot uses AI. Check for mistakes.
Comment threadenv.example
Comment on lines +18 to +19
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation says VLM_MODEL is required (必填), but in the code at src/config.py:24, vlm_model uses Field(...) which makes it required at the pydantic validation level. However, the comment also says it should be "independent from LLM_MODEL" (独立于 LLM_MODEL), but the default value for LLM_MODEL and the example value for VLM_MODEL are both the same: seed-1-6-250615. This creates confusion about whether they should actually be different models. Consider clarifying whether VLM_MODEL can use the same model as LLM_MODEL (for models that support both text and vision), or if they must be different models.

Suggested change
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL,需支持图片输入
VLM_MODEL=seed-vlm-1-6-250615 # 示例:与 LLM_MODEL 不同,需为支持视觉的模型

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

VLM模型配置混乱,硬编码与.env配置不一致

3 participants

@BukeLy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation - #10

Merged
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration
Dec 15, 2025
Merged

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation#10
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration

Conversation

CopilotAI commented Dec 15, 2025

Copy link
Copy Markdown
Contributor

VLM model choice was hardcoded and tied to the text LLM model, preventing .env configuration and clear LLM/VLM separation.

  • Configuration
    • Added required vlm_model to LLMConfig via VLM_MODEL (no fallback defaults).
    • Added optional VLM_API_KEY and VLM_BASE_URL for vendor-independent VLM access; falls back to LLM credentials only when VLM-specific values are absent.
    • Preserved vlm_timeout.
  • Multi-tenant behavior
    • Vision model creation now uses the dedicated VLM model and supports VLM-specific key/base URL with consistent fallback.
    • Tenant config merge includes VLM model/key/base URL to allow per-tenant overrides.
  • Environment template
    • Introduced VLM_MODEL as mandatory and documented optional VLM_API_KEY/VLM_BASE_URL in env.example to expose VLM selection and vendor choice.

Example:

# .envVLM_MODEL=seed-1-6-250615# required, independent from LLM_MODEL# VLM_API_KEY=...# VLM_BASE_URL=...# runtime config usageconfig.llm.vlm_model# used for vision model callsconfig.llm.vlm_base_url# VLM-specific endpoint when provided
Original prompt

This section details on the original issue you should resolve

<issue_title>VLM模型配置混乱,硬编码与.env配置不一致</issue_title>
<issue_description>## 问题

  1. LLM_MODEL 在 .env 中配置为 Tongyi-Zhiwen/QwenLong-L1-32B(纯文本模型)
  2. 实际 VLM 模型硬编码在代码中为 seed-1-6-250615(多模态模型)
  3. 没有在 .env 中提供 VLM_MODEL 配置选项

影响

  • 用户无法在 .env 中配置 VLM 模型
  • LLM 和 VLM 的区别不明显,容易混淆
  • 不符合多租户配置的"配置即代码"原则

代码位置

  • /src/multi_tenant.py 第276-369行:VLM 函数硬编码使用 LLM 配置中的模型
  • /src/config.py:缺少 VLM_MODEL 配置字段
  • .env 第17行:只有 LLM_MODEL,没有 VLM_MODEL

建议修复

  1. .env 中添加独立的 VLM_MODEL 配置项
  2. 在 config.py 中为 LLMConfig 添加 vlm_model 字段
  3. 更新多租户实例创建逻辑,使用 vlm_model 而不是 llm 的 model</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
CopilotAI changed the title [WIP] Add VLM model configuration to .env and codeAdd dedicated VLM model configuration and wire it through multi-tenant VLM creationDec 15, 2025
CopilotAI requested a review from BukeLyDecember 15, 2025 09:46

@BukeLyBukeLy left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

按照Comment的来改进

Comment threadsrc/config.py Outdated
api_key: str = Field(..., description="LLM API Key")
base_url: str = Field(..., description="LLM API Base URL")
model: str = Field(default="seed-1-6-250615", description="LLM Model Name")
vlm_model: str = Field(default="seed-1-6-250615", description="VLM Model Name")

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个还是默认回退到seed了,user不设置不一定用这个.直接去掉默认行为,不设置就报错

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已改为必填且仅使用 VLM_MODEL 配置,不再回退默认值(e5548d2)。

Comment threadsrc/config.py Outdated
Comment on lines +41 to +50
def _load_vlm_model(cls, v):
"""
优先读取独立的 VLM_MODEL(保持与 LLM 文本模型解耦)
回退顺序:
1) 显式传入值
2) 环境变量 VLM_MODEL(独立配置)
3) 环境变量 LLM_VLM_MODEL(前缀形式)
4) 默认值
"""
return v or os.getenv("VLM_MODEL") or os.getenv("LLM_VLM_MODEL") or "seed-1-6-250615"

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么要多级回退?我们只兼容一个配置,不引入额外的复杂性

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已去掉多级回退,仅接受独立的 VLM_MODEL(e5548d2)。

Comment threadsrc/multi_tenant.py Outdated

# 从配置中提取参数(支持租户覆盖)
model = llm_config.get("model", self.ark_model)
model = llm_config.get("vlm_model", self.ark_vlm_model)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ark_model是什么?你还在用火山的命名方式吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已移除 ark 命名,统一使用 llm/vlm 前缀并保持含义清晰(e5548d2)。

Comment threadenv.example
Comment on lines 15 to 22
LLM_BASE_URL="https://ark.ap-southeast.bytepluses.com/api/v3"
# 使用的模型名称
LLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(与 LLM_MODEL 解耦)
VLM_MODEL=seed-1-6-250615
# LLM 供应商标识(ark/openai/claude)
LLM_PROVIDER=ark
# VLM 图片理解 API 超时时间(秒,默认 120 秒)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LLM和VLM难道不可以换供应商吗?难道一定要用LLM的Base URL吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已支持 VLM 独立的 API Key/Base URL(env 示例已添加 VLM_API_KEY/VLM_BASE_URL),不再强制复用 LLM Base URL(e5548d2)。

@BukeLy

Copy link
Copy Markdown
Owner

@copilot 修改Review出来的问题 #10 (review)

CopilotAIand others added 2 commits December 15, 2025 09:59
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
@BukeLy
BukeLy marked this pull request as ready for review December 15, 2025 10:12
CopilotAI review requested due to automatic review settings December 15, 2025 10:12
@BukeLy
BukeLy merged commit f7e2565 into mainDec 15, 2025
7 checks passed
@BukeLy
BukeLy deleted the copilot/add-vlm-model-configuration branch December 15, 2025 10:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR decouples VLM (Vision Language Model) configuration from text LLM configuration, enabling independent configuration of vision models through environment variables. Previously, VLM model selection was hardcoded and tied to LLM settings, preventing users from configuring different models or API endpoints for vision tasks.

Key changes:

  • Introduced dedicated VLM configuration fields (vlm_model, vlm_api_key, vlm_base_url) with fallback to LLM credentials when VLM-specific values are not provided
  • Updated multi-tenant manager to use VLM-specific configuration for vision model creation, replacing hardcoded model references
  • Enhanced environment template with VLM configuration options and documentation

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
src/config.pyAdded required vlm_model field and optional vlm_api_key/vlm_base_url fields to LLMConfig; removed unused os import
src/multi_tenant.pyRenamed ark_* variables to llm_* for clarity; added VLM-specific variables with fallback logic; updated _create_vision_model_func to use dedicated VLM configuration
src/tenant_config.pyExtended _merge_llm_config to include VLM fields in tenant configuration merge, enabling per-tenant VLM overrides
env.exampleAdded VLM_MODEL as required configuration; documented optional VLM_API_KEY and VLM_BASE_URL with fallback behavior explanation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/config.py
Comment on lines +24 to +26
vlm_model: str = Field(..., description="VLM Model Name", alias="VLM_MODEL")
vlm_api_key: Optional[str] = Field(default=None, description="VLM API Key", alias="VLM_API_KEY")
vlm_base_url: Optional[str] = Field(default=None, description="VLM API Base URL", alias="VLM_BASE_URL")

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The VLM fields use explicit aliases (VLM_MODEL, VLM_API_KEY, VLM_BASE_URL) that don't follow the LLM_ prefix defined in the Config class. For these aliases to work correctly, the LLMConfig.Config class needs populate_by_name = True. Without this setting, pydantic-settings will not be able to load these environment variables. Other config classes in this file that use aliases (like DeepSeekOCRConfig at line 158) already include this setting.

Copilot uses AI. Check for mistakes.
Comment threadenv.example
Comment on lines +18 to +19
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation says VLM_MODEL is required (必填), but in the code at src/config.py:24, vlm_model uses Field(...) which makes it required at the pydantic validation level. However, the comment also says it should be "independent from LLM_MODEL" (独立于 LLM_MODEL), but the default value for LLM_MODEL and the example value for VLM_MODEL are both the same: seed-1-6-250615. This creates confusion about whether they should actually be different models. Consider clarifying whether VLM_MODEL can use the same model as LLM_MODEL (for models that support both text and vision), or if they must be different models.

Suggested change
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL,需支持图片输入
VLM_MODEL=seed-vlm-1-6-250615 # 示例:与 LLM_MODEL 不同,需为支持视觉的模型

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

VLM模型配置混乱,硬编码与.env配置不一致

3 participants

@BukeLy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation - #10

Merged
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration
Dec 15, 2025
Merged

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation#10
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration

Conversation

CopilotAI commented Dec 15, 2025

Copy link
Copy Markdown
Contributor

VLM model choice was hardcoded and tied to the text LLM model, preventing .env configuration and clear LLM/VLM separation.

  • Configuration
    • Added required vlm_model to LLMConfig via VLM_MODEL (no fallback defaults).
    • Added optional VLM_API_KEY and VLM_BASE_URL for vendor-independent VLM access; falls back to LLM credentials only when VLM-specific values are absent.
    • Preserved vlm_timeout.
  • Multi-tenant behavior
    • Vision model creation now uses the dedicated VLM model and supports VLM-specific key/base URL with consistent fallback.
    • Tenant config merge includes VLM model/key/base URL to allow per-tenant overrides.
  • Environment template
    • Introduced VLM_MODEL as mandatory and documented optional VLM_API_KEY/VLM_BASE_URL in env.example to expose VLM selection and vendor choice.

Example:

# .envVLM_MODEL=seed-1-6-250615# required, independent from LLM_MODEL# VLM_API_KEY=...# VLM_BASE_URL=...# runtime config usageconfig.llm.vlm_model# used for vision model callsconfig.llm.vlm_base_url# VLM-specific endpoint when provided
Original prompt

This section details on the original issue you should resolve

<issue_title>VLM模型配置混乱,硬编码与.env配置不一致</issue_title>
<issue_description>## 问题

  1. LLM_MODEL 在 .env 中配置为 Tongyi-Zhiwen/QwenLong-L1-32B(纯文本模型)
  2. 实际 VLM 模型硬编码在代码中为 seed-1-6-250615(多模态模型)
  3. 没有在 .env 中提供 VLM_MODEL 配置选项

影响

  • 用户无法在 .env 中配置 VLM 模型
  • LLM 和 VLM 的区别不明显,容易混淆
  • 不符合多租户配置的"配置即代码"原则

代码位置

  • /src/multi_tenant.py 第276-369行:VLM 函数硬编码使用 LLM 配置中的模型
  • /src/config.py:缺少 VLM_MODEL 配置字段
  • .env 第17行:只有 LLM_MODEL,没有 VLM_MODEL

建议修复

  1. .env 中添加独立的 VLM_MODEL 配置项
  2. 在 config.py 中为 LLMConfig 添加 vlm_model 字段
  3. 更新多租户实例创建逻辑,使用 vlm_model 而不是 llm 的 model</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
CopilotAI changed the title [WIP] Add VLM model configuration to .env and codeAdd dedicated VLM model configuration and wire it through multi-tenant VLM creationDec 15, 2025
CopilotAI requested a review from BukeLyDecember 15, 2025 09:46

@BukeLyBukeLy left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

按照Comment的来改进

Comment threadsrc/config.py Outdated
api_key: str = Field(..., description="LLM API Key")
base_url: str = Field(..., description="LLM API Base URL")
model: str = Field(default="seed-1-6-250615", description="LLM Model Name")
vlm_model: str = Field(default="seed-1-6-250615", description="VLM Model Name")

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个还是默认回退到seed了,user不设置不一定用这个.直接去掉默认行为,不设置就报错

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已改为必填且仅使用 VLM_MODEL 配置,不再回退默认值(e5548d2)。

Comment threadsrc/config.py Outdated
Comment on lines +41 to +50
def _load_vlm_model(cls, v):
"""
优先读取独立的 VLM_MODEL(保持与 LLM 文本模型解耦)
回退顺序:
1) 显式传入值
2) 环境变量 VLM_MODEL(独立配置)
3) 环境变量 LLM_VLM_MODEL(前缀形式)
4) 默认值
"""
return v or os.getenv("VLM_MODEL") or os.getenv("LLM_VLM_MODEL") or "seed-1-6-250615"

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么要多级回退?我们只兼容一个配置,不引入额外的复杂性

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已去掉多级回退,仅接受独立的 VLM_MODEL(e5548d2)。

Comment threadsrc/multi_tenant.py Outdated

# 从配置中提取参数(支持租户覆盖)
model = llm_config.get("model", self.ark_model)
model = llm_config.get("vlm_model", self.ark_vlm_model)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ark_model是什么?你还在用火山的命名方式吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已移除 ark 命名,统一使用 llm/vlm 前缀并保持含义清晰(e5548d2)。

Comment threadenv.example
Comment on lines 15 to 22
LLM_BASE_URL="https://ark.ap-southeast.bytepluses.com/api/v3"
# 使用的模型名称
LLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(与 LLM_MODEL 解耦)
VLM_MODEL=seed-1-6-250615
# LLM 供应商标识(ark/openai/claude)
LLM_PROVIDER=ark
# VLM 图片理解 API 超时时间(秒,默认 120 秒)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LLM和VLM难道不可以换供应商吗?难道一定要用LLM的Base URL吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已支持 VLM 独立的 API Key/Base URL(env 示例已添加 VLM_API_KEY/VLM_BASE_URL),不再强制复用 LLM Base URL(e5548d2)。

@BukeLy

Copy link
Copy Markdown
Owner

@copilot 修改Review出来的问题 #10 (review)

CopilotAIand others added 2 commits December 15, 2025 09:59
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
@BukeLy
BukeLy marked this pull request as ready for review December 15, 2025 10:12
CopilotAI review requested due to automatic review settings December 15, 2025 10:12
@BukeLy
BukeLy merged commit f7e2565 into mainDec 15, 2025
7 checks passed
@BukeLy
BukeLy deleted the copilot/add-vlm-model-configuration branch December 15, 2025 10:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR decouples VLM (Vision Language Model) configuration from text LLM configuration, enabling independent configuration of vision models through environment variables. Previously, VLM model selection was hardcoded and tied to LLM settings, preventing users from configuring different models or API endpoints for vision tasks.

Key changes:

  • Introduced dedicated VLM configuration fields (vlm_model, vlm_api_key, vlm_base_url) with fallback to LLM credentials when VLM-specific values are not provided
  • Updated multi-tenant manager to use VLM-specific configuration for vision model creation, replacing hardcoded model references
  • Enhanced environment template with VLM configuration options and documentation

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
src/config.pyAdded required vlm_model field and optional vlm_api_key/vlm_base_url fields to LLMConfig; removed unused os import
src/multi_tenant.pyRenamed ark_* variables to llm_* for clarity; added VLM-specific variables with fallback logic; updated _create_vision_model_func to use dedicated VLM configuration
src/tenant_config.pyExtended _merge_llm_config to include VLM fields in tenant configuration merge, enabling per-tenant VLM overrides
env.exampleAdded VLM_MODEL as required configuration; documented optional VLM_API_KEY and VLM_BASE_URL with fallback behavior explanation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/config.py
Comment on lines +24 to +26
vlm_model: str = Field(..., description="VLM Model Name", alias="VLM_MODEL")
vlm_api_key: Optional[str] = Field(default=None, description="VLM API Key", alias="VLM_API_KEY")
vlm_base_url: Optional[str] = Field(default=None, description="VLM API Base URL", alias="VLM_BASE_URL")

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The VLM fields use explicit aliases (VLM_MODEL, VLM_API_KEY, VLM_BASE_URL) that don't follow the LLM_ prefix defined in the Config class. For these aliases to work correctly, the LLMConfig.Config class needs populate_by_name = True. Without this setting, pydantic-settings will not be able to load these environment variables. Other config classes in this file that use aliases (like DeepSeekOCRConfig at line 158) already include this setting.

Copilot uses AI. Check for mistakes.
Comment threadenv.example
Comment on lines +18 to +19
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation says VLM_MODEL is required (必填), but in the code at src/config.py:24, vlm_model uses Field(...) which makes it required at the pydantic validation level. However, the comment also says it should be "independent from LLM_MODEL" (独立于 LLM_MODEL), but the default value for LLM_MODEL and the example value for VLM_MODEL are both the same: seed-1-6-250615. This creates confusion about whether they should actually be different models. Consider clarifying whether VLM_MODEL can use the same model as LLM_MODEL (for models that support both text and vision), or if they must be different models.

Suggested change
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL,需支持图片输入
VLM_MODEL=seed-vlm-1-6-250615 # 示例:与 LLM_MODEL 不同,需为支持视觉的模型

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

VLM模型配置混乱,硬编码与.env配置不一致

3 participants

@BukeLy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation - #10

Merged
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration
Dec 15, 2025
Merged

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation#10
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration

Conversation

CopilotAI commented Dec 15, 2025

Copy link
Copy Markdown
Contributor

VLM model choice was hardcoded and tied to the text LLM model, preventing .env configuration and clear LLM/VLM separation.

  • Configuration
    • Added required vlm_model to LLMConfig via VLM_MODEL (no fallback defaults).
    • Added optional VLM_API_KEY and VLM_BASE_URL for vendor-independent VLM access; falls back to LLM credentials only when VLM-specific values are absent.
    • Preserved vlm_timeout.
  • Multi-tenant behavior
    • Vision model creation now uses the dedicated VLM model and supports VLM-specific key/base URL with consistent fallback.
    • Tenant config merge includes VLM model/key/base URL to allow per-tenant overrides.
  • Environment template
    • Introduced VLM_MODEL as mandatory and documented optional VLM_API_KEY/VLM_BASE_URL in env.example to expose VLM selection and vendor choice.

Example:

# .envVLM_MODEL=seed-1-6-250615# required, independent from LLM_MODEL# VLM_API_KEY=...# VLM_BASE_URL=...# runtime config usageconfig.llm.vlm_model# used for vision model callsconfig.llm.vlm_base_url# VLM-specific endpoint when provided
Original prompt

This section details on the original issue you should resolve

<issue_title>VLM模型配置混乱,硬编码与.env配置不一致</issue_title>
<issue_description>## 问题

  1. LLM_MODEL 在 .env 中配置为 Tongyi-Zhiwen/QwenLong-L1-32B(纯文本模型)
  2. 实际 VLM 模型硬编码在代码中为 seed-1-6-250615(多模态模型)
  3. 没有在 .env 中提供 VLM_MODEL 配置选项

影响

  • 用户无法在 .env 中配置 VLM 模型
  • LLM 和 VLM 的区别不明显,容易混淆
  • 不符合多租户配置的"配置即代码"原则

代码位置

  • /src/multi_tenant.py 第276-369行:VLM 函数硬编码使用 LLM 配置中的模型
  • /src/config.py:缺少 VLM_MODEL 配置字段
  • .env 第17行:只有 LLM_MODEL,没有 VLM_MODEL

建议修复

  1. .env 中添加独立的 VLM_MODEL 配置项
  2. 在 config.py 中为 LLMConfig 添加 vlm_model 字段
  3. 更新多租户实例创建逻辑,使用 vlm_model 而不是 llm 的 model</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
CopilotAI changed the title [WIP] Add VLM model configuration to .env and codeAdd dedicated VLM model configuration and wire it through multi-tenant VLM creationDec 15, 2025
CopilotAI requested a review from BukeLyDecember 15, 2025 09:46

@BukeLyBukeLy left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

按照Comment的来改进

Comment threadsrc/config.py Outdated
api_key: str = Field(..., description="LLM API Key")
base_url: str = Field(..., description="LLM API Base URL")
model: str = Field(default="seed-1-6-250615", description="LLM Model Name")
vlm_model: str = Field(default="seed-1-6-250615", description="VLM Model Name")

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个还是默认回退到seed了,user不设置不一定用这个.直接去掉默认行为,不设置就报错

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已改为必填且仅使用 VLM_MODEL 配置,不再回退默认值(e5548d2)。

Comment threadsrc/config.py Outdated
Comment on lines +41 to +50
def _load_vlm_model(cls, v):
"""
优先读取独立的 VLM_MODEL(保持与 LLM 文本模型解耦)
回退顺序:
1) 显式传入值
2) 环境变量 VLM_MODEL(独立配置)
3) 环境变量 LLM_VLM_MODEL(前缀形式)
4) 默认值
"""
return v or os.getenv("VLM_MODEL") or os.getenv("LLM_VLM_MODEL") or "seed-1-6-250615"

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么要多级回退?我们只兼容一个配置,不引入额外的复杂性

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已去掉多级回退,仅接受独立的 VLM_MODEL(e5548d2)。

Comment threadsrc/multi_tenant.py Outdated

# 从配置中提取参数(支持租户覆盖)
model = llm_config.get("model", self.ark_model)
model = llm_config.get("vlm_model", self.ark_vlm_model)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ark_model是什么?你还在用火山的命名方式吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已移除 ark 命名,统一使用 llm/vlm 前缀并保持含义清晰(e5548d2)。

Comment threadenv.example
Comment on lines 15 to 22
LLM_BASE_URL="https://ark.ap-southeast.bytepluses.com/api/v3"
# 使用的模型名称
LLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(与 LLM_MODEL 解耦)
VLM_MODEL=seed-1-6-250615
# LLM 供应商标识(ark/openai/claude)
LLM_PROVIDER=ark
# VLM 图片理解 API 超时时间(秒,默认 120 秒)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LLM和VLM难道不可以换供应商吗?难道一定要用LLM的Base URL吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已支持 VLM 独立的 API Key/Base URL(env 示例已添加 VLM_API_KEY/VLM_BASE_URL),不再强制复用 LLM Base URL(e5548d2)。

@BukeLy

Copy link
Copy Markdown
Owner

@copilot 修改Review出来的问题 #10 (review)

CopilotAIand others added 2 commits December 15, 2025 09:59
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
@BukeLy
BukeLy marked this pull request as ready for review December 15, 2025 10:12
CopilotAI review requested due to automatic review settings December 15, 2025 10:12
@BukeLy
BukeLy merged commit f7e2565 into mainDec 15, 2025
7 checks passed
@BukeLy
BukeLy deleted the copilot/add-vlm-model-configuration branch December 15, 2025 10:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR decouples VLM (Vision Language Model) configuration from text LLM configuration, enabling independent configuration of vision models through environment variables. Previously, VLM model selection was hardcoded and tied to LLM settings, preventing users from configuring different models or API endpoints for vision tasks.

Key changes:

  • Introduced dedicated VLM configuration fields (vlm_model, vlm_api_key, vlm_base_url) with fallback to LLM credentials when VLM-specific values are not provided
  • Updated multi-tenant manager to use VLM-specific configuration for vision model creation, replacing hardcoded model references
  • Enhanced environment template with VLM configuration options and documentation

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
src/config.pyAdded required vlm_model field and optional vlm_api_key/vlm_base_url fields to LLMConfig; removed unused os import
src/multi_tenant.pyRenamed ark_* variables to llm_* for clarity; added VLM-specific variables with fallback logic; updated _create_vision_model_func to use dedicated VLM configuration
src/tenant_config.pyExtended _merge_llm_config to include VLM fields in tenant configuration merge, enabling per-tenant VLM overrides
env.exampleAdded VLM_MODEL as required configuration; documented optional VLM_API_KEY and VLM_BASE_URL with fallback behavior explanation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/config.py
Comment on lines +24 to +26
vlm_model: str = Field(..., description="VLM Model Name", alias="VLM_MODEL")
vlm_api_key: Optional[str] = Field(default=None, description="VLM API Key", alias="VLM_API_KEY")
vlm_base_url: Optional[str] = Field(default=None, description="VLM API Base URL", alias="VLM_BASE_URL")

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The VLM fields use explicit aliases (VLM_MODEL, VLM_API_KEY, VLM_BASE_URL) that don't follow the LLM_ prefix defined in the Config class. For these aliases to work correctly, the LLMConfig.Config class needs populate_by_name = True. Without this setting, pydantic-settings will not be able to load these environment variables. Other config classes in this file that use aliases (like DeepSeekOCRConfig at line 158) already include this setting.

Copilot uses AI. Check for mistakes.
Comment threadenv.example
Comment on lines +18 to +19
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation says VLM_MODEL is required (必填), but in the code at src/config.py:24, vlm_model uses Field(...) which makes it required at the pydantic validation level. However, the comment also says it should be "independent from LLM_MODEL" (独立于 LLM_MODEL), but the default value for LLM_MODEL and the example value for VLM_MODEL are both the same: seed-1-6-250615. This creates confusion about whether they should actually be different models. Consider clarifying whether VLM_MODEL can use the same model as LLM_MODEL (for models that support both text and vision), or if they must be different models.

Suggested change
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL,需支持图片输入
VLM_MODEL=seed-vlm-1-6-250615 # 示例:与 LLM_MODEL 不同,需为支持视觉的模型

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

VLM模型配置混乱,硬编码与.env配置不一致

3 participants

@BukeLy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation - #10

Merged
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration
Dec 15, 2025
Merged

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation#10
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration

Conversation

CopilotAI commented Dec 15, 2025

Copy link
Copy Markdown
Contributor

VLM model choice was hardcoded and tied to the text LLM model, preventing .env configuration and clear LLM/VLM separation.

  • Configuration
    • Added required vlm_model to LLMConfig via VLM_MODEL (no fallback defaults).
    • Added optional VLM_API_KEY and VLM_BASE_URL for vendor-independent VLM access; falls back to LLM credentials only when VLM-specific values are absent.
    • Preserved vlm_timeout.
  • Multi-tenant behavior
    • Vision model creation now uses the dedicated VLM model and supports VLM-specific key/base URL with consistent fallback.
    • Tenant config merge includes VLM model/key/base URL to allow per-tenant overrides.
  • Environment template
    • Introduced VLM_MODEL as mandatory and documented optional VLM_API_KEY/VLM_BASE_URL in env.example to expose VLM selection and vendor choice.

Example:

# .envVLM_MODEL=seed-1-6-250615# required, independent from LLM_MODEL# VLM_API_KEY=...# VLM_BASE_URL=...# runtime config usageconfig.llm.vlm_model# used for vision model callsconfig.llm.vlm_base_url# VLM-specific endpoint when provided
Original prompt

This section details on the original issue you should resolve

<issue_title>VLM模型配置混乱,硬编码与.env配置不一致</issue_title>
<issue_description>## 问题

  1. LLM_MODEL 在 .env 中配置为 Tongyi-Zhiwen/QwenLong-L1-32B(纯文本模型)
  2. 实际 VLM 模型硬编码在代码中为 seed-1-6-250615(多模态模型)
  3. 没有在 .env 中提供 VLM_MODEL 配置选项

影响

  • 用户无法在 .env 中配置 VLM 模型
  • LLM 和 VLM 的区别不明显,容易混淆
  • 不符合多租户配置的"配置即代码"原则

代码位置

  • /src/multi_tenant.py 第276-369行:VLM 函数硬编码使用 LLM 配置中的模型
  • /src/config.py:缺少 VLM_MODEL 配置字段
  • .env 第17行:只有 LLM_MODEL,没有 VLM_MODEL

建议修复

  1. .env 中添加独立的 VLM_MODEL 配置项
  2. 在 config.py 中为 LLMConfig 添加 vlm_model 字段
  3. 更新多租户实例创建逻辑,使用 vlm_model 而不是 llm 的 model</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
CopilotAI changed the title [WIP] Add VLM model configuration to .env and codeAdd dedicated VLM model configuration and wire it through multi-tenant VLM creationDec 15, 2025
CopilotAI requested a review from BukeLyDecember 15, 2025 09:46

@BukeLyBukeLy left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

按照Comment的来改进

Comment threadsrc/config.py Outdated
api_key: str = Field(..., description="LLM API Key")
base_url: str = Field(..., description="LLM API Base URL")
model: str = Field(default="seed-1-6-250615", description="LLM Model Name")
vlm_model: str = Field(default="seed-1-6-250615", description="VLM Model Name")

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个还是默认回退到seed了,user不设置不一定用这个.直接去掉默认行为,不设置就报错

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已改为必填且仅使用 VLM_MODEL 配置,不再回退默认值(e5548d2)。

Comment threadsrc/config.py Outdated
Comment on lines +41 to +50
def _load_vlm_model(cls, v):
"""
优先读取独立的 VLM_MODEL(保持与 LLM 文本模型解耦)
回退顺序:
1) 显式传入值
2) 环境变量 VLM_MODEL(独立配置)
3) 环境变量 LLM_VLM_MODEL(前缀形式)
4) 默认值
"""
return v or os.getenv("VLM_MODEL") or os.getenv("LLM_VLM_MODEL") or "seed-1-6-250615"

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么要多级回退?我们只兼容一个配置,不引入额外的复杂性

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已去掉多级回退,仅接受独立的 VLM_MODEL(e5548d2)。

Comment threadsrc/multi_tenant.py Outdated

# 从配置中提取参数(支持租户覆盖)
model = llm_config.get("model", self.ark_model)
model = llm_config.get("vlm_model", self.ark_vlm_model)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ark_model是什么?你还在用火山的命名方式吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已移除 ark 命名,统一使用 llm/vlm 前缀并保持含义清晰(e5548d2)。

Comment threadenv.example
Comment on lines 15 to 22
LLM_BASE_URL="https://ark.ap-southeast.bytepluses.com/api/v3"
# 使用的模型名称
LLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(与 LLM_MODEL 解耦)
VLM_MODEL=seed-1-6-250615
# LLM 供应商标识(ark/openai/claude)
LLM_PROVIDER=ark
# VLM 图片理解 API 超时时间(秒,默认 120 秒)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LLM和VLM难道不可以换供应商吗?难道一定要用LLM的Base URL吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已支持 VLM 独立的 API Key/Base URL(env 示例已添加 VLM_API_KEY/VLM_BASE_URL),不再强制复用 LLM Base URL(e5548d2)。

@BukeLy

Copy link
Copy Markdown
Owner

@copilot 修改Review出来的问题 #10 (review)

CopilotAIand others added 2 commits December 15, 2025 09:59
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
@BukeLy
BukeLy marked this pull request as ready for review December 15, 2025 10:12
CopilotAI review requested due to automatic review settings December 15, 2025 10:12
@BukeLy
BukeLy merged commit f7e2565 into mainDec 15, 2025
7 checks passed
@BukeLy
BukeLy deleted the copilot/add-vlm-model-configuration branch December 15, 2025 10:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR decouples VLM (Vision Language Model) configuration from text LLM configuration, enabling independent configuration of vision models through environment variables. Previously, VLM model selection was hardcoded and tied to LLM settings, preventing users from configuring different models or API endpoints for vision tasks.

Key changes:

  • Introduced dedicated VLM configuration fields (vlm_model, vlm_api_key, vlm_base_url) with fallback to LLM credentials when VLM-specific values are not provided
  • Updated multi-tenant manager to use VLM-specific configuration for vision model creation, replacing hardcoded model references
  • Enhanced environment template with VLM configuration options and documentation

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
src/config.pyAdded required vlm_model field and optional vlm_api_key/vlm_base_url fields to LLMConfig; removed unused os import
src/multi_tenant.pyRenamed ark_* variables to llm_* for clarity; added VLM-specific variables with fallback logic; updated _create_vision_model_func to use dedicated VLM configuration
src/tenant_config.pyExtended _merge_llm_config to include VLM fields in tenant configuration merge, enabling per-tenant VLM overrides
env.exampleAdded VLM_MODEL as required configuration; documented optional VLM_API_KEY and VLM_BASE_URL with fallback behavior explanation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/config.py
Comment on lines +24 to +26
vlm_model: str = Field(..., description="VLM Model Name", alias="VLM_MODEL")
vlm_api_key: Optional[str] = Field(default=None, description="VLM API Key", alias="VLM_API_KEY")
vlm_base_url: Optional[str] = Field(default=None, description="VLM API Base URL", alias="VLM_BASE_URL")

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The VLM fields use explicit aliases (VLM_MODEL, VLM_API_KEY, VLM_BASE_URL) that don't follow the LLM_ prefix defined in the Config class. For these aliases to work correctly, the LLMConfig.Config class needs populate_by_name = True. Without this setting, pydantic-settings will not be able to load these environment variables. Other config classes in this file that use aliases (like DeepSeekOCRConfig at line 158) already include this setting.

Copilot uses AI. Check for mistakes.
Comment threadenv.example
Comment on lines +18 to +19
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation says VLM_MODEL is required (必填), but in the code at src/config.py:24, vlm_model uses Field(...) which makes it required at the pydantic validation level. However, the comment also says it should be "independent from LLM_MODEL" (独立于 LLM_MODEL), but the default value for LLM_MODEL and the example value for VLM_MODEL are both the same: seed-1-6-250615. This creates confusion about whether they should actually be different models. Consider clarifying whether VLM_MODEL can use the same model as LLM_MODEL (for models that support both text and vision), or if they must be different models.

Suggested change
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL,需支持图片输入
VLM_MODEL=seed-vlm-1-6-250615 # 示例:与 LLM_MODEL 不同,需为支持视觉的模型

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

VLM模型配置混乱,硬编码与.env配置不一致

3 participants

@BukeLy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation - #10

Merged
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration
Dec 15, 2025
Merged

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation#10
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration

Conversation

CopilotAI commented Dec 15, 2025

Copy link
Copy Markdown
Contributor

VLM model choice was hardcoded and tied to the text LLM model, preventing .env configuration and clear LLM/VLM separation.

  • Configuration
    • Added required vlm_model to LLMConfig via VLM_MODEL (no fallback defaults).
    • Added optional VLM_API_KEY and VLM_BASE_URL for vendor-independent VLM access; falls back to LLM credentials only when VLM-specific values are absent.
    • Preserved vlm_timeout.
  • Multi-tenant behavior
    • Vision model creation now uses the dedicated VLM model and supports VLM-specific key/base URL with consistent fallback.
    • Tenant config merge includes VLM model/key/base URL to allow per-tenant overrides.
  • Environment template
    • Introduced VLM_MODEL as mandatory and documented optional VLM_API_KEY/VLM_BASE_URL in env.example to expose VLM selection and vendor choice.

Example:

# .envVLM_MODEL=seed-1-6-250615# required, independent from LLM_MODEL# VLM_API_KEY=...# VLM_BASE_URL=...# runtime config usageconfig.llm.vlm_model# used for vision model callsconfig.llm.vlm_base_url# VLM-specific endpoint when provided
Original prompt

This section details on the original issue you should resolve

<issue_title>VLM模型配置混乱,硬编码与.env配置不一致</issue_title>
<issue_description>## 问题

  1. LLM_MODEL 在 .env 中配置为 Tongyi-Zhiwen/QwenLong-L1-32B(纯文本模型)
  2. 实际 VLM 模型硬编码在代码中为 seed-1-6-250615(多模态模型)
  3. 没有在 .env 中提供 VLM_MODEL 配置选项

影响

  • 用户无法在 .env 中配置 VLM 模型
  • LLM 和 VLM 的区别不明显,容易混淆
  • 不符合多租户配置的"配置即代码"原则

代码位置

  • /src/multi_tenant.py 第276-369行:VLM 函数硬编码使用 LLM 配置中的模型
  • /src/config.py:缺少 VLM_MODEL 配置字段
  • .env 第17行:只有 LLM_MODEL,没有 VLM_MODEL

建议修复

  1. .env 中添加独立的 VLM_MODEL 配置项
  2. 在 config.py 中为 LLMConfig 添加 vlm_model 字段
  3. 更新多租户实例创建逻辑,使用 vlm_model 而不是 llm 的 model</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
CopilotAI changed the title [WIP] Add VLM model configuration to .env and codeAdd dedicated VLM model configuration and wire it through multi-tenant VLM creationDec 15, 2025
CopilotAI requested a review from BukeLyDecember 15, 2025 09:46

@BukeLyBukeLy left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

按照Comment的来改进

Comment threadsrc/config.py Outdated
api_key: str = Field(..., description="LLM API Key")
base_url: str = Field(..., description="LLM API Base URL")
model: str = Field(default="seed-1-6-250615", description="LLM Model Name")
vlm_model: str = Field(default="seed-1-6-250615", description="VLM Model Name")

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个还是默认回退到seed了,user不设置不一定用这个.直接去掉默认行为,不设置就报错

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已改为必填且仅使用 VLM_MODEL 配置,不再回退默认值(e5548d2)。

Comment threadsrc/config.py Outdated
Comment on lines +41 to +50
def _load_vlm_model(cls, v):
"""
优先读取独立的 VLM_MODEL(保持与 LLM 文本模型解耦)
回退顺序:
1) 显式传入值
2) 环境变量 VLM_MODEL(独立配置)
3) 环境变量 LLM_VLM_MODEL(前缀形式)
4) 默认值
"""
return v or os.getenv("VLM_MODEL") or os.getenv("LLM_VLM_MODEL") or "seed-1-6-250615"

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么要多级回退?我们只兼容一个配置,不引入额外的复杂性

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已去掉多级回退,仅接受独立的 VLM_MODEL(e5548d2)。

Comment threadsrc/multi_tenant.py Outdated

# 从配置中提取参数(支持租户覆盖)
model = llm_config.get("model", self.ark_model)
model = llm_config.get("vlm_model", self.ark_vlm_model)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ark_model是什么?你还在用火山的命名方式吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已移除 ark 命名,统一使用 llm/vlm 前缀并保持含义清晰(e5548d2)。

Comment threadenv.example
Comment on lines 15 to 22
LLM_BASE_URL="https://ark.ap-southeast.bytepluses.com/api/v3"
# 使用的模型名称
LLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(与 LLM_MODEL 解耦)
VLM_MODEL=seed-1-6-250615
# LLM 供应商标识(ark/openai/claude)
LLM_PROVIDER=ark
# VLM 图片理解 API 超时时间(秒,默认 120 秒)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LLM和VLM难道不可以换供应商吗?难道一定要用LLM的Base URL吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已支持 VLM 独立的 API Key/Base URL(env 示例已添加 VLM_API_KEY/VLM_BASE_URL),不再强制复用 LLM Base URL(e5548d2)。

@BukeLy

Copy link
Copy Markdown
Owner

@copilot 修改Review出来的问题 #10 (review)

CopilotAIand others added 2 commits December 15, 2025 09:59
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
@BukeLy
BukeLy marked this pull request as ready for review December 15, 2025 10:12
CopilotAI review requested due to automatic review settings December 15, 2025 10:12
@BukeLy
BukeLy merged commit f7e2565 into mainDec 15, 2025
7 checks passed
@BukeLy
BukeLy deleted the copilot/add-vlm-model-configuration branch December 15, 2025 10:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR decouples VLM (Vision Language Model) configuration from text LLM configuration, enabling independent configuration of vision models through environment variables. Previously, VLM model selection was hardcoded and tied to LLM settings, preventing users from configuring different models or API endpoints for vision tasks.

Key changes:

  • Introduced dedicated VLM configuration fields (vlm_model, vlm_api_key, vlm_base_url) with fallback to LLM credentials when VLM-specific values are not provided
  • Updated multi-tenant manager to use VLM-specific configuration for vision model creation, replacing hardcoded model references
  • Enhanced environment template with VLM configuration options and documentation

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
src/config.pyAdded required vlm_model field and optional vlm_api_key/vlm_base_url fields to LLMConfig; removed unused os import
src/multi_tenant.pyRenamed ark_* variables to llm_* for clarity; added VLM-specific variables with fallback logic; updated _create_vision_model_func to use dedicated VLM configuration
src/tenant_config.pyExtended _merge_llm_config to include VLM fields in tenant configuration merge, enabling per-tenant VLM overrides
env.exampleAdded VLM_MODEL as required configuration; documented optional VLM_API_KEY and VLM_BASE_URL with fallback behavior explanation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/config.py
Comment on lines +24 to +26
vlm_model: str = Field(..., description="VLM Model Name", alias="VLM_MODEL")
vlm_api_key: Optional[str] = Field(default=None, description="VLM API Key", alias="VLM_API_KEY")
vlm_base_url: Optional[str] = Field(default=None, description="VLM API Base URL", alias="VLM_BASE_URL")

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The VLM fields use explicit aliases (VLM_MODEL, VLM_API_KEY, VLM_BASE_URL) that don't follow the LLM_ prefix defined in the Config class. For these aliases to work correctly, the LLMConfig.Config class needs populate_by_name = True. Without this setting, pydantic-settings will not be able to load these environment variables. Other config classes in this file that use aliases (like DeepSeekOCRConfig at line 158) already include this setting.

Copilot uses AI. Check for mistakes.
Comment threadenv.example
Comment on lines +18 to +19
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation says VLM_MODEL is required (必填), but in the code at src/config.py:24, vlm_model uses Field(...) which makes it required at the pydantic validation level. However, the comment also says it should be "independent from LLM_MODEL" (独立于 LLM_MODEL), but the default value for LLM_MODEL and the example value for VLM_MODEL are both the same: seed-1-6-250615. This creates confusion about whether they should actually be different models. Consider clarifying whether VLM_MODEL can use the same model as LLM_MODEL (for models that support both text and vision), or if they must be different models.

Suggested change
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL,需支持图片输入
VLM_MODEL=seed-vlm-1-6-250615 # 示例:与 LLM_MODEL 不同,需为支持视觉的模型

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

VLM模型配置混乱,硬编码与.env配置不一致

3 participants

@BukeLy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation - #10

Merged
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration
Dec 15, 2025
Merged

Add dedicated VLM model configuration and wire it through multi-tenant VLM creation#10
BukeLy merged 4 commits into
mainfrom
copilot/add-vlm-model-configuration

Conversation

CopilotAI commented Dec 15, 2025

Copy link
Copy Markdown
Contributor

VLM model choice was hardcoded and tied to the text LLM model, preventing .env configuration and clear LLM/VLM separation.

  • Configuration
    • Added required vlm_model to LLMConfig via VLM_MODEL (no fallback defaults).
    • Added optional VLM_API_KEY and VLM_BASE_URL for vendor-independent VLM access; falls back to LLM credentials only when VLM-specific values are absent.
    • Preserved vlm_timeout.
  • Multi-tenant behavior
    • Vision model creation now uses the dedicated VLM model and supports VLM-specific key/base URL with consistent fallback.
    • Tenant config merge includes VLM model/key/base URL to allow per-tenant overrides.
  • Environment template
    • Introduced VLM_MODEL as mandatory and documented optional VLM_API_KEY/VLM_BASE_URL in env.example to expose VLM selection and vendor choice.

Example:

# .envVLM_MODEL=seed-1-6-250615# required, independent from LLM_MODEL# VLM_API_KEY=...# VLM_BASE_URL=...# runtime config usageconfig.llm.vlm_model# used for vision model callsconfig.llm.vlm_base_url# VLM-specific endpoint when provided
Original prompt

This section details on the original issue you should resolve

<issue_title>VLM模型配置混乱,硬编码与.env配置不一致</issue_title>
<issue_description>## 问题

  1. LLM_MODEL 在 .env 中配置为 Tongyi-Zhiwen/QwenLong-L1-32B(纯文本模型)
  2. 实际 VLM 模型硬编码在代码中为 seed-1-6-250615(多模态模型)
  3. 没有在 .env 中提供 VLM_MODEL 配置选项

影响

  • 用户无法在 .env 中配置 VLM 模型
  • LLM 和 VLM 的区别不明显,容易混淆
  • 不符合多租户配置的"配置即代码"原则

代码位置

  • /src/multi_tenant.py 第276-369行:VLM 函数硬编码使用 LLM 配置中的模型
  • /src/config.py:缺少 VLM_MODEL 配置字段
  • .env 第17行:只有 LLM_MODEL,没有 VLM_MODEL

建议修复

  1. .env 中添加独立的 VLM_MODEL 配置项
  2. 在 config.py 中为 LLMConfig 添加 vlm_model 字段
  3. 更新多租户实例创建逻辑,使用 vlm_model 而不是 llm 的 model</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
CopilotAI changed the title [WIP] Add VLM model configuration to .env and codeAdd dedicated VLM model configuration and wire it through multi-tenant VLM creationDec 15, 2025
CopilotAI requested a review from BukeLyDecember 15, 2025 09:46

@BukeLyBukeLy left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

按照Comment的来改进

Comment threadsrc/config.py Outdated
api_key: str = Field(..., description="LLM API Key")
base_url: str = Field(..., description="LLM API Base URL")
model: str = Field(default="seed-1-6-250615", description="LLM Model Name")
vlm_model: str = Field(default="seed-1-6-250615", description="VLM Model Name")

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个还是默认回退到seed了,user不设置不一定用这个.直接去掉默认行为,不设置就报错

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已改为必填且仅使用 VLM_MODEL 配置,不再回退默认值(e5548d2)。

Comment threadsrc/config.py Outdated
Comment on lines +41 to +50
def _load_vlm_model(cls, v):
"""
优先读取独立的 VLM_MODEL(保持与 LLM 文本模型解耦)
回退顺序:
1) 显式传入值
2) 环境变量 VLM_MODEL(独立配置)
3) 环境变量 LLM_VLM_MODEL(前缀形式)
4) 默认值
"""
return v or os.getenv("VLM_MODEL") or os.getenv("LLM_VLM_MODEL") or "seed-1-6-250615"

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么要多级回退?我们只兼容一个配置,不引入额外的复杂性

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已去掉多级回退,仅接受独立的 VLM_MODEL(e5548d2)。

Comment threadsrc/multi_tenant.py Outdated

# 从配置中提取参数(支持租户覆盖)
model = llm_config.get("model", self.ark_model)
model = llm_config.get("vlm_model", self.ark_vlm_model)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ark_model是什么?你还在用火山的命名方式吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已移除 ark 命名,统一使用 llm/vlm 前缀并保持含义清晰(e5548d2)。

Comment threadenv.example
Comment on lines 15 to 22
LLM_BASE_URL="https://ark.ap-southeast.bytepluses.com/api/v3"
# 使用的模型名称
LLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(与 LLM_MODEL 解耦)
VLM_MODEL=seed-1-6-250615
# LLM 供应商标识(ark/openai/claude)
LLM_PROVIDER=ark
# VLM 图片理解 API 超时时间(秒,默认 120 秒)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LLM和VLM难道不可以换供应商吗?难道一定要用LLM的Base URL吗?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已支持 VLM 独立的 API Key/Base URL(env 示例已添加 VLM_API_KEY/VLM_BASE_URL),不再强制复用 LLM Base URL(e5548d2)。

@BukeLy

Copy link
Copy Markdown
Owner

@copilot 修改Review出来的问题 #10 (review)

CopilotAIand others added 2 commits December 15, 2025 09:59
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
Co-authored-by: BukeLy <19304666+BukeLy@users.noreply.github.com>
@BukeLy
BukeLy marked this pull request as ready for review December 15, 2025 10:12
CopilotAI review requested due to automatic review settings December 15, 2025 10:12
@BukeLy
BukeLy merged commit f7e2565 into mainDec 15, 2025
7 checks passed
@BukeLy
BukeLy deleted the copilot/add-vlm-model-configuration branch December 15, 2025 10:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR decouples VLM (Vision Language Model) configuration from text LLM configuration, enabling independent configuration of vision models through environment variables. Previously, VLM model selection was hardcoded and tied to LLM settings, preventing users from configuring different models or API endpoints for vision tasks.

Key changes:

  • Introduced dedicated VLM configuration fields (vlm_model, vlm_api_key, vlm_base_url) with fallback to LLM credentials when VLM-specific values are not provided
  • Updated multi-tenant manager to use VLM-specific configuration for vision model creation, replacing hardcoded model references
  • Enhanced environment template with VLM configuration options and documentation

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
src/config.pyAdded required vlm_model field and optional vlm_api_key/vlm_base_url fields to LLMConfig; removed unused os import
src/multi_tenant.pyRenamed ark_* variables to llm_* for clarity; added VLM-specific variables with fallback logic; updated _create_vision_model_func to use dedicated VLM configuration
src/tenant_config.pyExtended _merge_llm_config to include VLM fields in tenant configuration merge, enabling per-tenant VLM overrides
env.exampleAdded VLM_MODEL as required configuration; documented optional VLM_API_KEY and VLM_BASE_URL with fallback behavior explanation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/config.py
Comment on lines +24 to +26
vlm_model: str = Field(..., description="VLM Model Name", alias="VLM_MODEL")
vlm_api_key: Optional[str] = Field(default=None, description="VLM API Key", alias="VLM_API_KEY")
vlm_base_url: Optional[str] = Field(default=None, description="VLM API Base URL", alias="VLM_BASE_URL")

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The VLM fields use explicit aliases (VLM_MODEL, VLM_API_KEY, VLM_BASE_URL) that don't follow the LLM_ prefix defined in the Config class. For these aliases to work correctly, the LLMConfig.Config class needs populate_by_name = True. Without this setting, pydantic-settings will not be able to load these environment variables. Other config classes in this file that use aliases (like DeepSeekOCRConfig at line 158) already include this setting.

Copilot uses AI. Check for mistakes.
Comment threadenv.example
Comment on lines +18 to +19
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615

CopilotAIDec 15, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation says VLM_MODEL is required (必填), but in the code at src/config.py:24, vlm_model uses Field(...) which makes it required at the pydantic validation level. However, the comment also says it should be "independent from LLM_MODEL" (独立于 LLM_MODEL), but the default value for LLM_MODEL and the example value for VLM_MODEL are both the same: seed-1-6-250615. This creates confusion about whether they should actually be different models. Consider clarifying whether VLM_MODEL can use the same model as LLM_MODEL (for models that support both text and vision), or if they must be different models.

Suggested change
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL)
VLM_MODEL=seed-1-6-250615
# 用于多模态图片理解的 VLM 模型(必填,独立于 LLM_MODEL,需支持图片输入
VLM_MODEL=seed-vlm-1-6-250615 # 示例:与 LLM_MODEL 不同,需为支持视觉的模型

Copilot uses AI. Check for mistakes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

VLM模型配置混乱,硬编码与.env配置不一致

3 participants

@BukeLy