Skip to content

Commit

Permalink
Remove kernel builder pattern for Python: sk.kernel_create() -> sk.Ke…
Browse files Browse the repository at this point in the history
…rnel() (#454)

### Motivation and Context

This PR makes creating a kernel instance more pythonic. The builder
pattern is removed and the kernel is constructed using Kernel(...).

Work originally started with #137

### Description

- Removed kernel_builder.py.
- Instance creation pattern `kernel = sk.create_kernel() -> kernel =
sk.Kernel()`
- For notebook 6, there is no need to create a separate kernel for the
GitHub files. Changed to use a separate collection.


Co-authored-by: Devis Lucato <dluc@users.noreply.github.com>
  • Loading branch information
awharrison-28 and dluc authored Apr 17, 2023
1 parent f06a845 commit d9323b5
Show file tree
Hide file tree
Showing 23 changed files with 86 additions and 222 deletions.
2 changes: 1 addition & 1 deletion python/DEV_SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ You should be able to run the example under the [tests](tests) folder.
## Pipeline checks

To run the same checks that run during the GitHub Action build, you can use
this command, from the `python` folder:
this command, from the [python](../python) folder:

poetry run pre-commit run -c .conf/.pre-commit-config.yaml -a

Expand Down
2 changes: 1 addition & 1 deletion python/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ AZURE_OPENAI_API_KEY=""
import semantic_kernel as sk
from semantic_kernel.ai.open_ai import OpenAITextCompletion, AzureTextCompletion

kernel = sk.create_kernel()
kernel = sk.Kernel()

# Prepare OpenAI backend using credentials stored in the `.env` file
api_key, org_id = sk.openai_settings_from_dot_env()
Expand Down
2 changes: 1 addition & 1 deletion python/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "semantic-kernel"
version = "0.2.2.dev"
version = "0.2.3.dev"
description = ""
authors = ["Microsoft <SK-Support@microsoft.com>"]
readme = "README.md"
Expand Down
15 changes: 3 additions & 12 deletions python/semantic_kernel/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

from semantic_kernel import core_skills, memory
from semantic_kernel.kernel import Kernel
from semantic_kernel.kernel_builder import KernelBuilder
from semantic_kernel.kernel_config import KernelConfig
from semantic_kernel.memory.null_memory import NullMemory
from semantic_kernel.orchestration.context_variables import ContextVariables
from semantic_kernel.orchestration.sk_context import SKContext
from semantic_kernel.orchestration.sk_function_base import SKFunctionBase
Expand All @@ -22,17 +20,10 @@
openai_settings_from_dot_env,
)


def create_kernel() -> Kernel:
return KernelBuilder.create_kernel()


def kernel_builder() -> KernelBuilder:
return KernelBuilder(KernelConfig(), NullMemory(), NullLogger())


__all__ = [
"create_kernel",
"Kernel",
"KernelConfig",
"NullLogger",
"openai_settings_from_dot_env",
"azure_openai_settings_from_dot_env",
"PromptTemplateConfig",
Expand Down
33 changes: 23 additions & 10 deletions python/semantic_kernel/kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
from semantic_kernel.kernel_config import KernelConfig
from semantic_kernel.kernel_exception import KernelException
from semantic_kernel.kernel_extensions import KernelExtensions
from semantic_kernel.memory.memory_store_base import MemoryStoreBase
from semantic_kernel.memory.null_memory import NullMemory
from semantic_kernel.memory.semantic_text_memory_base import SemanticTextMemoryBase
from semantic_kernel.orchestration.context_variables import ContextVariables
from semantic_kernel.orchestration.sk_context import SKContext
Expand All @@ -26,9 +28,11 @@
)
from semantic_kernel.skill_definition.skill_collection import SkillCollection
from semantic_kernel.skill_definition.skill_collection_base import SkillCollectionBase
from semantic_kernel.template_engine.prompt_template_engine import PromptTemplateEngine
from semantic_kernel.template_engine.protocols.prompt_templating_engine import (
PromptTemplatingEngine,
)
from semantic_kernel.utils.null_logger import NullLogger
from semantic_kernel.utils.validation import validate_function_name, validate_skill_name


