Fix(Go): prevent global state pollution in local model connection check (#14669)

### What problem does this PR solve?

1. **Fix Global State Pollution in Local Providers (Critical Bug):** -
Resolved a severe concurrency and architecture issue in
`model_service.go`. Previously, `ListSupportedModels` would permanently
overwrite the global provider singleton with a localized URL instance
(`driver.NewInstance`). This caused cross-request contamination in
multi-tenant environments.
- Fixed `CheckProviderConnection` for local models (LM Studio, vLLM,
Ollama). It now properly creates a localized driver copy and injects the
`base_url` before testing the connection, entirely eliminating the
false-positive `missing base URL` error without polluting the global
state.
2. **Implement `VolcEngine` Embeddings:** - Fully implemented the
`Encode` method for the `volcengine` provider, enabling text embedding
capabilities for VolcEngine models.
3. **Enhance Region Validation in `SiliconFlow`:** - Added a strict
empty string check (`*apiConfig.Region != ""`) alongside the existing
`nil` check when parsing regions. This ensures that if an empty string
is passed, the system safely falls back to the `"default"` region,
preventing malformed URL requests and `unsupported protocol scheme`
errors.

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
Haruko386
2026-05-08 15:54:27 +08:00
committed by GitHub
parent ee5ae6f1a4
commit 94f82acd03
8 changed files with 132 additions and 82 deletions

View File

@@ -1764,16 +1764,7 @@ func (c *RAGFlowClient) ChatToModel(cmd *Command) (ResponseIf, error) {
resp, err := c.HTTPClient.Request("POST", url, "web", nil, payload)
if err != nil {
if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) {
return nil, fmt.Errorf("connection closed (EOF): upstream overloaded or proxy timeout: %w", err)
}
var netErr net.Error
if errors.As(err, &netErr) && netErr.Timeout() {
return nil, fmt.Errorf("request timeout: model took too long to respond: %w", err)
}
return nil, fmt.Errorf("request failed: %w", err)
return nil, formatRequestError("Chat request", err)
}
if resp.StatusCode != 200 {
@@ -2407,3 +2398,21 @@ func (c *RAGFlowClient) RemoveChunks(cmd *Command) (ResponseIf, error) {
result.Duration = 0
return &result, nil
}
// formatRequestError Uniformly handle and format network errors in HTTP requests
func formatRequestError(action string, err error) error {
if err == nil {
return nil
}
var netErr net.Error
switch {
case errors.Is(err, io.EOF), errors.Is(err, io.ErrUnexpectedEOF):
return fmt.Errorf("%s failed - connection closed (EOF): upstream overloaded or proxy timeout: %w", action, err)
case errors.As(err, &netErr) && netErr.Timeout():
return fmt.Errorf("%s failed - request timeout: server took too long to respond: %w", action, err)
default:
return fmt.Errorf("%s failed: %w", action, err)
}
}