Commit Graph

1414 Commits

Author SHA1 Message Date
wwq
3227c25b07 fix(quota): fix tenant ID retrieval and QPS counting logic
- Fix issue where tenant ID lookup from shared records failed to query the workspace correctly.
- Switch QPS counting from sliding window to simple counter to improve performance and simplify logic.
- Remove unnecessary `time` module import.
2026-04-20 18:10:28 +08:00
wwq
08b5c7bc8a perf(限流服务): 优化Redis查询以减少命令数量
使用zcount替代zremrangebyscore和zcard组合查询,减少一次Redis操作
2026-04-20 17:46:05 +08:00
wwq
b03300c804 refactor(rate_limit): refactor API Key rate limiting and remove tenant-level QPS check
- Streamline rate limit check flow by removing redundant tenant-level QPS checks.
- Restrict checks to API Key QPS and plan degradation protection only.
- Update constant naming and error message handling for consistency.
2026-04-20 17:18:05 +08:00
wwq
c448cf0660 refactor(rate-limit): change rate limiting granularity from tenant to API Key
- Refactor rate limiting mechanism to limit per API Key instead of per tenant (workspace).
- Update error code logic and Redis key naming conventions.
- Adjust quota usage statistics to display the QPS of the API Key closest to its limit.
2026-04-20 16:13:30 +08:00
wwq
48f3d9b105 feat(quota): refactor quota management and rate limiting services
- Add `API_KEY_RATE_LIMIT_EXCEEDED` error code.
- Refactor `QuotaExceededError` to support resource type localization.
- Optimize rate limiting service by implementing the sliding window algorithm.
- Add rate limit validation for tenant plans.
- Unify quota check decorator to support both synchronous and asynchronous operations.
- Enhance quota usage statistics endpoints.
2026-04-20 15:10:12 +08:00
山程漫悟
81d58b001f Merge pull request #931 from wanxunyang/develop-wxy
**fix(tenant_subscription): correct quota field name from quota to quotas**
2026-04-17 18:45:44 +08:00
wwq
99bc84a9f2 feat(workflow): 增强工作流节点解析功能
添加工作流节点解析方法,支持工具和知识库ID的匹配与验证
改进知识库和工具解析逻辑,优先匹配ID并处理共享资源
2026-04-17 18:34:15 +08:00
Timebomb2018
d4a1904b19 refactor(workflow): rename condition variables to expression in if-else node logic 2026-04-17 18:02:48 +08:00
Timebomb2018
fb93c509f4 refactor(workflow): simplify if-else node condition structure by removing nested condition groups
The changes remove the `ConditionGroup` abstraction and flatten condition expressions directly under `ConditionBranchConfig.expressions`. This simplifies the data model and evaluation logic, eliminating redundant grouping layers while preserving all functionality. The migration logic and group-level operators are removed as they are no longer needed.

