mirror of
https://github.com/Mintplex-Labs/langchain-python.git
synced 2026-07-21 00:35:23 -04:00
d84a3bcf7a
#### Background With the development of [structured tools](https://blog.langchain.dev/structured-tools/), the LangChain team expanded the platform's functionality to meet the needs of new applications. The GMail tool, empowered by structured tools, now supports multiple arguments and powerful search capabilities, demonstrating LangChain's ability to interact with dynamic data sources like email servers. #### Challenge The current GMail tool only supports GMail, while users often utilize other email services like Outlook in Office365. Additionally, the proposed calendar tool in PR https://github.com/hwchase17/langchain/pull/652 only works with Google Calendar, not Outlook. #### Changes This PR implements an Office365 integration for LangChain, enabling seamless email and calendar functionality with a single authentication process. #### Future Work With the core Office365 integration complete, future work could include integrating other Office365 tools such as Tasks and Address Book. #### Who can review? @hwchase17 or @vowelparrot can review this PR #### Appendix @janscas, I utilized your [O365](https://github.com/O365/python-o365) library extensively. Given the rising popularity of LangChain and similar AI frameworks, the convergence of libraries like O365 and tools like this one is likely. So, I wanted to keep you updated on our progress. --------- Co-authored-by: Dev 2049 <dev.dev2049@gmail.com>
79 lines
2.1 KiB
Python
79 lines
2.1 KiB
Python
from typing import List, Optional, Type
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from langchain.callbacks.manager import (
|
|
AsyncCallbackManagerForToolRun,
|
|
CallbackManagerForToolRun,
|
|
)
|
|
from langchain.tools.office365.base import O365BaseTool
|
|
|
|
|
|
class CreateDraftMessageSchema(BaseModel):
|
|
body: str = Field(
|
|
...,
|
|
description="The message body to include in the draft.",
|
|
)
|
|
to: List[str] = Field(
|
|
...,
|
|
description="The list of recipients.",
|
|
)
|
|
subject: str = Field(
|
|
...,
|
|
description="The subject of the message.",
|
|
)
|
|
cc: Optional[List[str]] = Field(
|
|
None,
|
|
description="The list of CC recipients.",
|
|
)
|
|
bcc: Optional[List[str]] = Field(
|
|
None,
|
|
description="The list of BCC recipients.",
|
|
)
|
|
|
|
|
|
class O365CreateDraftMessage(O365BaseTool):
|
|
name: str = "create_email_draft"
|
|
description: str = (
|
|
"Use this tool to create a draft email with the provided message fields."
|
|
)
|
|
args_schema: Type[CreateDraftMessageSchema] = CreateDraftMessageSchema
|
|
|
|
def _run(
|
|
self,
|
|
body: str,
|
|
to: List[str],
|
|
subject: str,
|
|
cc: Optional[List[str]] = None,
|
|
bcc: Optional[List[str]] = None,
|
|
run_manager: Optional[CallbackManagerForToolRun] = None,
|
|
) -> str:
|
|
# Get mailbox object
|
|
mailbox = self.account.mailbox()
|
|
message = mailbox.new_message()
|
|
|
|
# Assign message values
|
|
message.body = body
|
|
message.subject = subject
|
|
message.to.add(to)
|
|
if cc is not None:
|
|
message.cc.add(cc)
|
|
if bcc is not None:
|
|
message.bcc.add(cc)
|
|
|
|
message.save_draft()
|
|
|
|
output = "Draft created: " + str(message)
|
|
return output
|
|
|
|
async def _arun(
|
|
self,
|
|
message: str,
|
|
to: List[str],
|
|
subject: str,
|
|
cc: Optional[List[str]] = None,
|
|
bcc: Optional[List[str]] = None,
|
|
run_manager: Optional[AsyncCallbackManagerForToolRun] = None,
|
|
) -> str:
|
|
raise NotImplementedError(f"The tool {self.name} does not support async yet.")
|