mirror of
https://github.com/microsoft/semantic-kernel.git
synced 2026-10-12 02:19:06 +00:00
### Motivation and Context The .NET SDK uses the `Kernel` prefix instead of `SK` for the context, function, model, etc. classes. This PR aligns the Python package with that policy. Fixes #4561 ### Contribution Checklist - [X] The code builds clean without any errors or warnings - [X] The PR follows the [SK Contribution Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md) and the [pre-submission formatting script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts) raises no violations - [X] All unit tests pass, and I have added new tests where possible - [X] I didn't break anyone 😄
116 lines
4.0 KiB
Python
116 lines
4.0 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
import asyncio
|
|
import os
|
|
from typing import Tuple
|
|
|
|
import semantic_kernel as sk
|
|
import semantic_kernel.connectors.ai.open_ai as sk_oai
|
|
from semantic_kernel.connectors.ai.open_ai.semantic_functions.open_ai_chat_prompt_template import (
|
|
OpenAIChatPromptTemplate,
|
|
)
|
|
from semantic_kernel.connectors.ai.open_ai.utils import (
|
|
chat_completion_with_function_call,
|
|
get_function_calling_object,
|
|
)
|
|
from semantic_kernel.core_plugins import MathPlugin
|
|
|
|
system_message = """
|
|
You are a chat bot. Your name is Mosscap and
|
|
you have one goal: figure out what people need.
|
|
Your full name, should you need to know it, is
|
|
Splendid Speckled Mosscap. You communicate
|
|
effectively, but you tend to answer with long
|
|
flowery prose. You are also a math wizard,
|
|
especially for adding and subtracting.
|
|
You also excel at joke telling, where your tone is often sarcastic.
|
|
Once you have the answer I am looking for,
|
|
you will return a full answer to me as soon as possible.
|
|
"""
|
|
|
|
kernel = sk.Kernel()
|
|
|
|
deployment_name, api_key, endpoint = sk.azure_openai_settings_from_dot_env()
|
|
api_version = "2023-07-01-preview"
|
|
kernel.add_chat_service(
|
|
"chat-gpt",
|
|
sk_oai.AzureChatCompletion(
|
|
deployment_name,
|
|
endpoint,
|
|
api_key=api_key,
|
|
api_version=api_version,
|
|
),
|
|
)
|
|
|
|
plugins_directory = os.path.join(__file__, "../../../../samples/plugins")
|
|
# adding plugins to the kernel
|
|
# the joke plugin in the FunPlugins is a semantic plugin and has the function calling disabled.
|
|
kernel.import_semantic_plugin_from_directory(plugins_directory, "FunPlugin")
|
|
# the math plugin is a core plugin and has the function calling enabled.
|
|
kernel.import_plugin(MathPlugin(), plugin_name="math")
|
|
|
|
# enabling or disabling function calling is done by setting the function_call parameter for the completion.
|
|
# when the function_call parameter is set to "auto" the model will decide which function to use, if any.
|
|
# if you only want to use a specific function, set the name of that function in this parameter,
|
|
# the format for that is 'PluginName-FunctionName', (i.e. 'math-Add').
|
|
# if the model or api version do not support this you will get an error.
|
|
prompt_config = sk.PromptTemplateConfig(
|
|
execution_settings=sk_oai.AzureChatRequestSettings(
|
|
service_id="chat-gpt",
|
|
ai_model_id=deployment_name,
|
|
max_tokens=2000,
|
|
temperature=0.7,
|
|
top_p=0.8,
|
|
function_call="auto",
|
|
functions=get_function_calling_object(kernel, {"exclude_plugin": ["ChatBot"]}),
|
|
)
|
|
)
|
|
prompt_template = OpenAIChatPromptTemplate("{{$user_input}}", kernel.prompt_template_engine, prompt_config)
|
|
prompt_template.add_system_message(system_message)
|
|
prompt_template.add_user_message("Hi there, who are you?")
|
|
prompt_template.add_assistant_message("I am Mosscap, a chat bot. I'm trying to figure out what people need.")
|
|
|
|
function_config = sk.SemanticFunctionConfig(prompt_config, prompt_template)
|
|
chat_function = kernel.register_semantic_function("ChatBot", "Chat", function_config)
|
|
|
|
|
|
async def chat(context: sk.KernelContext) -> Tuple[bool, sk.KernelContext]:
|
|
try:
|
|
user_input = input("User:> ")
|
|
context.variables["user_input"] = user_input
|
|
except KeyboardInterrupt:
|
|
print("\n\nExiting chat...")
|
|
return False, None
|
|
except EOFError:
|
|
print("\n\nExiting chat...")
|
|
return False, None
|
|
|
|
if user_input == "exit":
|
|
print("\n\nExiting chat...")
|
|
return False, None
|
|
|
|
context = await chat_completion_with_function_call(
|
|
kernel,
|
|
chat_plugin_name="ChatBot",
|
|
chat_function_name="Chat",
|
|
context=context,
|
|
)
|
|
print(f"Mosscap:> {context.result}")
|
|
return True, context
|
|
|
|
|
|
async def main() -> None:
|
|
chatting = True
|
|
context = kernel.create_new_context()
|
|
print(
|
|
"Welcome to the chat bot!\
|
|
\n Type 'exit' to exit.\
|
|
\n Try a math question to see the function calling in action (i.e. what is 3+3?)."
|
|
)
|
|
while chatting:
|
|
chatting, context = await chat(context)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|