Skip to content

Commit

Permalink
Merge branch 'microsoft:main' into update-modelid
Browse files Browse the repository at this point in the history
  • Loading branch information
SandraAhlgrimm committed Jan 8, 2024
2 parents f2cab02 + 9db47e5 commit 4277528
Show file tree
Hide file tree
Showing 24 changed files with 1,369 additions and 1,211 deletions.
4 changes: 2 additions & 2 deletions dotnet/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
<PackageVersion Include="Moq" Version="[4.18.4]" />
<PackageVersion Include="System.Threading.Channels" Version="8.0.0" />
<PackageVersion Include="System.Threading.Tasks.Dataflow" Version="8.0.0" />
<PackageVersion Include="xunit" Version="2.6.3" />
<PackageVersion Include="xunit" Version="2.6.4" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.6" />
<PackageVersion Include="xretry" Version="1.9.0" />
<PackageVersion Include="coverlet.collector" Version="6.0.0" />
Expand Down Expand Up @@ -91,7 +91,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageVersion Include="xunit.analyzers" Version="1.7.0" />
<PackageVersion Include="xunit.analyzers" Version="1.8.0" />
<PackageReference Include="xunit.analyzers">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// Copyright (c) Microsoft. All rights reserved.

using System;
using System.Text.RegularExpressions;
using Microsoft.Extensions.Logging;

Expand Down Expand Up @@ -35,21 +36,14 @@ internal sealed class NamedArgBlock : Block, ITextRendering
public NamedArgBlock(string? text, ILoggerFactory? logger = null)
: base(NamedArgBlock.TrimWhitespace(text), logger)
{
var argParts = this.Content.Split(Symbols.NamedArgBlockSeparator);
if (argParts.Length != 2)
if (!TryGetNameAndValue(this.Content, out string argName, out string argValue))
{
this.Logger.LogError("Invalid named argument `{Text}`", text);
throw new KernelException($"A function named argument must contain a name and value separated by a '{Symbols.NamedArgBlockSeparator}' character.");
}

this.Name = argParts[0];
this._argNameAsVarBlock = new VarBlock($"{Symbols.VarPrefix}{argParts[0]}");
var argValue = argParts[1];
if (argValue.Length == 0)
{
this.Logger.LogError("Invalid named argument `{Text}`", text);
throw new KernelException($"A function named argument must contain a quoted value or variable after the '{Symbols.NamedArgBlockSeparator}' character.");
}
this.Name = argName;
this._argNameAsVarBlock = new VarBlock($"{Symbols.VarPrefix}{argName}");

if (argValue[0] == Symbols.VarPrefix)
{
Expand All @@ -61,6 +55,34 @@ public NamedArgBlock(string? text, ILoggerFactory? logger = null)
}
}

/// <summary>
/// Attempts to extract the name and value of a named argument block from a string
/// </summary>
/// <param name="text">String from which to extract a name and value</param>
/// <param name="name">Name extracted from argument block, when successful. Empty string otherwise.</param>
/// <param name="value">Value extracted from argument block, when successful. Empty string otherwise.</param>
/// <returns>true when a name and value are successfully extracted from the given text, false otherwise</returns>
internal static bool TryGetNameAndValue(string? text, out string name, out string value)
{
name = string.Empty;
value = string.Empty;

if (!string.IsNullOrEmpty(text))
{
string[] argBlockParts = text!.Split(new char[] { Symbols.NamedArgBlockSeparator }, StringSplitOptions.RemoveEmptyEntries);

if (argBlockParts.Length == 2)
{
name = argBlockParts[0];
value = argBlockParts[1];

return true;
}
}

return false;
}

