mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-08-05 15:20:30 +08:00
feat(agent): Go port — canvas engine, 22 components, DSL v2, 13 endpoints (#15952)
Ports the agent canvas subsystem from Python to Go.
## What's included
### Canvas Engine (Phase 0/1)
- State engine, scheduler, variable resolver, Redis checkpoint store,
cancel protocol
- **209 tests** across canvas / component / io packages
### 22 Components (P0–P4)
| Tier | Components |
|---|---|
| P0 T1+T2+T3 | LLM, Agent, ExitLoop, Switch, Categorize, Begin,
Message, Invoke |
| P1 T3 | VariableAggregator, VariableAssigner, StringTransform,
ListOperations, DataOperations |
| P2 T3 | Iteration, IterationItem, Loop, LoopItem |
| P3 T3 | UserFillUp, Fillup |
| P4 T5 | Browser, ExcelProcessor, DocsGenerator |
### DSL v2 Schema (Phase 2.5)
- Typed v2 in-memory model with v1-to-v2 auto-detect converter
- v1 legacy field stripping per plan §2.11.7
### HTTP Endpoints & Bug Fixes (Plans PR1–PR3)
- **DELETE SQL bug fix**: gorm v2 `Where("id = ?", id).Delete(...)`
pattern
- **CreateAgent validation**: title/DSL required, duplicate check, 103
envelope
- **13 new endpoints**: templates, prompts, tags, sessions CRUD,
chat/completions (SSE + non-stream stubs), rerun, test_db_connection,
logs, webhook/logs
- **756 Go unit tests** (745 → 756, +18)
- **17 → 0 Python integration test failures** (test_agents.py +
test_session_management/)
### Tools
21 eino tools: HTTPHelper, search tools, financial/data tools, mandatory
stubs
### Infrastructure
OTel observability, NATS message queue, DeepDoc gRPC client, SSRF
guards, IDOR mitigation
This commit is contained in:
@@ -356,7 +356,11 @@ func (pm *ProviderManager) ListProviders() ([]map[string]interface{}, error) {
|
||||
}
|
||||
}
|
||||
|
||||
var modelTypes []string
|
||||
// Always emit a non-nil slice. Python's provider_api_service.list_providers
|
||||
// returns `[]` for empty model_types; clients (e.g. AvailableModels in
|
||||
// web/src/pages/user-setting/setting-model/components/un-add-model.tsx)
|
||||
// call .some() / .forEach() on this field, which crashes on null.
|
||||
modelTypes := make([]string, 0, len(modelTypeSet))
|
||||
for modelType := range modelTypeSet {
|
||||
modelTypes = append(modelTypes, modelType)
|
||||
}
|
||||
@@ -448,10 +452,24 @@ func (pm *ProviderManager) ListModels(providerName string) ([]map[string]interfa
|
||||
|
||||
modelList := []map[string]interface{}{}
|
||||
for _, model := range provider.Models {
|
||||
// Field name "model_type" (singular) matches the IInstanceModel
|
||||
// contract in web/src/interfaces/database/llm.ts:75 and Python's
|
||||
// LLM.to_dict() (api/db/db_models.py). The Go port previously
|
||||
// emitted the plural "model_types", which broke used-model.tsx
|
||||
// — the view rendered empty because the "model_type" key was
|
||||
// undefined. IAvailableProvider.model_types (plural) is the
|
||||
// other interface used by un-add-model.tsx and continues to
|
||||
// receive the plural form from the dedicated /api/v1/providers/
|
||||
// handler.
|
||||
//
|
||||
// `max_dimension` and `dimensions` are always emitted (nil → null,
|
||||
// empty slice → null in JSON) to match Python's LLM.to_dict() and
|
||||
// keep the response shape stable for clients that destructure
|
||||
// the object.
|
||||
modelData := map[string]interface{}{
|
||||
"name": model.Name,
|
||||
"max_tokens": model.MaxTokens,
|
||||
"model_types": model.ModelTypes,
|
||||
"model_type": model.ModelTypes,
|
||||
"max_dimension": model.MaxDimension,
|
||||
"dimensions": model.Dimensions,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user