BREAKING CHANGE: `ConditionBranchConfig.expressions` now expects a flat list of `ConditionDetail` instead of `ConditionGroup`; existing configurations must be updated to use direct condition lists.
2026-04-17 17:46:49 +08:00
Timebomb2018
62c721bdf6 feat(workflow): support array[file] field-level conditions in if-else nodes
Added support for evaluating conditions on individual fields of file objects within array[file] variables. Extended variable pool to extract fields from array elements, introduced new condition models (SubVariableConditionItem, SubVariableCondition, ConditionGroup), and added ArrayFileContainsOperator to handle contains/not_contains logic with nested sub-conditions. Includes backward compatibility migration for legacy flat expressions.
2026-04-17 17:27:51 +08:00
wwq
d5272af76f fix(tenant_subscription): 修正配额字段名称从quota改为quotas 2026-04-17 14:41:44 +08:00
Timebomb2018
377ddd2b9b fix(llm): unify JSON output handling across providers and fix tool+json_output compatibility
- Remove redundant `response_format` injection for VOLCANO provider since it's unsupported; rely on system prompt injection instead
- Extend system prompt JSON injection logic to cover VOLCANO and tool-enabled cases universally
- Simplify model parameter construction by removing redundant `params["model_kwargs"] = model_kwargs` assignments
- Refactor `CompatibleChatOpenAI._get_request_payload` to strip `response_format` when tools are present, avoiding strict validation errors in langchain_openai
- Fix timestamp calculation order in `datetime_tool.py` to avoid integer truncation before multiplication
2026-04-17 14:19:40 +08:00
山程漫悟
e3d0602850 Merge pull request #920 from wanxunyang/feat/quota-check-decorator
feat(tenant): add public subscription plan list endpoint and enhance plan information
2026-04-17 11:47:34 +08:00
wxy
696b2d2417 fix(knowledge_service): 修正知识创建时模型类型过滤条件
移除IMAGE类型过滤,仅保留CHAT类型,确保只筛选出支持视觉能力的聊天模型
2026-04-17 11:38:45 +08:00
wxy
a5613314b8 refactor(agent): 将重置模型参数接口改为获取默认参数
移除不再使用的重置模型参数功能,将POST接口改为GET接口以获取默认参数
2026-04-17 11:34:11 +08:00
wxy
26a3d8a41b refactor(agent): refactor Agent model parameters reset logic and add environment variable support
Split reset_agent_config into two independent methods for getting and resetting model parameters
Add functionality to read quota configuration from environment variables to the default free tier
2026-04-17 11:00:22 +08:00
Ke Sun
2380cd55ef Merge pull request #918 from SuanmoSuanyangTechnology/fix/extract-metadata
refactor(memory): switch metadata extraction from full-replace to inc…
2026-04-17 10:58:51 +08:00
wxy
a105df33ab Merge remote-tracking branch 'upstream/develop' into feat/quota-check-decorator 2026-04-17 10:38:24 +08:00
wxy
f883c1469d feat(quota management): add end-user quota check for shared conversations
fix(default free plan): adjust free plan quota limits

feat(application service): add functionality to reset Agent model parameters to default values
2026-04-16 19:35:52 +08:00
wxy
915cb54f21 feat(tenant): add public subscription plan list endpoint and enhance plan information
Add a public subscription plan list endpoint that can be accessed without authentication. Enhance the returned subscription plan information fields, including multi-language support and default free plan fallback logic. Additionally, implement automatic model binding for the knowledge base service.
2026-04-16 17:54:50 +08:00
Timebomb2018
e1f8ad871b refactor(model): replace qwen-vl-plus-latest with json_output capability in dashscope_models.yaml 2026-04-16 17:47:47 +08:00
Timebomb2018
ccdf7ae81d refactor(model): replace VolcanoChatOpenAI with CompatibleChatOpenAI for unified omni model support 2026-04-16 17:40:30 +08:00
lanceyq
643f69bb90 refactor(memory): tighten metadata field types and clean up descriptions
- Use Literal['set', 'remove'] for MetadataFieldChange.action instead of str
- Simplify field_path description to reflect current schema
- Remove redundant isinstance check in extract_user_metadata_task
2026-04-16 17:29:00 +08:00
lanceyq
73fbc19747 refactor(memory): switch metadata extraction from full-replace to incremental changes
- Replace UserMetadata full-object overwrite with incremental MetadataFieldChange
  operations (set/remove per field path)
- Convert profile.role and profile.domain from scalar strings to lists
- Remove UserMetadataBehavioralHints and knowledge_tags fields
- Update Jinja2 prompt to instruct LLM to output incremental changes
- Update extract_user_metadata_task to apply changes via deep-copy and
  per-field mutation for proper SQLAlchemy change detection