Expand All @@ -41,17 +45,23 @@ class Kernel(KernelBase, KernelExtensions):

def __init__(
self,
skill_collection: SkillCollectionBase,
prompt_template_engine: PromptTemplatingEngine,
memory: SemanticTextMemoryBase,
config: KernelConfig,
log: Logger,
skill_collection: Optional[SkillCollectionBase] = None,
prompt_template_engine: Optional[PromptTemplatingEngine] = None,
memory: Optional[SemanticTextMemoryBase] = None,
config: Optional[KernelConfig] = None,
log: Optional[Logger] = None,
) -> None:
self._log = log
self._config = config
self._skill_collection = skill_collection
self._prompt_template_engine = prompt_template_engine
self._memory = memory
self._log = log if log else NullLogger()
self._config = config if config else KernelConfig()
self._skill_collection = (
skill_collection if skill_collection else SkillCollection(self._log)
)
self._prompt_template_engine = (
prompt_template_engine
if prompt_template_engine
else PromptTemplateEngine(self._log)
)
self._memory = memory if memory else NullMemory()

def kernel(self) -> KernelBase:
return self
Expand Down Expand Up @@ -158,6 +168,9 @@ def func(self, skill_name: str, function_name: str) -> SKFunctionBase:
def register_memory(self, memory: SemanticTextMemoryBase) -> None:
self._memory = memory

def register_memory_store(self, memory_store: MemoryStoreBase) -> None:
self.use_memory(memory_store)

