Skip to content

Commit 9e1d8ff

Browse files
WMC001xuyaqisthhhhsc701Jasonxia007
authored
Release/v2.2.1 (#3275)
* 🐛 Bugfix: Adjust agent detail UI layout to accommodate newly added "self-verification" field (#3246) * Move non-shadcn ui component to other folder * Bugfix: Fix incomplete display of tenant resources page after window resize * Bugfix: Fix incomplete display of tenant resources page after window resize * Bugfix: Fix inability to select agent from agent space to edit * Bugfix: Display correct version info when viewing agent details * Bugfix: Adjust agent detail UI layout to accommodate newly added "self-verification" field * 补充sql (#3248) * 补充sql * 扩大limit限制 * 🐛 Bugfix: Fixed an issue where the MCP service failed to start in a Kubernetes container. (#3254) [Specification Details] 1. Modify the pod naming logic to convert all non-compliant characters to -. 2. Modify test cases. * 🐛 Bugfix: knowledge_base_search_tool called with TypeError: argument of type 'FieldInfo' is not iterable (#3259) * 🐛 Bugfix: Fixed an issue where the one-click rename function failed after importing an agent. (#3258) [Specification Details] 1. The frontend does not pass `agent_id` when calling the `regenerate_name` API. * Bugfix: Exclude attachments from assistant when saving conversation history (#3261) * Bump APP_VERSION from v2.2.0 to v2.2.1 (#3268) The default setting for client-side self-validation is "False". --------- Co-authored-by: xuyaqi <xuyaqist@gmail.com> Co-authored-by: hhhhsc701 <56435672+hhhhsc701@users.noreply.github.com> Co-authored-by: Xia Yichen <iamjasonxia@126.com>
2 parents 2b1ae47 + f5bbab1 commit 9e1d8ff

18 files changed

Lines changed: 633 additions & 30 deletions

File tree

backend/consts/const.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ def _parse_otlp_headers(headers_str: str) -> dict:
486486

487487

488488
# APP Version
489-
APP_VERSION = "v2.2.0"
489+
APP_VERSION = "v2.2.1"
490490

491491

492492
# Skill Creation Streaming Configuration

backend/services/conversation_management_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def save_conversation_assistant(request: AgentRequest, messages: List[str], user
235235
message_list.append(message)
236236

237237
conversation_req = MessageRequest(conversation_id=request.conversation_id, message_idx=user_role_count * 2 + 1,
238-
role=MESSAGE_ROLE["ASSISTANT"], message=message_list, minio_files=request.minio_files)
238+
role=MESSAGE_ROLE["ASSISTANT"], message=message_list, minio_files=None)
239239
save_message(conversation_req, user_id=user_id, tenant_id=tenant_id)
240240

241241

docker/sql/v2.2.0_0601_add_preserve_source_file_to_knowledge_record_t.sql renamed to docker/sql/v2.2.1_0601_add_preserve_source_file_to_knowledge_record_t.sql

File renamed without changes.

docker/sql/v2.2.0_0603_add_greeting_fields_to_ag_tenant_agent_t.sql renamed to docker/sql/v2.2.1_0603_add_greeting_fields_to_ag_tenant_agent_t.sql

File renamed without changes.
File renamed without changes.

docker/sql/v2.2.0_0609_add_selected_agent_version_no_to_agent_relation_t.sql renamed to docker/sql/v2.2.1_0609_add_selected_agent_version_no_to_agent_relation_t.sql

File renamed without changes.

frontend/app/[locale]/agents/components/agentInfo/AgentGenerateDetail.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ export default function AgentGenerateDetail({}) {
171171
constraintPrompt: editedAgent.constraint_prompt || "",
172172
fewShotsPrompt: editedAgent.few_shots_prompt || "",
173173
provideRunSummary: editedAgent.provide_run_summary || false,
174-
verificationEnabled: editedAgent.verification_config?.enabled ?? true,
174+
verificationEnabled: editedAgent.verification_config?.enabled ?? false,
175175
businessDescription: editedAgent.business_description || "",
176176
businessLogicModelName:editedAgent.business_logic_model_name,
177177
businessLogicModelId: editedAgent.business_logic_model_id,
@@ -809,7 +809,7 @@ export default function AgentGenerateDetail({}) {
809809
</Can>
810810

811811
<Row gutter={16}>
812-
<Col span={8}>
812+
<Col span={12}>
813813
<Form.Item
814814
name="agentAuthor"
815815
label={t("agent.author")}
@@ -828,7 +828,7 @@ export default function AgentGenerateDetail({}) {
828828
/>
829829
</Form.Item>
830830
</Col>
831-
<Col span={8}>
831+
<Col span={12}>
832832
<Form.Item
833833
name="mainAgentModel"
834834
label={t("businessLogic.config.model")}
@@ -875,7 +875,7 @@ export default function AgentGenerateDetail({}) {
875875
</Row>
876876

877877
<Row gutter={16}>
878-
<Col span={12}>
878+
<Col span={8}>
879879
<Form.Item
880880
name="mainAgentMaxStep"
881881
label={t("businessLogic.config.maxSteps")}
@@ -903,7 +903,7 @@ export default function AgentGenerateDetail({}) {
903903
/>
904904
</Form.Item>
905905
</Col>
906-
<Col span={12}>
906+
<Col span={8}>
907907
<Form.Item
908908
name="provideRunSummary"
909909
label={t("agent.provideRunSummary")}

frontend/components/agent/AgentImportWizard.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,6 @@ export default function AgentImportWizard({
393393
items: agentsWithConflicts.map(([agentKey, conflict]) => {
394394
const agentInfo = initialData.agent_info[agentKey] as any;
395395
return {
396-
agent_id: agentInfo?.agent_id,
397396
name: conflict.renamedName || agentInfo?.name || "",
398397
display_name: conflict.renamedDisplayName || agentInfo?.display_name || "",
399398
task_description: agentInfo?.business_description || agentInfo?.description || "",

k8s/helm/deploy.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ apply() {
611611
sleep 5
612612
for svc in $backend_services; do
613613
echo " Waiting for nexent-$svc..."
614-
if kubectl wait --for=condition=ready pod -l app=nexent-$svc -n $NAMESPACE --timeout=300s 2>/dev/null; then
614+
if kubectl rollout status "deployment/nexent-$svc" -n "$NAMESPACE" --timeout=300s >/dev/null 2>&1; then
615615
echo " nexent-$svc is ready."
616616
else
617617
echo " Error: nexent-$svc did not become ready within timeout."

k8s/helm/nexent/charts/nexent-common/files/init.sql

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1896,3 +1896,210 @@ COMMENT ON TABLE nexent.user_cas_session_t IS 'Server-side session records for C
18961896
COMMENT ON COLUMN nexent.user_cas_session_t.session_id IS 'JWT sid claim for revocation checks';
18971897
COMMENT ON COLUMN nexent.user_cas_session_t.cas_user_id IS 'User identifier returned by CAS';
18981898
COMMENT ON COLUMN nexent.user_cas_session_t.cas_session_index IS 'CAS SessionIndex or service ticket';
1899+
1900+
-- Rename params -> config_values, add config_schemas to ag_skill_info_t
1901+
-- Add tenant_id column for multi-tenancy support
1902+
ALTER TABLE nexent.ag_skill_info_t ADD COLUMN IF NOT EXISTS tenant_id VARCHAR(100);
1903+
1904+
-- Add config_values and config_schemas to ag_skill_info_t
1905+
DO $$
1906+
BEGIN
1907+
IF EXISTS (
1908+
SELECT 1 FROM information_schema.columns
1909+
WHERE table_schema = 'nexent'
1910+
AND table_name = 'ag_skill_info_t'
1911+
AND column_name = 'params'
1912+
) THEN
1913+
ALTER TABLE nexent.ag_skill_info_t RENAME COLUMN params TO config_values;
1914+
END IF;
1915+
END $$;
1916+
ALTER TABLE nexent.ag_skill_info_t ADD COLUMN IF NOT EXISTS config_schemas JSON;
1917+
1918+
-- Comments for ag_skill_info_t columns
1919+
COMMENT ON COLUMN nexent.ag_skill_info_t.tenant_id IS 'Tenant ID for multi-tenancy. NULL for pre-existing skills.';
1920+
COMMENT ON COLUMN nexent.ag_skill_info_t.config_values IS 'Runtime parameter values from config/config.yaml';
1921+
COMMENT ON COLUMN nexent.ag_skill_info_t.config_schemas IS 'Parameter metadata list from config/schema.yaml';
1922+
1923+
-- Add config_values and config_schemas to ag_skill_instance_t
1924+
ALTER TABLE nexent.ag_skill_instance_t ADD COLUMN IF NOT EXISTS config_values JSON;
1925+
ALTER TABLE nexent.ag_skill_instance_t ADD COLUMN IF NOT EXISTS config_schemas JSON;
1926+
1927+
-- Comments for ag_skill_instance_t columns
1928+
COMMENT ON COLUMN nexent.ag_skill_instance_t.config_values IS 'Per-agent runtime parameter values from config/config.yaml';
1929+
COMMENT ON COLUMN nexent.ag_skill_instance_t.config_schemas IS 'Per-agent parameter schema overrides from config/schema.yaml';
1930+
1931+
-- Migration: ASSET_OWNER role permissions and invitation type comment
1932+
-- Date: 2026-05-29
1933+
-- Description: Add ASSET_OWNER role permissions, SU asset-owner invite permissions,
1934+
-- update invitation code_type comment, and ensure ag_skill_info_t.tenant_id exists
1935+
-- Source: commit 15cece97692db2372a978cbdf21b5d5316e79f30 (init.sql)
1936+
1937+
SET search_path TO nexent;
1938+
1939+
BEGIN;
1940+
1941+
COMMENT ON COLUMN nexent.tenant_invitation_code_t.code_type IS
1942+
'Invitation code type: ADMIN_INVITE, DEV_INVITE, USER_INVITE, ASSET_OWNER_INVITE';
1943+
1944+
INSERT INTO nexent.role_permission_t
1945+
(role_permission_id, user_role, permission_category, permission_type, permission_subtype)
1946+
VALUES
1947+
(188, 'SU', 'RESOURCE', 'INVITE.ASSET_OWNER', 'CREATE'),
1948+
(189, 'SU', 'RESOURCE', 'INVITE.ASSET_OWNER', 'READ'),
1949+
(190, 'SU', 'RESOURCE', 'INVITE.ASSET_OWNER', 'UPDATE'),
1950+
(191, 'SU', 'RESOURCE', 'INVITE.ASSET_OWNER', 'DELETE'),
1951+
(192, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/'),
1952+
(193, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/agents'),
1953+
(194, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/knowledges'),
1954+
(195, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/chat'),
1955+
(196, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/space'),
1956+
(197, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/market'),
1957+
(198, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/models'),
1958+
(199, 'ASSET_OWNER', 'RESOURCE', 'AGENT', 'CREATE'),
1959+
(200, 'ASSET_OWNER', 'RESOURCE', 'AGENT', 'READ'),
1960+
(201, 'ASSET_OWNER', 'RESOURCE', 'AGENT', 'UPDATE'),
1961+
(202, 'ASSET_OWNER', 'RESOURCE', 'AGENT', 'DELETE'),
1962+
(203, 'ASSET_OWNER', 'RESOURCE', 'SKILL', 'CREATE'),
1963+
(204, 'ASSET_OWNER', 'RESOURCE', 'SKILL', 'READ'),
1964+
(205, 'ASSET_OWNER', 'RESOURCE', 'SKILL', 'UPDATE'),
1965+
(206, 'ASSET_OWNER', 'RESOURCE', 'SKILL', 'DELETE'),
1966+
(207, 'ASSET_OWNER', 'RESOURCE', 'KB', 'CREATE'),
1967+
(208, 'ASSET_OWNER', 'RESOURCE', 'KB', 'READ'),
1968+
(209, 'ASSET_OWNER', 'RESOURCE', 'KB', 'UPDATE'),
1969+
(210, 'ASSET_OWNER', 'RESOURCE', 'KB', 'DELETE'),
1970+
(211, 'ASSET_OWNER', 'RESOURCE', 'MCP', 'CREATE'),
1971+
(212, 'ASSET_OWNER', 'RESOURCE', 'MCP', 'READ'),
1972+
(213, 'ASSET_OWNER', 'RESOURCE', 'MCP', 'UPDATE'),
1973+
(214, 'ASSET_OWNER', 'RESOURCE', 'MCP', 'DELETE'),
1974+
(215, 'ASSET_OWNER', 'RESOURCE', 'MODEL', 'CREATE'),
1975+
(216, 'ASSET_OWNER', 'RESOURCE', 'MODEL', 'READ'),
1976+
(217, 'ASSET_OWNER', 'RESOURCE', 'MODEL', 'UPDATE'),
1977+
(218, 'ASSET_OWNER', 'RESOURCE', 'MODEL', 'DELETE'),
1978+
(219, 'ASSET_OWNER', 'RESOURCE', 'USER.ROLE', 'READ'),
1979+
(220, 'ASSET_OWNER', 'VISIBILITY', 'LEFT_NAV_MENU', '/users'),
1980+
(221, 'SU', 'VISIBILITY', 'LEFT_NAV_MENU', '/asset-owner-resources')
1981+
ON CONFLICT (role_permission_id) DO NOTHING;
1982+
1983+
COMMIT;
1984+
1985+
-- Migration: Add preserve_source_file to knowledge_record_t table
1986+
-- Date: 2026-06-01
1987+
-- Description: Whether to preserve uploaded source documents after vectorization (default: true)
1988+
1989+
ALTER TABLE nexent.knowledge_record_t
1990+
ADD COLUMN IF NOT EXISTS preserve_source_file BOOLEAN NOT NULL DEFAULT true;
1991+
1992+
COMMENT ON COLUMN nexent.knowledge_record_t.preserve_source_file IS 'Whether to preserve uploaded source documents after vectorization';
1993+
1994+
-- Migration: Add ag_agent_repository_t table
1995+
-- Date: 2026-06-05
1996+
-- Description: Agent marketplace repository for frozen shareable agent snapshots.
1997+
1998+
SET search_path TO nexent;
1999+
2000+
BEGIN;
2001+
2002+
CREATE SEQUENCE IF NOT EXISTS nexent.ag_agent_repository_t_agent_repository_id_seq;
2003+
2004+
CREATE TABLE IF NOT EXISTS nexent.ag_agent_repository_t (
2005+
agent_repository_id BIGINT NOT NULL DEFAULT nextval('nexent.ag_agent_repository_t_agent_repository_id_seq'),
2006+
publisher_tenant_id VARCHAR(100) NOT NULL,
2007+
publisher_user_id VARCHAR(100) NOT NULL,
2008+
agent_id INTEGER NOT NULL,
2009+
source_version_no INTEGER NOT NULL,
2010+
name VARCHAR(100) NOT NULL,
2011+
display_name VARCHAR(100),
2012+
description TEXT,
2013+
author VARCHAR(100),
2014+
category_id INTEGER,
2015+
tags TEXT[],
2016+
tool_count INTEGER,
2017+
version_label VARCHAR(100),
2018+
agent_info_json JSONB NOT NULL,
2019+
status VARCHAR(30) DEFAULT 'NOT_SHARED',
2020+
create_time TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
2021+
update_time TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
2022+
created_by VARCHAR(100),
2023+
updated_by VARCHAR(100),
2024+
delete_flag VARCHAR(1) DEFAULT 'N',
2025+
CONSTRAINT ag_agent_repository_t_pkey PRIMARY KEY (agent_repository_id)
2026+
);
2027+
2028+
ALTER SEQUENCE nexent.ag_agent_repository_t_agent_repository_id_seq
2029+
OWNED BY nexent.ag_agent_repository_t.agent_repository_id;
2030+
2031+
ALTER TABLE nexent.ag_agent_repository_t OWNER TO root;
2032+
2033+
COMMENT ON TABLE nexent.ag_agent_repository_t IS 'Agent marketplace repository for frozen shareable agent snapshots';
2034+
COMMENT ON COLUMN nexent.ag_agent_repository_t.agent_repository_id IS 'Agent repository listing ID, unique primary key';
2035+
COMMENT ON COLUMN nexent.ag_agent_repository_t.publisher_tenant_id IS 'Publisher tenant ID';
2036+
COMMENT ON COLUMN nexent.ag_agent_repository_t.publisher_user_id IS 'Publisher user ID';
2037+
COMMENT ON COLUMN nexent.ag_agent_repository_t.agent_id IS 'Root agent ID from ag_tenant_agent_t; upsert key with publisher_tenant_id';
2038+
COMMENT ON COLUMN nexent.ag_agent_repository_t.source_version_no IS 'Published version number frozen at share time';
2039+
COMMENT ON COLUMN nexent.ag_agent_repository_t.name IS 'Root agent programmatic name for display and search';
2040+
COMMENT ON COLUMN nexent.ag_agent_repository_t.display_name IS 'Root agent display name';
2041+
COMMENT ON COLUMN nexent.ag_agent_repository_t.description IS 'Root agent description';
2042+
COMMENT ON COLUMN nexent.ag_agent_repository_t.author IS 'Agent author';
2043+
COMMENT ON COLUMN nexent.ag_agent_repository_t.category_id IS 'Optional marketplace category ID';
2044+
COMMENT ON COLUMN nexent.ag_agent_repository_t.tags IS 'Marketplace tags';
2045+
COMMENT ON COLUMN nexent.ag_agent_repository_t.tool_count IS 'Total tool count across all agents in the bundle (display only)';
2046+
COMMENT ON COLUMN nexent.ag_agent_repository_t.version_label IS 'Repository entry version label for display (e.g. v1.0)';
2047+
COMMENT ON COLUMN nexent.ag_agent_repository_t.agent_info_json IS 'Frozen ExportAndImportDataFormat snapshot with optional skills';
2048+
COMMENT ON COLUMN nexent.ag_agent_repository_t.status IS 'Listing status: NOT_SHARED (未共享) / PENDING_REVIEW (待审核) / REJECTED (审核驳回) / SHARED (已共享)';
2049+
COMMENT ON COLUMN nexent.ag_agent_repository_t.create_time IS 'Creation time';
2050+
COMMENT ON COLUMN nexent.ag_agent_repository_t.update_time IS 'Update time';
2051+
COMMENT ON COLUMN nexent.ag_agent_repository_t.created_by IS 'Creator ID';
2052+
COMMENT ON COLUMN nexent.ag_agent_repository_t.updated_by IS 'Updater ID';
2053+
COMMENT ON COLUMN nexent.ag_agent_repository_t.delete_flag IS 'Soft delete flag: Y/N';
2054+
2055+
CREATE UNIQUE INDEX IF NOT EXISTS uq_agent_repository_tenant_agent_active
2056+
ON nexent.ag_agent_repository_t (publisher_tenant_id, agent_id)
2057+
WHERE delete_flag = 'N';
2058+
2059+
CREATE INDEX IF NOT EXISTS idx_agent_repository_publisher_delete
2060+
ON nexent.ag_agent_repository_t (publisher_tenant_id, delete_flag);
2061+
2062+
CREATE INDEX IF NOT EXISTS idx_agent_repository_status_delete
2063+
ON nexent.ag_agent_repository_t (status, delete_flag);
2064+
2065+
CREATE INDEX IF NOT EXISTS idx_agent_repository_name_delete
2066+
ON nexent.ag_agent_repository_t (name, delete_flag);
2067+
2068+
CREATE INDEX IF NOT EXISTS idx_agent_repository_tags_gin
2069+
ON nexent.ag_agent_repository_t USING GIN (tags);
2070+
2071+
CREATE OR REPLACE FUNCTION update_ag_agent_repository_update_time()
2072+
RETURNS TRIGGER AS $$
2073+
BEGIN
2074+
NEW.update_time = CURRENT_TIMESTAMP;
2075+
RETURN NEW;
2076+
END;
2077+
$$ LANGUAGE plpgsql;
2078+
2079+
COMMENT ON FUNCTION update_ag_agent_repository_update_time() IS 'Auto-update update_time for ag_agent_repository_t';
2080+
2081+
DROP TRIGGER IF EXISTS update_ag_agent_repository_update_time_trigger ON nexent.ag_agent_repository_t;
2082+
CREATE TRIGGER update_ag_agent_repository_update_time_trigger
2083+
BEFORE UPDATE ON nexent.ag_agent_repository_t
2084+
FOR EACH ROW
2085+
EXECUTE FUNCTION update_ag_agent_repository_update_time();
2086+
2087+
COMMENT ON TRIGGER update_ag_agent_repository_update_time_trigger ON nexent.ag_agent_repository_t IS 'Trigger to maintain update_time';
2088+
2089+
COMMIT;
2090+
2091+
-- Migration: Add selected_agent_version_no to ag_agent_relation_t
2092+
-- Date: 2026-06-09
2093+
-- Description: Pin child agent version on parent-child relations at publish time.
2094+
2095+
SET search_path TO nexent;
2096+
2097+
BEGIN;
2098+
2099+
ALTER TABLE nexent.ag_agent_relation_t
2100+
ADD COLUMN IF NOT EXISTS selected_agent_version_no INTEGER;
2101+
2102+
COMMENT ON COLUMN nexent.ag_agent_relation_t.selected_agent_version_no IS
2103+
'Pinned version of selected_agent_id. NULL = use child current published version at runtime (legacy/draft).';
2104+
2105+
COMMIT;

0 commit comments

Comments
 (0)