- Minor lint: remove unnecessary f-string prefixes in tasks.py
2026-04-16 17:14:30 +08:00
Timebomb2018
7ba0726473 refactor(model): remove mutual exclusion logic between json_output and deep_thinking 2026-04-16 16:36:15 +08:00
Timebomb2018
8c6b65db12 feat(llm): add json_output support for structured LLM responses 2026-04-16 16:27:55 +08:00
Mark
5ce0bdb0f5 Merge pull request #899 from wanxunyang/feature/add-quota-check-decorator
Feature/add quota check decorator
2026-04-16 13:48:40 +08:00
wwq
b59e2b5bcd fix(model): fix issue where associated model config status was not updated when deleting API Key
When deleting an API Key, check if the associated model configuration has other active keys; if not, automatically set it to inactive.
Also optimize the model configuration query method to support multi-type queries and add sorting conditions.
2026-04-16 13:35:35 +08:00
Mark
c7230659e3 Merge branch 'release/v0.3.0' into develop
* release/v0.3.0: (44 commits)
  Revert "fix(web): prompt editor"
  fix(web): prompt editor
  fix(prompt-optimizer): handle escaped quotes in JSON parsing
  fix(custom-tools): remove parameter coercion in custom tool base class
  fix(core): conditionally apply thinking parameters based on model support
  refactor(custom-tools): coerce query and request body parameters to schema types
  fix(prompt-optimizer): support list content type in prompt optimizer
  refactor(memory): unify user placeholder names and harden alias sync logic
  fix(rag): replace semicolon separators with newlines in Excel parser output
  fix(web): Compatible with Windows whitespace
  fix(memory): make PgSQL the single source of truth for user entity aliases
  refactor(rag): simplify Excel parsing logic and remove redundant chunk_token_num assignment
  fix(web): Hide error message when workflow node error message equals empty string
  ci(wechat-notify): add Sourcery summary extraction with Qwen fallback
  fix(http-request,embedding,naive): tighten form-data validation, reduce truncation length to 8000, and disable chunking for Excel
  fix(web): adjust the value of End User Name
  fix(http-request): support array and file variables in form-data files upload
  fix(web): change http body key name
  fix(web): header user name
  fix(web): calculate using the filtered breadcrumbs length
  ...

# Conflicts:
#	web/src/views/UserMemoryDetail/Neo4j.tsx
#	web/src/views/UserMemoryDetail/components/EndUserProfile.tsx
#	web/src/views/UserMemoryDetail/types.ts
2026-04-15 19:31:38 +08:00
wwq
1faa258e23 feat(quota): implement unified quota management system and add community free plan
- Add `default_free_plan.py` to define the configuration for the Community Free Plan.
- Refactor `quota_stub.py` as a unified entry point, delegating checks to `core/quota_manager`.
- Implement core logic in `quota_manager.py` to support retrieving quotas from the premium module or configuration files.
- Update `tenant_subscription_controller` to return Community Free Plan information.
2026-04-15 18:48:09 +08:00
Timebomb2018
cc12ec3fa8 fix(workflow): support direct variable reference in tool parameters to preserve native types 2026-04-15 18:03:39 +08:00
Ke Sun
bfb723a468 Merge pull request #903 from SuanmoSuanyangTechnology/pref/prompt_optim
pref(prompt-optimizer): handle escaped quotes in JSON parsing
2026-04-15 14:05:18 +08:00
Eternity
ed765b7c26 fix(prompt-optimizer): handle escaped quotes in JSON parsing 2026-04-15 13:59:55 +08:00
Timebomb2018
3018d186f7 fix(custom-tools): remove parameter coercion in custom tool base class 2026-04-15 13:56:08 +08:00
Timebomb2018
737858731b fix(core): conditionally apply thinking parameters based on model support 2026-04-15 12:24:11 +08:00
Timebomb2018
daaee63bd5 refactor(custom-tools): coerce query and request body parameters to schema types 2026-04-15 12:15:16 +08:00
Eternity
017efdc320 fix(prompt-optimizer): support list content type in prompt optimizer 2026-04-15 11:03:44 +08:00
Ke Sun
29aef4527c Merge pull request #896 from SuanmoSuanyangTechnology/fix/extract-aliases
fix(memory): make PgSQL the single source of truth for user entity al…
2026-04-14 18:40:40 +08:00
wxy
18be1a9f89 feat(tenant): add tenant package query endpoint
Add tenant package query functionality. Regular users can access this endpoint to retrieve their tenant's package information.
2026-04-14 18:14:45 +08:00
lanceyq
49e0801d15 refactor(memory): unify user placeholder names and harden alias sync logic
- Replace hardcoded user placeholder name lists in write_tools and
user_memory_service with shared _USER_PLACEHOLDER_NAMES constant
- Filter user placeholder names during alias merging in _merge_attribute
  to prevent cross-role alias contamination on non-user entities
