Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 25 additions & 4 deletions src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@
/// <returns>A <see cref="Part"/> object representing the given AI content, or null if the content type is unsupported.</returns>
public static Part? ToPart(this AIContent content, ChatOptions? options = null)
{
return content switch
var part = content switch
{
TextContent text => new Part { Text = text.Text },
DataContent image => new Part
Expand Down Expand Up @@ -175,6 +175,15 @@
},
_ => null,
};

if (part != null && content.AdditionalProperties != null &&
content.AdditionalProperties.TryGetValue(AdditionalPropertiesKeys.ThoughtSignature, out var signature) &&

Check failure on line 180 in src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs

View workflow job for this annotation

GitHub Actions / build (9.0.x)

'AdditionalPropertiesKeys' does not contain a definition for 'ThoughtSignature'

Check failure on line 180 in src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs

View workflow job for this annotation

GitHub Actions / build (9.0.x)

'AdditionalPropertiesKeys' does not contain a definition for 'ThoughtSignature'

Check failure on line 180 in src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs

View workflow job for this annotation

GitHub Actions / build (9.0.x)

'AdditionalPropertiesKeys' does not contain a definition for 'ThoughtSignature'

Check failure on line 180 in src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs

View workflow job for this annotation

GitHub Actions / build (9.0.x)

'AdditionalPropertiesKeys' does not contain a definition for 'ThoughtSignature'
signature is string signatureString)
{
part.ThoughtSignature = signatureString;
}

return part;
}

/// <summary>
Expand Down Expand Up @@ -590,13 +599,25 @@
{
if (part.Text is not null)
{
(contents ??= new()).Add(new TextContent(part.Text));
var textContent = new TextContent(part.Text);
if (part.ThoughtSignature != null)
{
textContent.AdditionalProperties ??= new AdditionalPropertiesDictionary();
textContent.AdditionalProperties[AdditionalPropertiesKeys.ThoughtSignature] = part.ThoughtSignature;

Check failure on line 606 in src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs

View workflow job for this annotation

GitHub Actions / build (9.0.x)

'AdditionalPropertiesKeys' does not contain a definition for 'ThoughtSignature'

Check failure on line 606 in src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs

View workflow job for this annotation

GitHub Actions / build (9.0.x)

'AdditionalPropertiesKeys' does not contain a definition for 'ThoughtSignature'

Check failure on line 606 in src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs

View workflow job for this annotation

GitHub Actions / build (9.0.x)

'AdditionalPropertiesKeys' does not contain a definition for 'ThoughtSignature'
}
(contents ??= new()).Add(textContent);
}

if (part.FunctionCall is not null)
{
(contents ??= new()).Add(new FunctionCallContent(part.FunctionCall.Name, part.FunctionCall.Name,
ConvertFunctionCallArg(part.FunctionCall.Args, part.FunctionCall.Name, options)));
var functionCallContent = new FunctionCallContent(part.FunctionCall.Name, part.FunctionCall.Name,
ConvertFunctionCallArg(part.FunctionCall.Args, part.FunctionCall.Name, options));
if (part.ThoughtSignature != null)
{
functionCallContent.AdditionalProperties ??= new AdditionalPropertiesDictionary();
functionCallContent.AdditionalProperties[AdditionalPropertiesKeys.ThoughtSignature] = part.ThoughtSignature;

Check failure on line 618 in src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs

View workflow job for this annotation

GitHub Actions / build (9.0.x)

'AdditionalPropertiesKeys' does not contain a definition for 'ThoughtSignature'

Check failure on line 618 in src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs

View workflow job for this annotation

GitHub Actions / build (9.0.x)

'AdditionalPropertiesKeys' does not contain a definition for 'ThoughtSignature'

Check failure on line 618 in src/GenerativeAI.Microsoft/Extensions/MicrosoftExtensions.cs

View workflow job for this annotation

GitHub Actions / build (9.0.x)

'AdditionalPropertiesKeys' does not contain a definition for 'ThoughtSignature'
}
(contents ??= new()).Add(functionCallContent);
}

if (part.FunctionResponse is not null)
Expand Down
96 changes: 96 additions & 0 deletions tests/GenerativeAI.Microsoft.Tests/MicrosoftExtension_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,102 @@ public void ToAiContents_BogusData_HandlesVariousParts()
// Add more specific assertions based on your Bogus rules if needed
}

