gen() try/except re-raised internal errors from uapi_request → 500 response.
Moved refund_balance to uapi_request's except block where errors are properly
handled (yield error, normal generator exit).
Two getID() calls per request (DSPY + uapi_request) under 200 concurrent
caused nanoid random state corruption → 34% duplicate IDs → IntegrityError.
uuid4 uses OS entropy, independent of nanoid state.
- balance.py: reserve_balance/finalize_balance/refund_balance with Lua
- utils.py: get_model_max_cost from llmusage history, update_model_max_cost
- init.py: register reserve_balance, finalize_balance, refund_balance on env
- chat/completions/index.dspy: reserve before inference, refund on exception
- DB migration: llm.max_cost DECIMAL(10,4) for historical max charge
The ad5d8c0 commit had line number prefixes (1|, 2|, ...) baked into
file content. Also fixed cache call bugs:
- params_kw.model or 'qwen3-max' -> params_kw.model
- 'ktv_pipeline' hardcoded -> catelogid variable
- extra tab before params_kw.llmcatelogid
- missing f-string braces in debug()
- wwwroot/v1/video/generations/index.dspy: video generation endpoint
Required params: model, llmcatelogid, prompt
Supports async task submission via existing inference infrastructure
- wwwroot/v1/image/generations/index.dspy: image generation endpoint
Required params: model, llmcatelogid, prompt
Supports both sync and async models depending on config
Both endpoints follow the same pattern as /v1/chat/completions:
1. Validate required params (model + llmcatelogid + prompt)
2. Look up llm via llm_api_map join with catalog type
3. Check customer balance
4. Route to inference (async/sync based on model config)
- Create llm_catalog_rel model for one-to-many relationship
- Remove llmcatelogid from llm model
- Update SQL queries in utils.py and dspy files to use join
- Add maintenance UI (llm_catalog_rel_manage.ui) and API endpoints
- Filter options by user's orgid