diff --git a/apps/1_call_azure_openai_chat/foundry_local_app.py b/apps/1_call_azure_openai_chat/foundry_local_app.py new file mode 100644 index 0000000..4ba322b --- /dev/null +++ b/apps/1_call_azure_openai_chat/foundry_local_app.py @@ -0,0 +1,78 @@ +import argparse +import logging + +from foundry_local import FoundryLocalManager +from langchain_core.prompts import ChatPromptTemplate +from langchain_openai import ChatOpenAI + +logger = logging.getLogger(__name__) + + +def init_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + prog="foundry_local_app", + description="Translate English to Japanese using Foundry Local.", + ) + parser.add_argument("-i", "--input", default="I love to code.") + parser.add_argument("-a", "--alias", default="phi-3-mini-4k") + parser.add_argument("-v", "--verbose", action="store_true") + return parser.parse_args() + + +def main( + alias: str, + input: str, +) -> None: + manager = FoundryLocalManager(alias) + + llm = ChatOpenAI( + model=manager.get_model_info(alias).id, + base_url=manager.endpoint, + api_key=manager.api_key, + temperature=0.0, + streaming=False, + ) + + prompt = ChatPromptTemplate.from_messages( + [ + ("system", "You are a helpful assistant that translates {input_language} to {output_language}."), + ("human", "{input}"), + ] + ) + + chain = prompt | llm + + try: + ai_msg = chain.invoke( + { + "input_language": "English", + "output_language": "Japanese", + "input": input, + }, + ) + logger.debug(f"AI message: {ai_msg}") + print(f"Response: {ai_msg.content}") + except Exception as e: + logger.error(e) + raise e + + +if __name__ == "__main__": + """ + # Usage + $ uv run python apps/1_call_azure_openai_chat/foundry_local_app.py --help + # Example + $ uv run python apps/1_call_azure_openai_chat/foundry_local_app.py --verbose + # References + - Get started with Foundry Local: https://learn.microsoft.com/azure/ai-foundry/foundry-local/get-started + - Build a translation application with LangChain: https://learn.microsoft.com/azure/ai-foundry/foundry-local/how-to/how-to-use-langchain-with-foundry-local?pivots=programming-language-python + """ + args = init_args() + + if args.verbose: + logging.basicConfig(level=logging.DEBUG) + + main( + alias=args.alias, + input=args.input, + ) diff --git a/pyproject.toml b/pyproject.toml index 94e5056..7483a02 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,7 @@ dependencies = [ "pydantic>=2.10.2", "azure-ai-projects>=1.0.0b2", "azure-ai-inference>=1.0.0b6", + "foundry-local-sdk>=0.3.1", ] [tool.uv] diff --git a/uv.lock b/uv.lock index 2f47c48..40b0a04 100644 --- a/uv.lock +++ b/uv.lock @@ -1191,6 +1191,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9b/1f/4417c26e26a1feab85a27e927f7a73d8aabc84544be8ba108ce4aa90eb1e/fonttools-4.58.0-py3-none-any.whl", hash = "sha256:c96c36880be2268be409df7b08c5b5dacac1827083461a6bc2cb07b8cbcec1d7", size = 1111440 }, ] +[[package]] +name = "foundry-local-sdk" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "pydantic" }, + { name = "tqdm" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/5a/7a53fcdb3c5cbf13a09119921910cc578969246d095cd65abbd85d93ea7b/foundry_local_sdk-0.3.1-py3-none-any.whl", hash = "sha256:52846d76c953ee4cd3fff9613781912a434a90b022248dc7bf4b61544970cda9", size = 12085 }, +] + [[package]] name = "frozenlist" version = "1.6.0" @@ -5284,7 +5297,7 @@ name = "triton" version = "3.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "setuptools" }, + { name = "setuptools", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/76/04/d54d3a6d077c646624dc9461b0059e23fd5d30e0dbe67471e3654aec81f9/triton-3.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fad99beafc860501d7fcc1fb7045d9496cbe2c882b1674640304949165a916e7", size = 156441993 }, @@ -5670,6 +5683,7 @@ dependencies = [ { name = "azure-search-documents" }, { name = "azure-storage-blob" }, { name = "beautifulsoup4" }, + { name = "foundry-local-sdk" }, { name = "langchain" }, { name = "langchain-chroma" }, { name = "langchain-community" }, @@ -5719,6 +5733,7 @@ requires-dist = [ { name = "azure-search-documents", specifier = ">=11.5.1" }, { name = "azure-storage-blob", specifier = ">=12.23.1" }, { name = "beautifulsoup4", specifier = ">=4.12.3" }, + { name = "foundry-local-sdk", specifier = ">=0.3.1" }, { name = "langchain", specifier = ">=0.3.2" }, { name = "langchain-chroma", specifier = ">=0.1.4" }, { name = "langchain-community", specifier = ">=0.3.1" },