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.
This commit is contained in:
hy89 2025-03-10 17:46:08 +08:00 committed by GitHub
parent d4f84f0b54
commit 8ba1e6c183
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 15 additions and 0 deletions

View File

@ -365,6 +365,18 @@ def agent_completions(tenant_id, agent_id):
conv = API4ConversationService.query(id=req["session_id"], dialog_id=agent_id) conv = API4ConversationService.query(id=req["session_id"], dialog_id=agent_id)
if not conv: if not conv:
return get_error_data_result(f"You don't own the session {req['session_id']}") 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: else:
req["question"] = "" req["question"] = ""
if req.get("stream", True): if req.get("stream", True):

View File

@ -2513,6 +2513,7 @@ Asks a specified agent a question to start an AI-powered conversation.
- `"stream"`: `boolean` - `"stream"`: `boolean`
- `"session_id"`: `string` - `"session_id"`: `string`
- `"user_id"`: `string`(optional) - `"user_id"`: `string`(optional)
- `"sync_dsl"`: `boolean` (optional)
- other parameters: `string` - other parameters: `string`
##### Request example ##### Request example
If the **Begin** component does not take parameters, the following code will create a session. 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. The ID of the session. If it is not provided, a new session will be generated.
- `"user_id"`: (*Body parameter*), `string` - `"user_id"`: (*Body parameter*), `string`
The optional user-defined ID. Valid *only* when no `session_id` is provided. 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*) - Other parameters: (*Body Parameter*)
Parameters specified in the **Begin** component. Parameters specified in the **Begin** component.