From 3960c0ba2c70451ab9703c2b4a6414ba0c47d625 Mon Sep 17 00:00:00 2001 From: Warren Date: Fri, 4 Aug 2023 13:54:02 +0800 Subject: [PATCH 1/7] Add Azure OpenAI --- .env.example | 5 +++ codeinterpreterapi/session.py | 71 ++++++++++++++++++++++------------- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/.env.example b/.env.example index 8a844d28..0296fdaa 100644 --- a/.env.example +++ b/.env.example @@ -4,3 +4,8 @@ OPENAI_API_KEY= # CODEBOX_API_KEY= # (set True to enable logging) VERBOSE=False +# (optional, required for production) +OPENAI_API_TYPE=azure +OPENAI_API_VERSION=2023-07-01-preview +OPENAI_API_BASE= +DEPLOYMENT_NAME= \ No newline at end of file diff --git a/codeinterpreterapi/session.py b/codeinterpreterapi/session.py index adec4e8d..5d6e6f84 100644 --- a/codeinterpreterapi/session.py +++ b/codeinterpreterapi/session.py @@ -5,7 +5,7 @@ from codeboxapi import CodeBox # type: ignore from codeboxapi.schema import CodeBoxOutput # type: ignore from langchain.tools import StructuredTool, BaseTool -from langchain.chat_models import ChatOpenAI, ChatAnthropic +from langchain.chat_models import ChatOpenAI, ChatAnthropic, AzureChatOpenAI from langchain.chat_models.base import BaseChatModel from langchain.schema.language_model import BaseLanguageModel from langchain.prompts.chat import MessagesPlaceholder @@ -72,33 +72,50 @@ def _tools( ), ] - def _choose_llm( - self, - model: str = "gpt-4", - openai_api_key: Optional[str] = None, - **kwargs - ) -> BaseChatModel: - if "gpt" in model: - openai_api_key = ( - openai_api_key - or settings.OPENAI_API_KEY - or getenv("OPENAI_API_KEY", None) - ) - if openai_api_key is None: - raise ValueError( - "OpenAI API key missing. Set OPENAI_API_KEY env variable or pass `openai_api_key` to session." + class CodeInterpreterSession: + # ... + def _choose_llm( + self, + model: str = "gpt-4", + openai_api_key: Optional[str] = None, + **kwargs + ) -> BaseChatModel: + if "gpt" in model: + openai_api_key = ( + openai_api_key + or settings.OPENAI_API_KEY + or getenv("OPENAI_API_KEY", None) ) - return ChatOpenAI( - temperature=0.03, - model=model, - openai_api_key=openai_api_key, - max_retries=3, - request_timeout=60 * 3, - ) # type: ignore - elif "claude" in model: - return ChatAnthropic(model=model) - else: - raise ValueError(f"Unknown model: {model} (expected gpt or claude model)") + if openai_api_key is None: + raise ValueError( + "OpenAI API key missing. Set OPENAI_API_KEY env variable or pass `openai_api_key` to session." + ) + openai_api_version = getenv("OPENAI_API_VERSION") + openai_api_base = getenv("OPENAI_API_BASE") + deployment_name = getenv("DEPLOYMENT_NAME") + openapi_type = getenv("OPENAI_API_TYPE") + if openapi_type == "azure" and openai_api_version and openai_api_base and deployment_name: + return AzureChatOpenAI( + temperature=0.03, + openai_api_base=openai_api_base, + openai_api_version=openai_api_version, + deployment_name=deployment_name, + openai_api_key=openai_api_key, + max_retries=3, + request_timeout=60*3 + ) + else: + return ChatOpenAI( + temperature=0.03, + model=model, + openai_api_key=openai_api_key, + max_retries=3, + request_timeout=60 * 3, + ) + elif "claude" in model: + return ChatAnthropic(model=model) + else: + raise ValueError(f"Unknown model: {model} (expected gpt or claude model)") def _choose_agent(self) -> BaseSingleActionAgent: return ( From 86bb6e7c9a45149c99fdf75c0b9e09c54b9c370b Mon Sep 17 00:00:00 2001 From: Warren Date: Fri, 4 Aug 2023 13:58:13 +0800 Subject: [PATCH 2/7] update README --- .env.example | 8 ++++---- README.md | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index 0296fdaa..d1880ebc 100644 --- a/.env.example +++ b/.env.example @@ -5,7 +5,7 @@ OPENAI_API_KEY= # (set True to enable logging) VERBOSE=False # (optional, required for production) -OPENAI_API_TYPE=azure -OPENAI_API_VERSION=2023-07-01-preview -OPENAI_API_BASE= -DEPLOYMENT_NAME= \ No newline at end of file +# OPENAI_API_TYPE=azure +# OPENAI_API_VERSION=2023-07-01-preview +# OPENAI_API_BASE= +# DEPLOYMENT_NAME= \ No newline at end of file diff --git a/README.md b/README.md index ed70db91..1b375e8e 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,23 @@ For deployments, you can use `pip install codeinterpreterapi` instead which does ## Usage -Make sure to set the `OPENAI_API_KEY` environment variable (or use a `.env` file) +To configure OpenAI and Azure OpenAI, ensure that you set the appropriate environment variables (or use a .env file): + +For OpenAI, set the OPENAI_API_KEY environment variable: +``` +export OPENAI_API_KEY=your_openai_api_key +``` + +For Azure OpenAI, set the following environment variables: +``` +export OPENAI_API_TYPE=azure +export OPENAI_API_VERSION=your_api_version +export OPENAI_API_BASE=your_api_base +export OPENAI_API_KEY=your_azure_openai_api_key +export DEPLOYMENT_NAME=your_deployment_name +``` + +Remember to replace the placeholders with your actual API keys and other required information. ```python from codeinterpreterapi import CodeInterpreterSession From df8ef240f9d727e7a729c593ebbb84304461be9d Mon Sep 17 00:00:00 2001 From: Warren Date: Fri, 4 Aug 2023 17:26:17 +0800 Subject: [PATCH 3/7] commit mistake previously --- codeinterpreterapi/session.py | 82 +++++++++++++++++------------------ 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/codeinterpreterapi/session.py b/codeinterpreterapi/session.py index 5d6e6f84..c5a4f0aa 100644 --- a/codeinterpreterapi/session.py +++ b/codeinterpreterapi/session.py @@ -72,50 +72,48 @@ def _tools( ), ] - class CodeInterpreterSession: - # ... - def _choose_llm( - self, - model: str = "gpt-4", - openai_api_key: Optional[str] = None, - **kwargs - ) -> BaseChatModel: - if "gpt" in model: - openai_api_key = ( - openai_api_key - or settings.OPENAI_API_KEY - or getenv("OPENAI_API_KEY", None) + def _choose_llm( + self, + model: str = "gpt-4", + openai_api_key: Optional[str] = None, + **kwargs + ) -> BaseChatModel: + if "gpt" in model: + openai_api_key = ( + openai_api_key + or settings.OPENAI_API_KEY + or getenv("OPENAI_API_KEY", None) + ) + if openai_api_key is None: + raise ValueError( + "OpenAI API key missing. Set OPENAI_API_KEY env variable or pass `openai_api_key` to session." + ) + openai_api_version = getenv("OPENAI_API_VERSION") + openai_api_base = getenv("OPENAI_API_BASE") + deployment_name = getenv("DEPLOYMENT_NAME") + openapi_type = getenv("OPENAI_API_TYPE") + if openapi_type == "azure" and openai_api_version and openai_api_base and deployment_name: + return AzureChatOpenAI( + temperature=0.03, + openai_api_base=openai_api_base, + openai_api_version=openai_api_version, + deployment_name=deployment_name, + openai_api_key=openai_api_key, + max_retries=3, + request_timeout=60*3 ) - if openai_api_key is None: - raise ValueError( - "OpenAI API key missing. Set OPENAI_API_KEY env variable or pass `openai_api_key` to session." - ) - openai_api_version = getenv("OPENAI_API_VERSION") - openai_api_base = getenv("OPENAI_API_BASE") - deployment_name = getenv("DEPLOYMENT_NAME") - openapi_type = getenv("OPENAI_API_TYPE") - if openapi_type == "azure" and openai_api_version and openai_api_base and deployment_name: - return AzureChatOpenAI( - temperature=0.03, - openai_api_base=openai_api_base, - openai_api_version=openai_api_version, - deployment_name=deployment_name, - openai_api_key=openai_api_key, - max_retries=3, - request_timeout=60*3 - ) - else: - return ChatOpenAI( - temperature=0.03, - model=model, - openai_api_key=openai_api_key, - max_retries=3, - request_timeout=60 * 3, - ) - elif "claude" in model: - return ChatAnthropic(model=model) else: - raise ValueError(f"Unknown model: {model} (expected gpt or claude model)") + return ChatOpenAI( + temperature=0.03, + model=model, + openai_api_key=openai_api_key, + max_retries=3, + request_timeout=60 * 3, + ) + elif "claude" in model: + return ChatAnthropic(model=model) + else: + raise ValueError(f"Unknown model: {model} (expected gpt or claude model)") def _choose_agent(self) -> BaseSingleActionAgent: return ( From 329d81c3587e759ce4505c9f69b029d634a85ded Mon Sep 17 00:00:00 2001 From: Warren Wong Date: Sun, 6 Aug 2023 23:26:10 +0800 Subject: [PATCH 4/7] resolve conflict v0.0.10 --- .env.example | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 1501822b..8ce0705d 100644 --- a/.env.example +++ b/.env.example @@ -3,9 +3,9 @@ OPENAI_API_KEY= # (optional, required for production) # CODEBOX_API_KEY= # (set True to enable logging) -VERBOSE=False -# (optional, required for production) +VERBOSE=False +# (optional, required for Azure OpenAI) # OPENAI_API_TYPE=azure # OPENAI_API_VERSION=2023-07-01-preview # OPENAI_API_BASE= -# DEPLOYMENT_NAME= +# DEPLOYMENT_NAME= \ No newline at end of file From 60178aa8b3e054c0dee81f0949fe97f8d0a45e89 Mon Sep 17 00:00:00 2001 From: somethingwentwell <46453511+somethingwentwell@users.noreply.github.com> Date: Mon, 7 Aug 2023 14:54:40 +0700 Subject: [PATCH 5/7] isort session.py --- codeinterpreterapi/session.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeinterpreterapi/session.py b/codeinterpreterapi/session.py index 52cd1459..c93f0d62 100644 --- a/codeinterpreterapi/session.py +++ b/codeinterpreterapi/session.py @@ -14,7 +14,7 @@ ConversationalAgent, ConversationalChatAgent, ) -from langchain.chat_models import ChatAnthropic, ChatOpenAI, AzureChatOpenAI +from langchain.chat_models import AzureChatOpenAI, ChatAnthropic, ChatOpenAI from langchain.chat_models.base import BaseChatModel from langchain.memory import ConversationBufferMemory from langchain.prompts.chat import MessagesPlaceholder From a7de6ee5d782350533cfdf5b641fdef60fbd7ca1 Mon Sep 17 00:00:00 2001 From: Warren Wong Date: Mon, 7 Aug 2023 16:15:41 +0800 Subject: [PATCH 6/7] pre-commit --- codeinterpreterapi/agents/functions_agent.py | 23 +++++----------- codeinterpreterapi/prompts/remove_dl_link.py | 3 +- codeinterpreterapi/session.py | 29 +++++++------------- codeinterpreterapi/utils/parser.py | 3 +- 4 files changed, 21 insertions(+), 37 deletions(-) diff --git a/codeinterpreterapi/agents/functions_agent.py b/codeinterpreterapi/agents/functions_agent.py index dced13bb..bd9eba78 100644 --- a/codeinterpreterapi/agents/functions_agent.py +++ b/codeinterpreterapi/agents/functions_agent.py @@ -16,22 +16,13 @@ from langchain.callbacks.base import BaseCallbackManager from langchain.callbacks.manager import Callbacks from langchain.chat_models.openai import ChatOpenAI -from langchain.prompts.chat import ( - BaseMessagePromptTemplate, - ChatPromptTemplate, - HumanMessagePromptTemplate, - MessagesPlaceholder, -) -from langchain.schema import ( - AgentAction, - AgentFinish, - AIMessage, - BaseMessage, - BasePromptTemplate, - FunctionMessage, - OutputParserException, - SystemMessage, -) +from langchain.prompts.chat import (BaseMessagePromptTemplate, + ChatPromptTemplate, + HumanMessagePromptTemplate, + MessagesPlaceholder) +from langchain.schema import (AgentAction, AgentFinish, AIMessage, BaseMessage, + BasePromptTemplate, FunctionMessage, + OutputParserException, SystemMessage) from langchain.tools import BaseTool from langchain.tools.convert_to_openai import format_tool_to_openai_function from pydantic import root_validator diff --git a/codeinterpreterapi/prompts/remove_dl_link.py b/codeinterpreterapi/prompts/remove_dl_link.py index c0a506d7..a0dc3b5f 100644 --- a/codeinterpreterapi/prompts/remove_dl_link.py +++ b/codeinterpreterapi/prompts/remove_dl_link.py @@ -1,4 +1,5 @@ -from langchain.prompts.chat import ChatPromptTemplate, HumanMessagePromptTemplate +from langchain.prompts.chat import (ChatPromptTemplate, + HumanMessagePromptTemplate) from langchain.schema import AIMessage, HumanMessage, SystemMessage remove_dl_link_prompt = ChatPromptTemplate( diff --git a/codeinterpreterapi/session.py b/codeinterpreterapi/session.py index 52cd1459..abb57527 100644 --- a/codeinterpreterapi/session.py +++ b/codeinterpreterapi/session.py @@ -8,13 +8,9 @@ from codeboxapi import CodeBox # type: ignore from codeboxapi.schema import CodeBoxOutput # type: ignore -from langchain.agents import ( - AgentExecutor, - BaseSingleActionAgent, - ConversationalAgent, - ConversationalChatAgent, -) -from langchain.chat_models import ChatAnthropic, ChatOpenAI, AzureChatOpenAI +from langchain.agents import (AgentExecutor, BaseSingleActionAgent, + ConversationalAgent, ConversationalChatAgent) +from langchain.chat_models import AzureChatOpenAI, ChatAnthropic, ChatOpenAI from langchain.chat_models.base import BaseChatModel from langchain.memory import ConversationBufferMemory from langchain.prompts.chat import MessagesPlaceholder @@ -22,20 +18,15 @@ from langchain.tools import BaseTool, StructuredTool from codeinterpreterapi.agents import OpenAIFunctionsAgent -from codeinterpreterapi.chains import get_file_modifications, remove_download_link +from codeinterpreterapi.chains import (get_file_modifications, + remove_download_link) from codeinterpreterapi.config import settings from codeinterpreterapi.prompts import code_interpreter_system_message -from codeinterpreterapi.schema import ( - CodeInput, - CodeInterpreterResponse, - File, - UserRequest, -) -from codeinterpreterapi.utils import ( - CodeAgentOutputParser, - CodeCallbackHandler, - CodeChatAgentOutputParser, -) +from codeinterpreterapi.schema import (CodeInput, CodeInterpreterResponse, + File, UserRequest) +from codeinterpreterapi.utils import (CodeAgentOutputParser, + CodeCallbackHandler, + CodeChatAgentOutputParser) class CodeInterpreterSession: diff --git a/codeinterpreterapi/utils/parser.py b/codeinterpreterapi/utils/parser.py index ec3b98e7..c2ff6de8 100644 --- a/codeinterpreterapi/utils/parser.py +++ b/codeinterpreterapi/utils/parser.py @@ -39,7 +39,8 @@ def _type(self) -> str: class CodeChatAgentOutputParser(AgentOutputParser): def get_format_instructions(self) -> str: - from langchain.agents.conversational_chat.prompt import FORMAT_INSTRUCTIONS + from langchain.agents.conversational_chat.prompt import \ + FORMAT_INSTRUCTIONS return FORMAT_INSTRUCTIONS From cf641fdabafc864873d746a44c6f5915bfd6961c Mon Sep 17 00:00:00 2001 From: Warren Wong Date: Mon, 7 Aug 2023 17:26:28 +0800 Subject: [PATCH 7/7] pre-commit all files --- .env.example | 2 +- README.md | 16 +++++------ codeinterpreterapi/agents/functions_agent.py | 23 +++++++++++----- codeinterpreterapi/prompts/remove_dl_link.py | 3 +-- codeinterpreterapi/session.py | 28 +++++++++++++------- codeinterpreterapi/utils/parser.py | 3 +-- 6 files changed, 46 insertions(+), 29 deletions(-) diff --git a/.env.example b/.env.example index 8ce0705d..832c364f 100644 --- a/.env.example +++ b/.env.example @@ -8,4 +8,4 @@ VERBOSE=False # OPENAI_API_TYPE=azure # OPENAI_API_VERSION=2023-07-01-preview # OPENAI_API_BASE= -# DEPLOYMENT_NAME= \ No newline at end of file +# DEPLOYMENT_NAME= diff --git a/README.md b/README.md index 8b0f8f69..b5329af0 100644 --- a/README.md +++ b/README.md @@ -31,18 +31,18 @@ To configure OpenAI and Azure OpenAI, ensure that you set the appropriate enviro For OpenAI, set the OPENAI_API_KEY environment variable: ``` -export OPENAI_API_KEY=your_openai_api_key +export OPENAI_API_KEY=your_openai_api_key ``` - + For Azure OpenAI, set the following environment variables: ``` -export OPENAI_API_TYPE=azure -export OPENAI_API_VERSION=your_api_version -export OPENAI_API_BASE=your_api_base -export OPENAI_API_KEY=your_azure_openai_api_key -export DEPLOYMENT_NAME=your_deployment_name +export OPENAI_API_TYPE=azure +export OPENAI_API_VERSION=your_api_version +export OPENAI_API_BASE=your_api_base +export OPENAI_API_KEY=your_azure_openai_api_key +export DEPLOYMENT_NAME=your_deployment_name ``` - + Remember to replace the placeholders with your actual API keys and other required information. ```python diff --git a/codeinterpreterapi/agents/functions_agent.py b/codeinterpreterapi/agents/functions_agent.py index bd9eba78..dced13bb 100644 --- a/codeinterpreterapi/agents/functions_agent.py +++ b/codeinterpreterapi/agents/functions_agent.py @@ -16,13 +16,22 @@ from langchain.callbacks.base import BaseCallbackManager from langchain.callbacks.manager import Callbacks from langchain.chat_models.openai import ChatOpenAI -from langchain.prompts.chat import (BaseMessagePromptTemplate, - ChatPromptTemplate, - HumanMessagePromptTemplate, - MessagesPlaceholder) -from langchain.schema import (AgentAction, AgentFinish, AIMessage, BaseMessage, - BasePromptTemplate, FunctionMessage, - OutputParserException, SystemMessage) +from langchain.prompts.chat import ( + BaseMessagePromptTemplate, + ChatPromptTemplate, + HumanMessagePromptTemplate, + MessagesPlaceholder, +) +from langchain.schema import ( + AgentAction, + AgentFinish, + AIMessage, + BaseMessage, + BasePromptTemplate, + FunctionMessage, + OutputParserException, + SystemMessage, +) from langchain.tools import BaseTool from langchain.tools.convert_to_openai import format_tool_to_openai_function from pydantic import root_validator diff --git a/codeinterpreterapi/prompts/remove_dl_link.py b/codeinterpreterapi/prompts/remove_dl_link.py index a0dc3b5f..c0a506d7 100644 --- a/codeinterpreterapi/prompts/remove_dl_link.py +++ b/codeinterpreterapi/prompts/remove_dl_link.py @@ -1,5 +1,4 @@ -from langchain.prompts.chat import (ChatPromptTemplate, - HumanMessagePromptTemplate) +from langchain.prompts.chat import ChatPromptTemplate, HumanMessagePromptTemplate from langchain.schema import AIMessage, HumanMessage, SystemMessage remove_dl_link_prompt = ChatPromptTemplate( diff --git a/codeinterpreterapi/session.py b/codeinterpreterapi/session.py index 167aa275..138fc74e 100644 --- a/codeinterpreterapi/session.py +++ b/codeinterpreterapi/session.py @@ -22,15 +22,20 @@ from langchain.tools import BaseTool, StructuredTool from codeinterpreterapi.agents import OpenAIFunctionsAgent -from codeinterpreterapi.chains import (get_file_modifications, - remove_download_link) +from codeinterpreterapi.chains import get_file_modifications, remove_download_link from codeinterpreterapi.config import settings from codeinterpreterapi.prompts import code_interpreter_system_message -from codeinterpreterapi.schema import (CodeInput, CodeInterpreterResponse, - File, UserRequest) -from codeinterpreterapi.utils import (CodeAgentOutputParser, - CodeCallbackHandler, - CodeChatAgentOutputParser) +from codeinterpreterapi.schema import ( + CodeInput, + CodeInterpreterResponse, + File, + UserRequest, +) +from codeinterpreterapi.utils import ( + CodeAgentOutputParser, + CodeCallbackHandler, + CodeChatAgentOutputParser, +) class CodeInterpreterSession: @@ -86,7 +91,12 @@ def _choose_llm( openai_api_base = getenv("OPENAI_API_BASE") deployment_name = getenv("DEPLOYMENT_NAME") openapi_type = getenv("OPENAI_API_TYPE") - if openapi_type == "azure" and openai_api_version and openai_api_base and deployment_name: + if ( + openapi_type == "azure" + and openai_api_version + and openai_api_base + and deployment_name + ): return AzureChatOpenAI( temperature=0.03, openai_api_base=openai_api_base, @@ -94,7 +104,7 @@ def _choose_llm( deployment_name=deployment_name, openai_api_key=openai_api_key, max_retries=3, - request_timeout=60*3 + request_timeout=60 * 3, ) else: return ChatOpenAI( diff --git a/codeinterpreterapi/utils/parser.py b/codeinterpreterapi/utils/parser.py index c2ff6de8..ec3b98e7 100644 --- a/codeinterpreterapi/utils/parser.py +++ b/codeinterpreterapi/utils/parser.py @@ -39,8 +39,7 @@ def _type(self) -> str: class CodeChatAgentOutputParser(AgentOutputParser): def get_format_instructions(self) -> str: - from langchain.agents.conversational_chat.prompt import \ - FORMAT_INSTRUCTIONS + from langchain.agents.conversational_chat.prompt import FORMAT_INSTRUCTIONS return FORMAT_INSTRUCTIONS