/// <summary>
/// Gets the rendered value of the function argument. If the value is a <see cref="ValBlock"/>, the value stays the same.
/// If the value is a <see cref="VarBlock"/>, the value of the variable is determined by the arguments passed in.
Expand Down
11 changes: 5 additions & 6 deletions dotnet/src/SemanticKernel.Core/TemplateEngine/CodeTokenizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -322,14 +322,13 @@ private static bool CanBeEscaped(char c)
Justification = "Does not throw an exception by design.")]
private static bool IsValidNamedArg(string tokenContent)
{
try
if (NamedArgBlock.TryGetNameAndValue(tokenContent, out string _, out string _))
{
var tokenContentAsNamedArg = new NamedArgBlock(tokenContent);
return tokenContentAsNamedArg.IsValid(out var error);
}
catch
{
return false;

return tokenContentAsNamedArg.IsValid(out string _);
}

return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,11 @@ public void ArgValueNeedsQuoteOrDollarSignPrefix()
public void ArgNameShouldBeNonEmpty()
{
// Arrange
var target = new NamedArgBlock("='b'");
static NamedArgBlock funcToTest() => new("='b'");

// Act + Assert
Assert.False(target.IsValid(out var error));
Assert.Equal("A named argument must have a name", error);
KernelException exception = Assert.Throws<KernelException>(funcToTest);
Assert.Equal("A function named argument must contain a name and value separated by a '=' character.", exception.Message);
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,12 +209,12 @@ public void ItThrowsWhenSeparatorsAreMissing(string template)
}

[Theory]
[InlineData("f a =", "A function named argument must contain a quoted value or variable after the '=' character.")]
[InlineData("f a='b' arg2", "A function named argument must contain a name and value separated by a '=' character.")]
public void ItThrowsWhenArgValueIsMissing(string template, string expectedErrorMessage)
[InlineData("f a =")]
[InlineData("f a='b' arg2")]
public void ItThrowsWhenArgValueIsMissing(string template)
{
// Act & Assert
var exception = Assert.Throws<KernelException>(() => this._target.Tokenize(template));
Assert.Equal(expectedErrorMessage, exception.Message);
Assert.Equal("A function named argument must contain a name and value separated by a '=' character.", exception.Message);
}
}
4 changes: 2 additions & 2 deletions python/notebooks/00-getting-started.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"metadata": {},
"outputs": [],
"source": [
"!python -m pip install semantic-kernel==0.4.3.dev0"
"!python -m pip install semantic-kernel==0.4.4.dev0"
]
},
{
Expand Down Expand Up @@ -57,7 +57,7 @@
"\n",
"api_key, org_id = sk.openai_settings_from_dot_env()\n",
"\n",
"kernel.add_chat_service(\"chat-gpt\", OpenAIChatCompletion(ai_model_id=\"gpt-3.5-turbo\", api_key=api_key, org_id=org_id))"
"kernel.add_chat_service(\"chat-gpt\", OpenAIChatCompletion(ai_model_id=\"gpt-3.5-turbo-1106\", api_key=api_key, org_id=org_id))"
]
},
{
Expand Down
25 changes: 14 additions & 11 deletions python/notebooks/01-basic-loading-the-kernel.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,20 @@
"metadata": {},
"outputs": [],
"source": [
"!python -m pip install semantic-kernel==0.4.3.dev0"
"!python -m pip install semantic-kernel==0.4.4.dev0"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import semantic_kernel as sk\n",
"from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion, OpenAIChatCompletion"
"from semantic_kernel.connectors.ai.open_ai import (\n",
" AzureChatCompletion,\n",
" OpenAIChatCompletion,\n",
")"
]
},
{
Expand All @@ -48,7 +51,7 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
Expand Down Expand Up @@ -85,13 +88,13 @@
" )\n",
")\n",
"\n",
"kernel.add_chat_service( # We are adding a text service\n",
" \"OpenAI_chat_gpt\", # The alias we can use in prompt templates' config.json\n",
"kernel.add_chat_service( # We are adding a text service\n",
" \"OpenAI_chat_gpt\", # The alias we can use in prompt templates' config.json\n",
" OpenAIChatCompletion(\n",
" ai_model_id=\"gpt-3.5-turbo\", # OpenAI Model Name\n",
" api_key=\"...your OpenAI API Key...\", # OpenAI API key\n",
" org_id=\"...your OpenAI Org ID...\" # *optional* OpenAI Organization ID\n",
" )\n",
" ai_model_id=\"gpt-3.5-turbo\", # OpenAI Model Name\n",
" api_key=\"...your OpenAI API Key...\", # OpenAI API key\n",
" org_id=\"...your OpenAI Org ID...\", # *optional* OpenAI Organization ID\n",
" ),\n",
")"
]
},
Expand Down Expand Up @@ -143,7 +146,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.6"
"version": "3.10.12"
},
"polyglot_notebook": {
"kernelInfo": {
Expand Down
13 changes: 9 additions & 4 deletions python/notebooks/02-running-prompts-from-file.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@
"metadata": {},
"outputs": [],
"source": [
"!python -m pip install semantic-kernel==0.4.3.dev0"
"!python -m pip install semantic-kernel==0.4.4.dev0"
]
},
{
Expand All @@ -100,7 +100,10 @@
"outputs": [],
"source": [
"import semantic_kernel as sk\n",
"from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion, OpenAIChatCompletion\n",
"from semantic_kernel.connectors.ai.open_ai import (\n",
" AzureChatCompletion,\n",
" OpenAIChatCompletion,\n",
")\n",
"\n",
"kernel = sk.Kernel()\n",
"\n",
Expand All @@ -109,7 +112,9 @@
"# Configure AI service used by the kernel\n",
"if useAzureOpenAI:\n",
" deployment, api_key, endpoint = sk.azure_openai_settings_from_dot_env()\n",
" azure_chat_service = AzureChatCompletion(deployment_name=\"turbo\", endpoint=endpoint, api_key=api_key) # set the deployment name to the value of your chat model\n",
" azure_chat_service = AzureChatCompletion(\n",
" deployment_name=\"turbo\", endpoint=endpoint, api_key=api_key\n",
" ) # set the deployment name to the value of your chat model\n",
" kernel.add_chat_service(\"chat_completion\", azure_chat_service)\n",
"else:\n",
" api_key, org_id = sk.openai_settings_from_dot_env()\n",
Expand Down Expand Up @@ -192,7 +197,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.6"
"version": "3.10.12"
}
},
"nbformat": 4,
Expand Down
22 changes: 16 additions & 6 deletions python/notebooks/03-semantic-function-inline.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
"metadata": {},
"outputs": [],
"source": [
"!python -m pip install semantic-kernel==0.4.3.dev0"
"!python -m pip install semantic-kernel==0.4.4.dev0"
]
},
{
Expand All @@ -66,7 +66,10 @@
"outputs": [],
"source": [
"import semantic_kernel as sk\n",
"from semantic_kernel.connectors.ai.open_ai import AzureTextCompletion, OpenAITextCompletion\n",
"from semantic_kernel.connectors.ai.open_ai import (\n",
" AzureTextCompletion,\n",
" OpenAITextCompletion,\n",
")\n",
"\n",
"kernel = sk.Kernel()\n",
"\n",
Expand All @@ -75,7 +78,9 @@
"# Configure AI service used by the kernel\n",
"if useAzureOpenAI:\n",
" deployment, api_key, endpoint = sk.azure_openai_settings_from_dot_env()\n",
" azure_text_service = AzureTextCompletion(deployment_name=\"text\", endpoint=endpoint, api_key=api_key) # set the deployment name to the value of your text model\n",
" azure_text_service = AzureTextCompletion(\n",
" deployment_name=\"text\", endpoint=endpoint, api_key=api_key\n",
" ) # set the deployment name to the value of your text model\n",
" kernel.add_text_completion_service(\"dv\", azure_text_service)\n",
"else:\n",
" api_key, org_id = sk.openai_settings_from_dot_env()\n",
Expand Down Expand Up @@ -196,7 +201,10 @@
"outputs": [],
"source": [
"import semantic_kernel as sk\n",
"from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion, OpenAIChatCompletion\n",
"from semantic_kernel.connectors.ai.open_ai import (\n",
" AzureChatCompletion,\n",
" OpenAIChatCompletion,\n",
")\n",
"\n",
"kernel = sk.Kernel()\n",
"\n",
Expand All @@ -205,7 +213,9 @@
"# Configure AI service used by the kernel\n",
"if useAzureOpenAI:\n",
" deployment, api_key, endpoint = sk.azure_openai_settings_from_dot_env()\n",
" azure_chat_service = AzureChatCompletion(deployment_name=\"turbo\", endpoint=endpoint, api_key=api_key) # set the deployment name to the value of your chat model\n",
" azure_chat_service = AzureChatCompletion(\n",
" deployment_name=\"turbo\", endpoint=endpoint, api_key=api_key\n",
" ) # set the deployment name to the value of your chat model\n",
" kernel.add_chat_service(\"chat_completion\", azure_chat_service)\n",
"else:\n",
" api_key, org_id = sk.openai_settings_from_dot_env()\n",
Expand Down Expand Up @@ -241,7 +251,7 @@
"\n",
"summary = tldr_function(text)\n",
"\n",
"print(f\"Output: {summary}\") # Output: Robots must not harm humans."
"print(f\"Output: {summary}\") # Output: Robots must not harm humans."
]
}
],
Expand Down
20 changes: 15 additions & 5 deletions python/notebooks/04-context-variables-chat.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"metadata": {},
"outputs": [],
"source": [
"!python -m pip install semantic-kernel==0.4.3.dev0"
"!python -m pip install semantic-kernel==0.4.4.dev0"
]
},
{
Expand All @@ -37,7 +37,10 @@
"outputs": [],
"source": [
"import semantic_kernel as sk\n",
"from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion, OpenAIChatCompletion\n",
"from semantic_kernel.connectors.ai.open_ai import (\n",
" AzureChatCompletion,\n",
" OpenAIChatCompletion,\n",
")\n",
"\n",
"kernel = sk.Kernel()\n",
"\n",
Expand All @@ -46,10 +49,16 @@
"# Configure AI service used by the kernel\n",
"if useAzureOpenAI:\n",
" deployment, api_key, endpoint = sk.azure_openai_settings_from_dot_env()\n",
" kernel.add_chat_service(\"chat_completion\", AzureChatCompletion(deployment_name=deployment, endpoint=endpoint, api_key=api_key))\n",
" kernel.add_chat_service(\n",
" \"chat_completion\",\n",
" AzureChatCompletion(deployment_name=deployment, endpoint=endpoint, api_key=api_key),\n",
" )\n",
"else:\n",
" api_key, org_id = sk.openai_settings_from_dot_env()\n",
" kernel.add_chat_service(\"gpt-3.5\", OpenAIChatCompletion(ai_model_id=\"gpt-3.5-turbo\", api_key=api_key, org_id=org_id))\n"
" kernel.add_chat_service(\n",
" \"gpt-3.5\",\n",
" OpenAIChatCompletion(ai_model_id=\"gpt-3.5-turbo\", api_key=api_key, org_id=org_id),\n",
" )"
]
},
{
Expand Down Expand Up @@ -98,7 +107,8 @@
" function_name=\"ChatBot\",\n",
" max_tokens=2000,\n",
" temperature=0.7,\n",
" top_p=0.5)"
" top_p=0.5,\n",
")"
]
},
{
Expand Down
Loading

0 comments on commit 4277528

Please sign in to comment.