From 8ba1e6c183a3ed9865835351ee1f5b8920a78da2 Mon Sep 17 00:00:00 2001 From: hy89 <31279043+hy89@users.noreply.github.com> Date: Mon, 10 Mar 2025 17:46:08 +0800 Subject: [PATCH] Feat: add `sync_dsl` parameter to support synchronizing modifications to existing sessions (#5843) When accessing the /api/v1/agents/{agent_id}/completions API, sessions created before agent modifications retain the old DSL data. To use the latest agent configuration (like new prompts) in historical sessions, I added the sync_dsl parameter. It defaults to False to maintain existing behavior and only synchronizes when set to True. If needed, a manual synchronization API can be created to trigger the sync explicitly. --- api/apps/sdk/session.py | 12 ++++++++++++ docs/references/http_api_reference.md | 3 +++ 2 files changed, 15 insertions(+) diff --git a/api/apps/sdk/session.py b/api/apps/sdk/session.py index 8fb70ec35..08dc23593 100644 --- a/api/apps/sdk/session.py +++ b/api/apps/sdk/session.py @@ -365,6 +365,18 @@ def agent_completions(tenant_id, agent_id): conv = API4ConversationService.query(id=req["session_id"], dialog_id=agent_id) if not conv: return get_error_data_result(f"You don't own the session {req['session_id']}") + # If an update to UserCanvas is detected, update the API4Conversation.dsl + sync_dsl = req.get("sync_dsl", False) + if sync_dsl is True and cvs[0].update_time > conv[0].update_time: + current_dsl = conv[0].dsl + new_dsl = json.loads(dsl) + state_fields = ["history", "messages", "path", "reference"] + states = {field: current_dsl.get(field, []) for field in state_fields} + current_dsl.update(new_dsl) + current_dsl.update(states) + API4ConversationService.update_by_id(req["session_id"], { + "dsl": current_dsl + }) else: req["question"] = "" if req.get("stream", True): diff --git a/docs/references/http_api_reference.md b/docs/references/http_api_reference.md index 40b172717..216a1c713 100644 --- a/docs/references/http_api_reference.md +++ b/docs/references/http_api_reference.md @@ -2513,6 +2513,7 @@ Asks a specified agent a question to start an AI-powered conversation. - `"stream"`: `boolean` - `"session_id"`: `string` - `"user_id"`: `string`(optional) + - `"sync_dsl"`: `boolean` (optional) - other parameters: `string` ##### Request example If the **Begin** component does not take parameters, the following code will create a session. @@ -2565,6 +2566,8 @@ curl --request POST \ The ID of the session. If it is not provided, a new session will be generated. - `"user_id"`: (*Body parameter*), `string` The optional user-defined ID. Valid *only* when no `session_id` is provided. +- `"sync_dsl"`: (*Body parameter*), `boolean` + Whether to synchronize the changes to existing sessions when an agent is modified, defaults to `false`. - Other parameters: (*Body Parameter*) Parameters specified in the **Begin** component.