[Fact]
public void ToAiContents_WithFunctionCallPart_AndThoughtSignature_ReturnsFunctionCallContentWithSignature()
{
// Arrange
var thoughtSignature = "some_signature";
var parts = new List<Part> { new Part
{
FunctionCall = new FunctionCall { Name = "myFunction", Args = JsonNode.Parse(" { \"arg1\": \"value1\", \"arg2\": \"value2\" }") },
ThoughtSignature = thoughtSignature
} };

// Act
var result = parts.ToAiContents();

// Assert
result.ShouldNotBeNull();
result.Count.ShouldBe(1);
result.FirstOrDefault().ShouldBeOfType<FunctionCallContent>();
var functionCallContent = (FunctionCallContent)result.FirstOrDefault();
functionCallContent.Name.ShouldBe("myFunction");
functionCallContent.AdditionalProperties.ShouldNotBeNull();
functionCallContent.AdditionalProperties.ContainsKey(AdditionalPropertiesKeys.ThoughtSignature).ShouldBeTrue();
functionCallContent.AdditionalProperties[AdditionalPropertiesKeys.ThoughtSignature].ShouldBe(thoughtSignature);
}

[Fact]
public void ToPart_WithFunctionCallContent_AndThoughtSignature_ReturnsPartWithSignature()
{
// Arrange
var thoughtSignature = "some_signature";
var content = new FunctionCallContent("myFunction", "name")
{
Arguments = new Dictionary<string, object?>()
{
{"arg1", "value1"}
}
};
content.AdditionalProperties = new AdditionalPropertiesDictionary
{
{ AdditionalPropertiesKeys.ThoughtSignature, thoughtSignature }
};

// Act
var part = content.ToPart();

// Assert
part.ShouldNotBeNull();
part.FunctionCall.ShouldNotBeNull();
part.ThoughtSignature.ShouldBe(thoughtSignature);
}

[Fact]
public void ToAiContents_WithTextPart_AndThoughtSignature_ReturnsTextContentWithSignature()
{
// Arrange
var thoughtSignature = "some_signature";
var parts = new List<Part> { new Part
{
Text = "Hello world",
ThoughtSignature = thoughtSignature
} };

// Act
var result = parts.ToAiContents();

// Assert
result.ShouldNotBeNull();
result.Count.ShouldBe(1);
result.FirstOrDefault().ShouldBeOfType<TextContent>();
var textContent = (TextContent)result.FirstOrDefault();
textContent.Text.ShouldBe("Hello world");
textContent.AdditionalProperties.ShouldNotBeNull();
textContent.AdditionalProperties.ContainsKey(AdditionalPropertiesKeys.ThoughtSignature).ShouldBeTrue();
textContent.AdditionalProperties[AdditionalPropertiesKeys.ThoughtSignature].ShouldBe(thoughtSignature);
}

[Fact]
public void ToPart_WithTextContent_AndThoughtSignature_ReturnsPartWithSignature()
{
// Arrange
var thoughtSignature = "some_signature";
var content = new TextContent("Hello world");
content.AdditionalProperties = new AdditionalPropertiesDictionary
{
{ AdditionalPropertiesKeys.ThoughtSignature, thoughtSignature }
};

// Act
var part = content.ToPart();

// Assert
part.ShouldNotBeNull();
part.Text.ShouldBe("Hello world");
part.ThoughtSignature.ShouldBe(thoughtSignature);
}

#endregion

#region ToGenerateContentRequest
Expand Down
Loading