Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 40 additions & 1 deletion ravendb/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
)
from ravendb.documents.operations.configuration.definitions import StudioConfiguration, StudioEnvironment

from ravendb.documents.operations.connection_strings import ConnectionString
from ravendb.documents.operations.connection_strings import ConnectionString, ConnectionStringUsage

# AI Operations
from ravendb.documents.ai import (
Expand Down Expand Up @@ -115,6 +115,13 @@
GetAiAgentsResponse,
AddOrUpdateAiAgentOperation,
DeleteAiAgentOperation,
GetConversationMessagesOperation,
GetConversationMessagesOptions,
AiConversationMessagesResult,
AiConversationMessage,
AiToolCallResult,
AiMessageRole,
AiConversationDetailLevel,
)
from ravendb.documents.operations.ai import (
ChunkingOptions,
Expand Down Expand Up @@ -188,6 +195,24 @@
from ravendb.documents.operations.ongoing_tasks import (
OngoingTaskPullReplicationAsSink,
OngoingTaskPullReplicationAsHub,
OngoingTaskCdcSink,
)
from ravendb.documents.operations.cdc_sink import (
CdcSinkConfiguration,
CdcSinkTableConfig,
CdcSinkEmbeddedTableConfig,
CdcSinkLinkedTableConfig,
CdcSinkOnDeleteConfig,
CdcSinkPostgresSettings,
CdcColumnMapping,
CdcColumnType,
CdcSinkRelationType,
CdcSinkTaskState,
CdcSinkTableLoadState,
AddCdcSinkOperation,
AddCdcSinkOperationResult,
UpdateCdcSinkOperation,
UpdateCdcSinkOperationResult,
)
from ravendb.documents.operations.revisions import (
RevisionsCollectionConfiguration,
Expand Down Expand Up @@ -356,6 +381,9 @@
GetCertificatesResponse,
PutClientCertificateOperation,
SecurityClearance,
CertificateUsage,
SsoProvider,
SsoIdentifier,
)
from ravendb.serverwide.operations.common import (
BuildNumber,
Expand All @@ -366,6 +394,17 @@
GetDatabaseRecordOperation,
)

from ravendb.serverwide.operations.connection_strings import (
ServerWideConnectionString,
ServerWideConnectionStringUsage,
PutServerWideConnectionStringOperation,
PutServerWideConnectionStringResult,
GetServerWideConnectionStringsOperation,
GetServerWideConnectionStringsResult,
RemoveServerWideConnectionStringOperation,
RemoveServerWideConnectionStringResult,
)

from ravendb.documents.identity.hilo import (
HiLoIdGenerator,
MultiTypeHiLoGenerator,
Expand Down
23 changes: 19 additions & 4 deletions ravendb/documents/ai/ai_conversation.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,15 @@ def __init__(
conversation_id: str = None,
change_vector: str = None,
debug: Optional[bool] = None,
cancel_pending_action_tools: bool = False,
):
self._store = store
self._agent_id = agent_id
self._options = options or AiConversationCreationOptions()
self._conversation_id = conversation_id
self._change_vector = change_vector
self._debug = debug
self._cancel_pending_action_tools = cancel_pending_action_tools

self._prompt_parts: List[ContentPart] = []
self._action_responses: Dict[str, AiAgentActionResponse] = {}
Expand Down Expand Up @@ -137,24 +139,34 @@ def add_artificial_action_with_response(self, tool_id: str, action_response) ->

self._artificial_actions.append(AiAgentArtificialActionResponse(tool_id=tool_id, content=content))

def run(self) -> AiAnswer:
def run(self, cancellation_event=None) -> AiAnswer:
self._dispatched_tool_ids.clear()

while True:
r = self._run_internal()
r = self._run_internal(cancellation_event=cancellation_event)
if self._handle_server_reply(r):
return r

def stream(self, stream_property_path: str = None, on_chunk: Optional[Callable[[str], None]] = None) -> AiAnswer:
def stream(
self,
stream_property_path: str = None,
on_chunk: Optional[Callable[[str], None]] = None,
cancellation_event=None,
) -> AiAnswer:
while True:
r = self._run_internal(stream_property_path=stream_property_path, streamed_chunks_callback=on_chunk)
r = self._run_internal(
stream_property_path=stream_property_path,
streamed_chunks_callback=on_chunk,
cancellation_event=cancellation_event,
)
if self._handle_server_reply(r):
return r

def _run_internal(
self,
stream_property_path: Optional[str] = None,
streamed_chunks_callback: Optional[Callable[[str], None]] = None,
cancellation_event=None,
) -> AiAnswer:
from ravendb.documents.operations.ai.agents import RunConversationOperation
import time
Expand Down Expand Up @@ -194,6 +206,8 @@ def _run_internal(
streamed_chunks_callback=streamed_chunks_callback,
attachments_commands=self._attachments_commands,
debug=self._debug,
cancel_pending_action_tools=self._cancel_pending_action_tools,
cancellation_event=cancellation_event,
)

try:
Expand All @@ -203,6 +217,7 @@ def _run_internal(

self._change_vector = result.change_vector
self._conversation_id = result.conversation_id
self._cancel_pending_action_tools = False
self._action_requests = result.action_requests or []

return AiAnswer(
Expand Down
29 changes: 28 additions & 1 deletion ravendb/documents/ai/ai_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ def conversation(
creation_options: "AiConversationCreationOptions" = None,
change_vector: str = None,
debug: Optional[bool] = None,
cancel_pending_action_tools: bool = False,
) -> AiConversation:
"""
Creates a new conversation with the specified AI agent.
Expand All @@ -88,12 +89,22 @@ def conversation(
creation_options: Optional creation options for the conversation
change_vector: Optional change vector for concurrency control
debug: Optional flag enabling server-side conversation debugging
cancel_pending_action_tools: When True, the server auto-answers any open action
tool calls instead of requiring a response

Returns:
Conversation operations interface for managing the conversation
"""

return AiConversation(self._store, agent_id, creation_options, conversation_id, change_vector, debug)
return AiConversation(
self._store,
agent_id,
creation_options,
conversation_id,
change_vector,
debug,
cancel_pending_action_tools,
)

def conversation_with_id(self, conversation_id: str, change_vector: str = None) -> AiConversation:
"""
Expand All @@ -115,3 +126,19 @@ def conversation_with_id(self, conversation_id: str, change_vector: str = None)
from ravendb.documents.ai.ai_conversation import AiConversation

return AiConversation.with_conversation_id(self._store, conversation_id, change_vector)

def get_conversation_messages(self, conversation_id_or_options) -> "AiConversationMessagesResult":
"""
Reads messages from an AI agent conversation.

Args:
conversation_id_or_options: The conversation document ID, or a
GetConversationMessagesOptions instance for paging/filtering control.

Returns:
The conversation messages result; None when the conversation does not exist.
"""
from ravendb.documents.operations.ai.agents import GetConversationMessagesOperation

operation = GetConversationMessagesOperation(conversation_id_or_options)
return self._store.maintenance.send(operation)
19 changes: 19 additions & 0 deletions ravendb/documents/operations/ai/agents/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,17 @@
AiConversationParameterOptions,
)

from .get_conversation_messages_operation import (
GetConversationMessagesOperation,
GetConversationMessagesOptions,
GetConversationMessagesCommand,
AiConversationMessagesResult,
AiConversationMessage,
AiToolCallResult,
AiMessageRole,
AiConversationDetailLevel,
)

__all__ = [
"AiAgentConfiguration",
"AiAgentConfigurationResult",
Expand Down Expand Up @@ -68,4 +79,12 @@
"GetAiAgentsResponse",
"AddOrUpdateAiAgentOperation",
"DeleteAiAgentOperation",
"GetConversationMessagesOperation",
"GetConversationMessagesOptions",
"GetConversationMessagesCommand",
"AiConversationMessagesResult",
"AiConversationMessage",
"AiToolCallResult",
"AiMessageRole",
"AiConversationDetailLevel",
]
Loading
Loading