# This file was auto-generated by Fern from our API Definition.

import datetime as dt
import typing
import uuid

from ..common.types.collaborator import Collaborator
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.request_options import RequestOptions
from .raw_client import AsyncRawCopilotsClient, RawCopilotsClient
from .types.configuration import Configuration
from .types.create_conversation_response import CreateConversationResponse
from .types.create_copilot_response import CreateCopilotResponse
from .types.delete_copilot_response import DeleteCopilotResponse
from .types.export_copilots_response import ExportCopilotsResponse
from .types.input_variable import InputVariable
from .types.message_feedback import MessageFeedback
from .types.send_agent_message_response import SendAgentMessageResponse
from .types.streaming_chunk import StreamingChunk

# this is used as the default value for optional parameters
OMIT = typing.cast(typing.Any, ...)


class CopilotsClient:
    def __init__(self, *, client_wrapper: SyncClientWrapper):
        self._raw_client = RawCopilotsClient(client_wrapper=client_wrapper)

    @property
    def with_raw_response(self) -> RawCopilotsClient:
        """
        Retrieves a raw implementation of this client that returns raw responses.

        Returns
        -------
        RawCopilotsClient
        """
        return self._raw_client

    def create_copilot(
        self,
        *,
        name: str,
        description: str,
        collaborators: typing.Sequence[Collaborator],
        request_options: typing.Optional[RequestOptions] = None,
    ) -> CreateCopilotResponse:
        """
        Create a new agent. The API key used will be added to the agent for future Requests

        Parameters
        ----------
        name : str
            A descriptive name for the agent.

        description : str
            An in depth name for the agent's function. Useful for routing requests to the right agent.

        collaborators : typing.Sequence[Collaborator]
            A list of collaborator emails and roles that will have access to the agent.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        CreateCopilotResponse

        Examples
        --------
        from credal import CredalApi
        from credal.common import Collaborator

        client = CredalApi(
            api_key="YOUR_API_KEY",
        )
        client.copilots.create_copilot(
            name="Customer Agent",
            description="This agent is used to answer customer requests based on internal documentation.",
            collaborators=[
                Collaborator(
                    email="test@gmail.com",
                    role="editor",
                )
            ],
        )
        """
        _response = self._raw_client.create_copilot(
            name=name, description=description, collaborators=collaborators, request_options=request_options
        )
        return _response.data

    def create_conversation(
        self, *, agent_id: uuid.UUID, user_email: str, request_options: typing.Optional[RequestOptions] = None
    ) -> CreateConversationResponse:
        """
        OPTIONAL. Create a new conversation with the Agent. The conversation ID can be used in the `sendMessage` endpoint. The `sendMessage` endpoint automatically creates new conversations upon first request, but calling this endpoint can simplify certain use cases where it is helpful for the application to have the conversation ID before the first message is sent.

        Parameters
        ----------
        agent_id : uuid.UUID
            Credal-generated Agent ID to specify which agent to route the request to.

        user_email : str
            End-user for the conversation.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        CreateConversationResponse

        Examples
        --------
        import uuid

        from credal import CredalApi

        client = CredalApi(
            api_key="YOUR_API_KEY",
        )
        client.copilots.create_conversation(
            agent_id=uuid.UUID(
                "82e4b12a-6990-45d4-8ebd-85c00e030c24",
            ),
            user_email="ravin@credal.ai",
        )
        """
        _response = self._raw_client.create_conversation(
            agent_id=agent_id, user_email=user_email, request_options=request_options
        )
        return _response.data

    def provide_message_feedback(
        self,
        *,
        agent_id: uuid.UUID,
        user_email: str,
        message_id: uuid.UUID,
        message_feedback: MessageFeedback,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> None:
        """
        Parameters
        ----------
        agent_id : uuid.UUID
            Credal-generated Agent ID to specify which agent to route the request to.

        user_email : str
            The user profile you want to use when providing feedback.

        message_id : uuid.UUID
            The message ID for which feedback is being provided.

        message_feedback : MessageFeedback
            The feedback provided by the user.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        None

        Examples
        --------
        import uuid

        from credal import CredalApi
        from credal.copilots import MessageFeedback

        client = CredalApi(
            api_key="YOUR_API_KEY",
        )
        client.copilots.provide_message_feedback(
            user_email="ravin@credal.ai",
            message_id=uuid.UUID(
                "dd721cd8-4bf2-4b94-9869-258df3dab9dc",
            ),
            agent_id=uuid.UUID(
                "82e4b12a-6990-45d4-8ebd-85c00e030c24",
            ),
            message_feedback=MessageFeedback(
                feedback="NEGATIVE",
                suggested_answer="Yes, Credal is SOC 2 compliant.",
                descriptive_feedback="The response should be extremely clear and concise.",
            ),
        )
        """
        _response = self._raw_client.provide_message_feedback(
            agent_id=agent_id,
            user_email=user_email,
            message_id=message_id,
            message_feedback=message_feedback,
            request_options=request_options,
        )
        return _response.data

    def send_message(
        self,
        *,
        agent_id: uuid.UUID,
        message: str,
        user_email: str,
        conversation_id: typing.Optional[uuid.UUID] = OMIT,
        input_variables: typing.Optional[typing.Sequence[InputVariable]] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> SendAgentMessageResponse:
        """
        Parameters
        ----------
        agent_id : uuid.UUID
            Credal-generated Agent ID to specify which agent to route the request to.

        message : str
            The message you want to send to your agent.

        user_email : str
            The user profile you want to use when sending the message.

        conversation_id : typing.Optional[uuid.UUID]
            Credal-generated conversation ID for sending follow up messages. Conversation ID is returned after initial message. Optional, to be left off for first messages on new conversations.

        input_variables : typing.Optional[typing.Sequence[InputVariable]]
            Optional input variables to be used in the message. Map the name of the variable to a list of urls.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        SendAgentMessageResponse

        Examples
        --------
        import uuid

        from credal import CredalApi
        from credal.copilots import InputVariable

        client = CredalApi(
            api_key="YOUR_API_KEY",
        )
        client.copilots.send_message(
            agent_id=uuid.UUID(
                "82e4b12a-6990-45d4-8ebd-85c00e030c24",
            ),
            message="Is Credal SOC 2 compliant?",
            user_email="ravin@credal.ai",
            input_variables=[
                InputVariable(
                    name="input1",
                    ids=[
                        uuid.UUID(
                            "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                        )
                    ],
                ),
                InputVariable(
                    name="input2",
                    ids=[
                        uuid.UUID(
                            "82e4b12a-6990-45d4-8ebd-85c00e030c25",
                        ),
                        uuid.UUID(
                            "82e4b12a-6990-45d4-8ebd-85c00e030c26",
                        ),
                    ],
                ),
            ],
        )
        """
        _response = self._raw_client.send_message(
            agent_id=agent_id,
            message=message,
            user_email=user_email,
            conversation_id=conversation_id,
            input_variables=input_variables,
            request_options=request_options,
        )
        return _response.data

    def stream_message(
        self,
        *,
        copilot_id: uuid.UUID,
        message: str,
        email: str,
        conversation_id: typing.Optional[uuid.UUID] = OMIT,
        input_variables: typing.Optional[typing.Sequence[InputVariable]] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> typing.Iterator[StreamingChunk]:
        """
        This endpoint allows you to send a message to a specific agent and get the response back as a streamed set of Server-Sent Events.

        Parameters
        ----------
        copilot_id : uuid.UUID
            Credal-generated Agent ID to specify which agent to route the request to.

        message : str
            The message you want to send to your agent.

        email : str
            The user profile you want to use when sending the message.

        conversation_id : typing.Optional[uuid.UUID]
            Credal-generated conversation ID for sending follow up messages. Conversation ID is returned after initial message. Optional, to be left off for first messages on new conversations.

        input_variables : typing.Optional[typing.Sequence[InputVariable]]
            Optional input variables to be used in the message. Map the name of the variable to a list of urls.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Yields
        ------
        typing.Iterator[StreamingChunk]
            This endpoint returns a stream of server sent events. These can be in two formats - one is an initial event, followed by multiple data chunks, followed by a final chunk, or the other format is just one blocked event. See the examples for more details.

        Examples
        --------
        import uuid

        from credal import CredalApi
        from credal.copilots import InputVariable

        client = CredalApi(
            api_key="YOUR_API_KEY",
        )
        response = client.copilots.stream_message(
            copilot_id=uuid.UUID(
                "82e4b12a-6990-45d4-8ebd-85c00e030c24",
            ),
            message="Is Credal SOC 2 compliant?",
            email="ravin@credal.ai",
            input_variables=[
                InputVariable(
                    name="input1",
                    ids=[
                        uuid.UUID(
                            "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                        )
                    ],
                ),
                InputVariable(
                    name="input2",
                    ids=[
                        uuid.UUID(
                            "82e4b12a-6990-45d4-8ebd-85c00e030c25",
                        ),
                        uuid.UUID(
                            "82e4b12a-6990-45d4-8ebd-85c00e030c26",
                        ),
                    ],
                ),
            ],
        )
        for chunk in response:
            yield chunk
        """
        with self._raw_client.stream_message(
            copilot_id=copilot_id,
            message=message,
            email=email,
            conversation_id=conversation_id,
            input_variables=input_variables,
            request_options=request_options,
        ) as r:
            yield from r.data

    def add_collection_to_copilot(
        self,
        *,
        copilot_id: uuid.UUID,
        collection_id: uuid.UUID,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> None:
        """
        Link a collection with a agent. The API Key used must be added to both the collection and the agent beforehand.

        Parameters
        ----------
        copilot_id : uuid.UUID
            Credal-generated Agent ID to add the collection to.

        collection_id : uuid.UUID
            Credal-generated collection ID to add.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        None

        Examples
        --------
        import uuid

        from credal import CredalApi

        client = CredalApi(
            api_key="YOUR_API_KEY",
        )
        client.copilots.add_collection_to_copilot(
            copilot_id=uuid.UUID(
                "82e4b12a-6990-45d4-8ebd-85c00e030c24",
            ),
            collection_id=uuid.UUID(
                "def1055f-83c5-43d6-b558-f7a38e7b299e",
            ),
        )
        """
        _response = self._raw_client.add_collection_to_copilot(
            copilot_id=copilot_id, collection_id=collection_id, request_options=request_options
        )
        return _response.data

    def remove_collection_from_copilot(
        self,
        *,
        copilot_id: uuid.UUID,
        collection_id: uuid.UUID,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> None:
        """
        Unlink a collection with a agent. The API Key used must be added to both the collection and the agent beforehand.

        Parameters
        ----------
        copilot_id : uuid.UUID
            Credal-generated agent ID to add the collection to.

        collection_id : uuid.UUID
            Credal-generated collection ID to add.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        None

        Examples
        --------
        import uuid

        from credal import CredalApi

        client = CredalApi(
            api_key="YOUR_API_KEY",
        )
        client.copilots.remove_collection_from_copilot(
            copilot_id=uuid.UUID(
                "82e4b12a-6990-45d4-8ebd-85c00e030c24",
            ),
            collection_id=uuid.UUID(
                "def1055f-83c5-43d6-b558-f7a38e7b299e",
            ),
        )
        """
        _response = self._raw_client.remove_collection_from_copilot(
            copilot_id=copilot_id, collection_id=collection_id, request_options=request_options
        )
        return _response.data

    def update_configuration(
        self,
        *,
        copilot_id: uuid.UUID,
        configuration: Configuration,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> None:
        """
        Update the configuration for a agent

        Parameters
        ----------
        copilot_id : uuid.UUID
            Credal-generated agent ID to add the collection to.

        configuration : Configuration

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        None

        Examples
        --------
        import uuid

        from credal import CredalApi
        from credal.copilots import AiEndpointConfiguration, Configuration

        client = CredalApi(
            api_key="YOUR_API_KEY",
        )
        client.copilots.update_configuration(
            copilot_id=uuid.UUID(
                "82e4b12a-6990-45d4-8ebd-85c00e030c24",
            ),
            configuration=Configuration(
                name="Customer Agent",
                description="This agent is used to answer customer requests based on internal documentation.",
                prompt="You are a polite, helpful assistant used to answer customer requests.",
                ai_endpoint_configuration=AiEndpointConfiguration(
                    base_url="https://api.openai.com/v1/",
                    api_key="<YOUR_API_KEY_HERE>",
                ),
            ),
        )
        """
        _response = self._raw_client.update_configuration(
            copilot_id=copilot_id, configuration=configuration, request_options=request_options
        )
        return _response.data

    def delete_copilot(
        self, *, id: uuid.UUID, request_options: typing.Optional[RequestOptions] = None
    ) -> DeleteCopilotResponse:
        """
        Parameters
        ----------
        id : uuid.UUID
            Copilot ID

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        DeleteCopilotResponse

        Examples
        --------
        import uuid

        from credal import CredalApi

        client = CredalApi(
            api_key="YOUR_API_KEY",
        )
        client.copilots.delete_copilot(
            id=uuid.UUID(
                "ac20e6ba-0bae-11ef-b25a-efca73df4c3a",
            ),
        )
        """
        _response = self._raw_client.delete_copilot(id=id, request_options=request_options)
        return _response.data

    def export(
        self,
        *,
        agent_created_from: typing.Optional[dt.datetime] = OMIT,
        agent_created_to: typing.Optional[dt.datetime] = OMIT,
        version_created_from: typing.Optional[dt.datetime] = OMIT,
        version_created_to: typing.Optional[dt.datetime] = OMIT,
        limit: typing.Optional[int] = OMIT,
        cursor: typing.Optional[str] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> ExportCopilotsResponse:
        """
        Export copilot configurations for backup or migration purposes.

        **IMPORTANT**: This endpoint requires:
        - Admin privileges
        - The 'ai-usage-analytics-log.export' scope on the API key

        Returns all deployed copilots with their full configuration including model settings, tools, and deployment details. Optional date filters can be applied to narrow down results.

        Parameters
        ----------
        agent_created_from : typing.Optional[dt.datetime]
            Filter copilots created on or after this datetime (ISO 8601 format).

        agent_created_to : typing.Optional[dt.datetime]
            Filter copilots created before or on this datetime (ISO 8601 format).

        version_created_from : typing.Optional[dt.datetime]
            Filter copilot versions created on or after this datetime (ISO 8601 format).

        version_created_to : typing.Optional[dt.datetime]
            Filter copilot versions created before or on this datetime (ISO 8601 format).

        limit : typing.Optional[int]
            Maximum number of copilots to return. Must be a positive integer with a maximum value of 1000. Defaults to 100.

        cursor : typing.Optional[str]
            Cursor for pagination. Use the cursor returned in the previous response to fetch the next page of results. If not provided, returns the first page.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        ExportCopilotsResponse

        Examples
        --------
        import datetime

        from credal import CredalApi

        client = CredalApi(
            api_key="YOUR_API_KEY",
        )
        client.copilots.export(
            agent_created_from=datetime.datetime.fromisoformat(
                "2024-01-01 00:00:00+00:00",
            ),
            agent_created_to=datetime.datetime.fromisoformat(
                "2024-12-31 23:59:59+00:00",
            ),
        )
        """
        _response = self._raw_client.export(
            agent_created_from=agent_created_from,
            agent_created_to=agent_created_to,
            version_created_from=version_created_from,
            version_created_to=version_created_to,
            limit=limit,
            cursor=cursor,
            request_options=request_options,
        )
        return _response.data


class AsyncCopilotsClient:
    def __init__(self, *, client_wrapper: AsyncClientWrapper):
        self._raw_client = AsyncRawCopilotsClient(client_wrapper=client_wrapper)

    @property
    def with_raw_response(self) -> AsyncRawCopilotsClient:
        """
        Retrieves a raw implementation of this client that returns raw responses.

        Returns
        -------
        AsyncRawCopilotsClient
        """
        return self._raw_client

    async def create_copilot(
        self,
        *,
        name: str,
        description: str,
        collaborators: typing.Sequence[Collaborator],
        request_options: typing.Optional[RequestOptions] = None,
    ) -> CreateCopilotResponse:
        """
        Create a new agent. The API key used will be added to the agent for future Requests

        Parameters
        ----------
        name : str
            A descriptive name for the agent.

        description : str
            An in depth name for the agent's function. Useful for routing requests to the right agent.

        collaborators : typing.Sequence[Collaborator]
            A list of collaborator emails and roles that will have access to the agent.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        CreateCopilotResponse

        Examples
        --------
        import asyncio

        from credal import AsyncCredalApi
        from credal.common import Collaborator

        client = AsyncCredalApi(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.copilots.create_copilot(
                name="Customer Agent",
                description="This agent is used to answer customer requests based on internal documentation.",
                collaborators=[
                    Collaborator(
                        email="test@gmail.com",
                        role="editor",
                    )
                ],
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.create_copilot(
            name=name, description=description, collaborators=collaborators, request_options=request_options
        )
        return _response.data

    async def create_conversation(
        self, *, agent_id: uuid.UUID, user_email: str, request_options: typing.Optional[RequestOptions] = None
    ) -> CreateConversationResponse:
        """
        OPTIONAL. Create a new conversation with the Agent. The conversation ID can be used in the `sendMessage` endpoint. The `sendMessage` endpoint automatically creates new conversations upon first request, but calling this endpoint can simplify certain use cases where it is helpful for the application to have the conversation ID before the first message is sent.

        Parameters
        ----------
        agent_id : uuid.UUID
            Credal-generated Agent ID to specify which agent to route the request to.

        user_email : str
            End-user for the conversation.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        CreateConversationResponse

        Examples
        --------
        import asyncio
        import uuid

        from credal import AsyncCredalApi

        client = AsyncCredalApi(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.copilots.create_conversation(
                agent_id=uuid.UUID(
                    "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                ),
                user_email="ravin@credal.ai",
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.create_conversation(
            agent_id=agent_id, user_email=user_email, request_options=request_options
        )
        return _response.data

    async def provide_message_feedback(
        self,
        *,
        agent_id: uuid.UUID,
        user_email: str,
        message_id: uuid.UUID,
        message_feedback: MessageFeedback,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> None:
        """
        Parameters
        ----------
        agent_id : uuid.UUID
            Credal-generated Agent ID to specify which agent to route the request to.

        user_email : str
            The user profile you want to use when providing feedback.

        message_id : uuid.UUID
            The message ID for which feedback is being provided.

        message_feedback : MessageFeedback
            The feedback provided by the user.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        None

        Examples
        --------
        import asyncio
        import uuid

        from credal import AsyncCredalApi
        from credal.copilots import MessageFeedback

        client = AsyncCredalApi(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.copilots.provide_message_feedback(
                user_email="ravin@credal.ai",
                message_id=uuid.UUID(
                    "dd721cd8-4bf2-4b94-9869-258df3dab9dc",
                ),
                agent_id=uuid.UUID(
                    "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                ),
                message_feedback=MessageFeedback(
                    feedback="NEGATIVE",
                    suggested_answer="Yes, Credal is SOC 2 compliant.",
                    descriptive_feedback="The response should be extremely clear and concise.",
                ),
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.provide_message_feedback(
            agent_id=agent_id,
            user_email=user_email,
            message_id=message_id,
            message_feedback=message_feedback,
            request_options=request_options,
        )
        return _response.data

    async def send_message(
        self,
        *,
        agent_id: uuid.UUID,
        message: str,
        user_email: str,
        conversation_id: typing.Optional[uuid.UUID] = OMIT,
        input_variables: typing.Optional[typing.Sequence[InputVariable]] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> SendAgentMessageResponse:
        """
        Parameters
        ----------
        agent_id : uuid.UUID
            Credal-generated Agent ID to specify which agent to route the request to.

        message : str
            The message you want to send to your agent.

        user_email : str
            The user profile you want to use when sending the message.

        conversation_id : typing.Optional[uuid.UUID]
            Credal-generated conversation ID for sending follow up messages. Conversation ID is returned after initial message. Optional, to be left off for first messages on new conversations.

        input_variables : typing.Optional[typing.Sequence[InputVariable]]
            Optional input variables to be used in the message. Map the name of the variable to a list of urls.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        SendAgentMessageResponse

        Examples
        --------
        import asyncio
        import uuid

        from credal import AsyncCredalApi
        from credal.copilots import InputVariable

        client = AsyncCredalApi(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.copilots.send_message(
                agent_id=uuid.UUID(
                    "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                ),
                message="Is Credal SOC 2 compliant?",
                user_email="ravin@credal.ai",
                input_variables=[
                    InputVariable(
                        name="input1",
                        ids=[
                            uuid.UUID(
                                "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                            )
                        ],
                    ),
                    InputVariable(
                        name="input2",
                        ids=[
                            uuid.UUID(
                                "82e4b12a-6990-45d4-8ebd-85c00e030c25",
                            ),
                            uuid.UUID(
                                "82e4b12a-6990-45d4-8ebd-85c00e030c26",
                            ),
                        ],
                    ),
                ],
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.send_message(
            agent_id=agent_id,
            message=message,
            user_email=user_email,
            conversation_id=conversation_id,
            input_variables=input_variables,
            request_options=request_options,
        )
        return _response.data

    async def stream_message(
        self,
        *,
        copilot_id: uuid.UUID,
        message: str,
        email: str,
        conversation_id: typing.Optional[uuid.UUID] = OMIT,
        input_variables: typing.Optional[typing.Sequence[InputVariable]] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> typing.AsyncIterator[StreamingChunk]:
        """
        This endpoint allows you to send a message to a specific agent and get the response back as a streamed set of Server-Sent Events.

        Parameters
        ----------
        copilot_id : uuid.UUID
            Credal-generated Agent ID to specify which agent to route the request to.

        message : str
            The message you want to send to your agent.

        email : str
            The user profile you want to use when sending the message.

        conversation_id : typing.Optional[uuid.UUID]
            Credal-generated conversation ID for sending follow up messages. Conversation ID is returned after initial message. Optional, to be left off for first messages on new conversations.

        input_variables : typing.Optional[typing.Sequence[InputVariable]]
            Optional input variables to be used in the message. Map the name of the variable to a list of urls.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Yields
        ------
        typing.AsyncIterator[StreamingChunk]
            This endpoint returns a stream of server sent events. These can be in two formats - one is an initial event, followed by multiple data chunks, followed by a final chunk, or the other format is just one blocked event. See the examples for more details.

        Examples
        --------
        import asyncio
        import uuid

        from credal import AsyncCredalApi
        from credal.copilots import InputVariable

        client = AsyncCredalApi(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            response = await client.copilots.stream_message(
                copilot_id=uuid.UUID(
                    "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                ),
                message="Is Credal SOC 2 compliant?",
                email="ravin@credal.ai",
                input_variables=[
                    InputVariable(
                        name="input1",
                        ids=[
                            uuid.UUID(
                                "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                            )
                        ],
                    ),
                    InputVariable(
                        name="input2",
                        ids=[
                            uuid.UUID(
                                "82e4b12a-6990-45d4-8ebd-85c00e030c25",
                            ),
                            uuid.UUID(
                                "82e4b12a-6990-45d4-8ebd-85c00e030c26",
                            ),
                        ],
                    ),
                ],
            )
            async for chunk in response:
                yield chunk


        asyncio.run(main())
        """
        async with self._raw_client.stream_message(
            copilot_id=copilot_id,
            message=message,
            email=email,
            conversation_id=conversation_id,
            input_variables=input_variables,
            request_options=request_options,
        ) as r:
            async for _chunk in r.data:
                yield _chunk

    async def add_collection_to_copilot(
        self,
        *,
        copilot_id: uuid.UUID,
        collection_id: uuid.UUID,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> None:
        """
        Link a collection with a agent. The API Key used must be added to both the collection and the agent beforehand.

        Parameters
        ----------
        copilot_id : uuid.UUID
            Credal-generated Agent ID to add the collection to.

        collection_id : uuid.UUID
            Credal-generated collection ID to add.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        None

        Examples
        --------
        import asyncio
        import uuid

        from credal import AsyncCredalApi

        client = AsyncCredalApi(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.copilots.add_collection_to_copilot(
                copilot_id=uuid.UUID(
                    "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                ),
                collection_id=uuid.UUID(
                    "def1055f-83c5-43d6-b558-f7a38e7b299e",
                ),
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.add_collection_to_copilot(
            copilot_id=copilot_id, collection_id=collection_id, request_options=request_options
        )
        return _response.data

    async def remove_collection_from_copilot(
        self,
        *,
        copilot_id: uuid.UUID,
        collection_id: uuid.UUID,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> None:
        """
        Unlink a collection with a agent. The API Key used must be added to both the collection and the agent beforehand.

        Parameters
        ----------
        copilot_id : uuid.UUID
            Credal-generated agent ID to add the collection to.

        collection_id : uuid.UUID
            Credal-generated collection ID to add.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        None

        Examples
        --------
        import asyncio
        import uuid

        from credal import AsyncCredalApi

        client = AsyncCredalApi(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.copilots.remove_collection_from_copilot(
                copilot_id=uuid.UUID(
                    "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                ),
                collection_id=uuid.UUID(
                    "def1055f-83c5-43d6-b558-f7a38e7b299e",
                ),
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.remove_collection_from_copilot(
            copilot_id=copilot_id, collection_id=collection_id, request_options=request_options
        )
        return _response.data

    async def update_configuration(
        self,
        *,
        copilot_id: uuid.UUID,
        configuration: Configuration,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> None:
        """
        Update the configuration for a agent

        Parameters
        ----------
        copilot_id : uuid.UUID
            Credal-generated agent ID to add the collection to.

        configuration : Configuration

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        None

        Examples
        --------
        import asyncio
        import uuid

        from credal import AsyncCredalApi
        from credal.copilots import AiEndpointConfiguration, Configuration

        client = AsyncCredalApi(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.copilots.update_configuration(
                copilot_id=uuid.UUID(
                    "82e4b12a-6990-45d4-8ebd-85c00e030c24",
                ),
                configuration=Configuration(
                    name="Customer Agent",
                    description="This agent is used to answer customer requests based on internal documentation.",
                    prompt="You are a polite, helpful assistant used to answer customer requests.",
                    ai_endpoint_configuration=AiEndpointConfiguration(
                        base_url="https://api.openai.com/v1/",
                        api_key="<YOUR_API_KEY_HERE>",
                    ),
                ),
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.update_configuration(
            copilot_id=copilot_id, configuration=configuration, request_options=request_options
        )
        return _response.data

    async def delete_copilot(
        self, *, id: uuid.UUID, request_options: typing.Optional[RequestOptions] = None
    ) -> DeleteCopilotResponse:
        """
        Parameters
        ----------
        id : uuid.UUID
            Copilot ID

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        DeleteCopilotResponse

        Examples
        --------
        import asyncio
        import uuid

        from credal import AsyncCredalApi

        client = AsyncCredalApi(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.copilots.delete_copilot(
                id=uuid.UUID(
                    "ac20e6ba-0bae-11ef-b25a-efca73df4c3a",
                ),
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.delete_copilot(id=id, request_options=request_options)
        return _response.data

    async def export(
        self,
        *,
        agent_created_from: typing.Optional[dt.datetime] = OMIT,
        agent_created_to: typing.Optional[dt.datetime] = OMIT,
        version_created_from: typing.Optional[dt.datetime] = OMIT,
        version_created_to: typing.Optional[dt.datetime] = OMIT,
        limit: typing.Optional[int] = OMIT,
        cursor: typing.Optional[str] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> ExportCopilotsResponse:
        """
        Export copilot configurations for backup or migration purposes.

        **IMPORTANT**: This endpoint requires:
        - Admin privileges
        - The 'ai-usage-analytics-log.export' scope on the API key

        Returns all deployed copilots with their full configuration including model settings, tools, and deployment details. Optional date filters can be applied to narrow down results.

        Parameters
        ----------
        agent_created_from : typing.Optional[dt.datetime]
            Filter copilots created on or after this datetime (ISO 8601 format).

        agent_created_to : typing.Optional[dt.datetime]
            Filter copilots created before or on this datetime (ISO 8601 format).

        version_created_from : typing.Optional[dt.datetime]
            Filter copilot versions created on or after this datetime (ISO 8601 format).

        version_created_to : typing.Optional[dt.datetime]
            Filter copilot versions created before or on this datetime (ISO 8601 format).

        limit : typing.Optional[int]
            Maximum number of copilots to return. Must be a positive integer with a maximum value of 1000. Defaults to 100.

        cursor : typing.Optional[str]
            Cursor for pagination. Use the cursor returned in the previous response to fetch the next page of results. If not provided, returns the first page.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        ExportCopilotsResponse

        Examples
        --------
        import asyncio
        import datetime

        from credal import AsyncCredalApi

        client = AsyncCredalApi(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.copilots.export(
                agent_created_from=datetime.datetime.fromisoformat(
                    "2024-01-01 00:00:00+00:00",
                ),
                agent_created_to=datetime.datetime.fromisoformat(
                    "2024-12-31 23:59:59+00:00",
                ),
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.export(
            agent_created_from=agent_created_from,
            agent_created_to=agent_created_to,
            version_created_from=version_created_from,
            version_created_to=version_created_to,
            limit=limit,
            cursor=cursor,
            request_options=request_options,
        )
        return _response.data