- Use toLower() in Cypher query for case-insensitive name matching
- Change PgSQL->Neo4j alias sync condition from 'if pg_aliases' to
  'if info is not None' so empty aliases correctly clear stale data
2026-04-14 18:06:56 +08:00
Timebomb2018
441b21774d fix(rag): replace semicolon separators with newlines in Excel parser output 2026-04-14 17:56:30 +08:00
lanceyq
811193dd75 fix(memory): make PgSQL the single source of truth for user entity aliases
- Skip alias merging for user entities during dedup (_merge_attribute and
  _merge_entities_with_aliases) to prevent dirty data from overwriting
  PgSQL authoritative aliases
- Add PgSQL→Neo4j alias sync after Neo4j write in write_tools to
  ensure Neo4j user entities always reflect the PgSQL source
- Remove deduped_aliases (Neo4j history) from alias sync in
  extraction_orchestrator, only append newly extracted aliases to PgSQL
- Guard Neo4j MERGE cypher to preserve existing aliases for user
  entities (name IN ['用户','我','User','I'])
- Fix emotion_analytics_service query to use ExtractedEntity label
  and entity_type property
2026-04-14 17:28:24 +08:00
Timebomb2018
75e95bab01 refactor(rag): simplify Excel parsing logic and remove redundant chunk_token_num assignment 2026-04-14 17:10:52 +08:00
Timebomb2018
e3265e4ba3 fix(http-request,embedding,naive): tighten form-data validation, reduce truncation length to 8000, and disable chunking for Excel
The form-data validation now ensures all items in the list are of type HttpFormData. Truncation length for embedding inputs is reduced from 8191 to 8000 to accommodate tokenizer differences and avoid overflow. Excel parsing now disables chunking by setting chunk_token_num to 0, aligning with intended behavior for structured file ingestion.
2026-04-14 16:14:01 +08:00
Timebomb2018
0965008210 fix(http-request): support array and file variables in form-data files upload
- Updated form-data handling to accept both single FileVariable and ArrayVariable containing FileVariable for file uploads
- Fixed HTTP client redirect handling by enabling follow_redirects=True when downloading remote files
- Adjusted config validation to correctly require list type for form-data fields instead of HttpFormData class
2026-04-14 15:53:16 +08:00
Timebomb2018
2450fe3afe refactor(workflow): move _merge_conv_vars call inside iteration loop for consistent state updates 2026-04-13 19:00:36 +08:00
Timebomb2018
7ca80b5d01 perf(app): optimize FileMetadata queries by batching lookups
Multiple services were performing individual database queries for FileMetadata when resolving missing file names/sizes. This change batches the queries using `in_()` to reduce database round trips and improve performance.
2026-04-13 18:52:43 +08:00
lanceyq
9470dd2f1e refactor(memory): extract shared MemorySummary count query and replace magic number
- Move duplicated Neo4j MemorySummary count query into
  MemoryBaseService.get_valid_memory_summary_count()
- Introduce MIN_MEMORY_SUMMARY_COUNT constant to replace hardcoded 5
- Fix import ordering in implicit_emotions_storage_repository
- Use UTC consistently for date calculations (remove CST offset,
  datetime.now → datetime.utcnow)
2026-04-13 18:47:56 +08:00
Timebomb2018
10f1089198 feat(workflow): refactor iteration runtime to support independent subgraph per task
feat(app): support file metadata in chat messages and DSL app overwrite
- Extended chat message file objects with `name`, `size`, and `file_type` fields across app_chat_service and workflow_service
- Added ability to overwrite existing app configurations via DSL import in app_dsl_service, including type validation and config update logic for AgentConfig, MultiAgentConfig, and WorkflowConfig
2026-04-13 18:38:12 +08:00
lanceyq
ef8c7093b5 refactor(memory): use MemorySummary node count for implicit memory metrics
- Replace Statement-based implicit memory count (count/3) with actual
  MemorySummary node count filtered by DERIVED_FROM_STATEMENT relationship
- Add minimum threshold of 5 MemorySummary nodes before reporting data
- Add _build_empty_profile() to return structured empty profile when
  insufficient data exists, skipping unnecessary LLM calls
2026-04-13 18:32:43 +08:00