def create_new_context(self) -> SKContext:
return SKContext(
ContextVariables(),
Expand Down
92 changes: 0 additions & 92 deletions python/semantic_kernel/kernel_builder.py

This file was deleted.

2 changes: 1 addition & 1 deletion python/tests/end-to-end/basics.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import semantic_kernel as sk
import semantic_kernel.ai.open_ai as sk_oai

kernel = sk.create_kernel()
kernel = sk.Kernel()

# Load credentials from .env file
api_key, org_id = sk.openai_settings_from_dot_env()
Expand Down
2 changes: 1 addition & 1 deletion python/tests/end-to-end/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
ChatBot:>
"""

kernel = sk.create_kernel()
kernel = sk.Kernel()

api_key, org_id = sk.openai_settings_from_dot_env()
kernel.config.add_text_backend(
Expand Down
2 changes: 1 addition & 1 deletion python/tests/end-to-end/chat_gpt_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
flowery prose.
"""

kernel = sk.create_kernel()
kernel = sk.Kernel()

api_key, org_id = sk.openai_settings_from_dot_env()
kernel.config.add_chat_backend(
Expand Down
40 changes: 12 additions & 28 deletions python/tests/end-to-end/memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,33 +7,6 @@
import semantic_kernel.ai.open_ai as sk_oai


def build_kernel() -> sk.Kernel:
# Setup kernel with OpenAI completion and embedding backends
api_key, org_id = sk.openai_settings_from_dot_env()

kernel = (
sk.kernel_builder()
.configure(
lambda c: c.add_text_backend(
"davinci-003",
sk_oai.OpenAITextCompletion("text-davinci-003", api_key, org_id),
)
)
.configure(
lambda c: c.add_embedding_backend(
"ada-002",
sk_oai.OpenAITextEmbedding("text-embedding-ada-002", api_key, org_id),
)
)
.with_memory_storage(sk.memory.VolatileMemoryStore())
.build()
)

kernel.import_skill(sk.core_skills.TextMemorySkill())

return kernel


async def populate_memory(kernel: sk.Kernel) -> None:
# Add some documents to the semantic memory
await kernel.memory.save_information_async(
Expand Down Expand Up @@ -132,7 +105,18 @@ async def chat(


async def main() -> None:
kernel = build_kernel()
kernel = sk.Kernel()

api_key, org_id = sk.openai_settings_from_dot_env()
kernel.config.add_text_backend(
"dv", sk_oai.OpenAITextCompletion("text-davinci-003", api_key, org_id)
)
kernel.config.add_embedding_backend(
"ada", sk_oai.OpenAITextEmbedding("text-embedding-ada-002", api_key, org_id)
)

kernel.register_memory_store(memory_store=sk.memory.VolatileMemoryStore())
kernel.import_skill(sk.core_skills.TextMemorySkill())

print("Populating memory...")
await populate_memory(kernel)
Expand Down
2 changes: 1 addition & 1 deletion python/tests/end-to-end/skills_from_dir.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import semantic_kernel as sk
import semantic_kernel.ai.open_ai as sk_oai

kernel = sk.create_kernel()
kernel = sk.Kernel()

useAzureOpenAI = False
model = "text-davinci-002"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from pytest import mark, raises

import semantic_kernel as sk
from semantic_kernel import Kernel
from semantic_kernel.skill_definition import sk_function
from semantic_kernel.template_engine.prompt_template_engine import PromptTemplateEngine

Expand Down Expand Up @@ -54,7 +54,7 @@ async def test_it_supports_variables_async(self):
winner = "SK"
template = "And the winner\n of {{$input}} \nis: {{ $winner }}!"

kernel = sk.create_kernel()
kernel = Kernel()
context = kernel.create_new_context()
context["input"] = input
context["winner"] = winner
Expand All @@ -74,7 +74,7 @@ async def test_it_supports_values_async(self):
template = "And the winner\n of {{'template\ntests'}} \nis: {{ \"SK\" }}!"
expected = "And the winner\n of template\ntests \nis: SK!"

kernel = sk.create_kernel()
kernel = Kernel()
context = kernel.create_new_context()

# Act
Expand All @@ -87,7 +87,7 @@ async def test_it_supports_values_async(self):
async def test_it_allows_to_pass_variables_to_functions_async(self):
# Arrange
template = "== {{my.check123 $call}} =="
kernel = sk.create_kernel()
kernel = Kernel()
kernel.import_skill(MySkill(), "my")
context = kernel.create_new_context()
context["call"] = "123"
Expand All @@ -102,7 +102,7 @@ async def test_it_allows_to_pass_variables_to_functions_async(self):
async def test_it_allows_to_pass_values_to_functions_async(self):
# Arrange
template = "== {{my.check123 '234'}} =="
kernel = sk.create_kernel()
kernel = Kernel()
kernel.import_skill(MySkill(), "my")
context = kernel.create_new_context()

Expand All @@ -116,7 +116,7 @@ async def test_it_allows_to_pass_values_to_functions_async(self):
async def test_it_allows_to_pass_escaped_values1_to_functions_async(self):
# Arrange
template = "== {{my.check123 'a\\'b'}} =="
kernel = sk.create_kernel()
kernel = Kernel()
kernel.import_skill(MySkill(), "my")
context = kernel.create_new_context()

Expand All @@ -130,7 +130,7 @@ async def test_it_allows_to_pass_escaped_values1_to_functions_async(self):
async def test_it_allows_to_pass_escaped_values2_to_functions_async(self):
# Arrange
template = '== {{my.check123 "a\\"b"}} =='
kernel = sk.create_kernel()
kernel = Kernel()
kernel.import_skill(MySkill(), "my")
context = kernel.create_new_context()

Expand All @@ -148,7 +148,7 @@ async def test_it_handle_edge_cases_async(
self, template: str, expected_result: str
):
# Arrange
kernel = sk.create_kernel()
kernel = Kernel()
kernel.import_skill(MySkill())
context = kernel.create_new_context()

Expand Down
4 changes: 2 additions & 2 deletions python/tests/unit/core_skills/test_file_io_skill.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import pytest

import semantic_kernel as sk
from semantic_kernel import Kernel
from semantic_kernel.core_skills.file_io_skill import FileIOSkill
from semantic_kernel.orchestration.context_variables import ContextVariables
from semantic_kernel.orchestration.sk_context import SKContext
Expand All @@ -15,7 +15,7 @@ def test_can_be_instantiated():


def test_can_be_imported():
kernel = sk.create_kernel()
kernel = Kernel()
assert kernel.import_skill(FileIOSkill(), "file")
assert kernel.skills.has_native_function("file", "readAsync")

Expand Down
Loading

0 comments on commit d9323b5

Please sign in to comment.