diff --git a/AI.slnx b/AI.slnx
index d7e820d..b7219e9 100644
--- a/AI.slnx
+++ b/AI.slnx
@@ -4,7 +4,8 @@
-
-
-
+
+
+
+
diff --git a/src/Agents/Agents.csproj b/src/Agents/Agents.csproj
new file mode 100644
index 0000000..b3e02d4
--- /dev/null
+++ b/src/Agents/Agents.csproj
@@ -0,0 +1,28 @@
+
+
+
+ netstandard2.0;net8.0;net9.0;net10.0
+ Preview
+ Devlooped.Agents.AI
+ Extensions for Microsoft.Agents.AI
+
+ OSMFEULA.txt
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Directory.props b/src/Directory.props
index edb62aa..43ac06f 100644
--- a/src/Directory.props
+++ b/src/Directory.props
@@ -7,6 +7,8 @@
https://api.nuget.org/v3/index.json;https://pkg.kzu.app/index.json
https://github.com/devlooped/Extensions.AI
+
+ false
\ No newline at end of file
diff --git a/src/AI.CodeAnalysis/ChatClientExtensions.cs b/src/Extensions.CodeAnalysis/ChatClientExtensions.cs
similarity index 100%
rename from src/AI.CodeAnalysis/ChatClientExtensions.cs
rename to src/Extensions.CodeAnalysis/ChatClientExtensions.cs
diff --git a/src/AI.CodeAnalysis/ChatClientExtensionsGenerator.cs b/src/Extensions.CodeAnalysis/ChatClientExtensionsGenerator.cs
similarity index 100%
rename from src/AI.CodeAnalysis/ChatClientExtensionsGenerator.cs
rename to src/Extensions.CodeAnalysis/ChatClientExtensionsGenerator.cs
diff --git a/src/AI.CodeAnalysis/AI.CodeAnalysis.csproj b/src/Extensions.CodeAnalysis/Extensions.CodeAnalysis.csproj
similarity index 100%
rename from src/AI.CodeAnalysis/AI.CodeAnalysis.csproj
rename to src/Extensions.CodeAnalysis/Extensions.CodeAnalysis.csproj
diff --git a/src/AI/AdditionalPropertiesDictionaryConverter.cs b/src/Extensions/AdditionalPropertiesDictionaryConverter.cs
similarity index 100%
rename from src/AI/AdditionalPropertiesDictionaryConverter.cs
rename to src/Extensions/AdditionalPropertiesDictionaryConverter.cs
diff --git a/src/AI/Chat.cs b/src/Extensions/Chat.cs
similarity index 100%
rename from src/AI/Chat.cs
rename to src/Extensions/Chat.cs
diff --git a/src/AI/ChatExtensions.cs b/src/Extensions/ChatExtensions.cs
similarity index 100%
rename from src/AI/ChatExtensions.cs
rename to src/Extensions/ChatExtensions.cs
diff --git a/src/AI/ChatJsonContext.cs b/src/Extensions/ChatJsonContext.cs
similarity index 100%
rename from src/AI/ChatJsonContext.cs
rename to src/Extensions/ChatJsonContext.cs
diff --git a/src/AI/ClientPipelineExtensions.cs b/src/Extensions/ClientPipelineExtensions.cs
similarity index 100%
rename from src/AI/ClientPipelineExtensions.cs
rename to src/Extensions/ClientPipelineExtensions.cs
diff --git a/src/AI/ConfigurableChatClient.cs b/src/Extensions/ConfigurableChatClient.cs
similarity index 100%
rename from src/AI/ConfigurableChatClient.cs
rename to src/Extensions/ConfigurableChatClient.cs
diff --git a/src/AI/Console/ConsoleExtensions.cs b/src/Extensions/Console/ConsoleExtensions.cs
similarity index 100%
rename from src/AI/Console/ConsoleExtensions.cs
rename to src/Extensions/Console/ConsoleExtensions.cs
diff --git a/src/AI/Console/JsonConsoleLoggingExtensions.cs b/src/Extensions/Console/JsonConsoleLoggingExtensions.cs
similarity index 100%
rename from src/AI/Console/JsonConsoleLoggingExtensions.cs
rename to src/Extensions/Console/JsonConsoleLoggingExtensions.cs
diff --git a/src/AI/Console/JsonConsoleOptions.cs b/src/Extensions/Console/JsonConsoleOptions.cs
similarity index 100%
rename from src/AI/Console/JsonConsoleOptions.cs
rename to src/Extensions/Console/JsonConsoleOptions.cs
diff --git a/src/AI/Devlooped.Extensions.AI.props b/src/Extensions/Devlooped.Extensions.AI.props
similarity index 100%
rename from src/AI/Devlooped.Extensions.AI.props
rename to src/Extensions/Devlooped.Extensions.AI.props
diff --git a/src/AI/Devlooped.Extensions.AI.targets b/src/Extensions/Devlooped.Extensions.AI.targets
similarity index 100%
rename from src/AI/Devlooped.Extensions.AI.targets
rename to src/Extensions/Devlooped.Extensions.AI.targets
diff --git a/src/AI/AI.csproj b/src/Extensions/Extensions.csproj
similarity index 90%
rename from src/AI/AI.csproj
rename to src/Extensions/Extensions.csproj
index 737c6d4..2242996 100644
--- a/src/AI/AI.csproj
+++ b/src/Extensions/Extensions.csproj
@@ -3,9 +3,10 @@
net8.0;net9.0;net10.0
Preview
+ $(NoWarn);OPENAI001
+ Devlooped.Extensions.AI
Devlooped.Extensions.AI
Extensions for Microsoft.Extensions.AI
- $(NoWarn);OPENAI001
OSMFEULA.txt
true
@@ -16,16 +17,15 @@
-
+
-
-
+
diff --git a/src/AI/Extensions/System/Throw.cs b/src/Extensions/Extensions/System/Throw.cs
similarity index 100%
rename from src/AI/Extensions/System/Throw.cs
rename to src/Extensions/Extensions/System/Throw.cs
diff --git a/src/AI/Grok/GrokChatClient.cs b/src/Extensions/Grok/GrokChatClient.cs
similarity index 100%
rename from src/AI/Grok/GrokChatClient.cs
rename to src/Extensions/Grok/GrokChatClient.cs
diff --git a/src/AI/Grok/GrokChatOptions.cs b/src/Extensions/Grok/GrokChatOptions.cs
similarity index 100%
rename from src/AI/Grok/GrokChatOptions.cs
rename to src/Extensions/Grok/GrokChatOptions.cs
diff --git a/src/AI/Grok/GrokClient.cs b/src/Extensions/Grok/GrokClient.cs
similarity index 100%
rename from src/AI/Grok/GrokClient.cs
rename to src/Extensions/Grok/GrokClient.cs
diff --git a/src/AI/Grok/GrokSearchTool.cs b/src/Extensions/Grok/GrokSearchTool.cs
similarity index 100%
rename from src/AI/Grok/GrokSearchTool.cs
rename to src/Extensions/Grok/GrokSearchTool.cs
diff --git a/src/AI/JsonExtensions.cs b/src/Extensions/JsonExtensions.cs
similarity index 100%
rename from src/AI/JsonExtensions.cs
rename to src/Extensions/JsonExtensions.cs
diff --git a/src/AI/OpenAI/OpenAIChatClient.cs b/src/Extensions/OpenAI/OpenAIChatClient.cs
similarity index 100%
rename from src/AI/OpenAI/OpenAIChatClient.cs
rename to src/Extensions/OpenAI/OpenAIChatClient.cs
diff --git a/src/AI/OpenAI/WebSearchToolExtensions.cs b/src/Extensions/OpenAI/WebSearchToolExtensions.cs
similarity index 82%
rename from src/AI/OpenAI/WebSearchToolExtensions.cs
rename to src/Extensions/OpenAI/WebSearchToolExtensions.cs
index f2f90f8..42431d5 100644
--- a/src/AI/OpenAI/WebSearchToolExtensions.cs
+++ b/src/Extensions/OpenAI/WebSearchToolExtensions.cs
@@ -16,7 +16,7 @@ public string? Region
set
{
web.Properties["Region"] = value;
- web.Location = WebSearchUserLocation.CreateApproximateLocation(web.Country, value, web.City, web.TimeZone);
+ web.Location = WebSearchToolLocation.CreateApproximateLocation(web.Country, value, web.City, web.TimeZone);
}
}
@@ -30,7 +30,7 @@ public string? City
set
{
web.Properties["City"] = value;
- web.Location = WebSearchUserLocation.CreateApproximateLocation(web.Country, web.Region, value, web.TimeZone);
+ web.Location = WebSearchToolLocation.CreateApproximateLocation(web.Country, web.Region, value, web.TimeZone);
}
}
@@ -44,23 +44,23 @@ public string? TimeZone
set
{
web.Properties["TimeZone"] = value;
- web.Location = WebSearchUserLocation.CreateApproximateLocation(web.Country, web.Region, web.City, value);
+ web.Location = WebSearchToolLocation.CreateApproximateLocation(web.Country, web.Region, web.City, value);
}
}
///
/// Controls how much context is retrieved from the web to help the tool formulate a response.
///
- public WebSearchContextSize? ContextSize
+ public WebSearchToolContextSize? ContextSize
{
- get => web.Properties.TryGetValue(nameof(WebSearchContextSize), out var size) && size is WebSearchContextSize contextSize
+ get => web.Properties.TryGetValue(nameof(WebSearchToolContextSize), out var size) && size is WebSearchToolContextSize contextSize
? contextSize : null;
set
{
if (value.HasValue)
web.ContextSize = value.Value;
else
- web.Properties.Remove(nameof(WebSearchContextSize));
+ web.Properties.Remove(nameof(WebSearchToolContextSize));
}
}
}
diff --git a/src/AI/ReasoningEffort.cs b/src/Extensions/ReasoningEffort.cs
similarity index 100%
rename from src/AI/ReasoningEffort.cs
rename to src/Extensions/ReasoningEffort.cs
diff --git a/src/AI/ToolExtensions.cs b/src/Extensions/ToolExtensions.cs
similarity index 100%
rename from src/AI/ToolExtensions.cs
rename to src/Extensions/ToolExtensions.cs
diff --git a/src/AI/ToolFactory.cs b/src/Extensions/ToolFactory.cs
similarity index 100%
rename from src/AI/ToolFactory.cs
rename to src/Extensions/ToolFactory.cs
diff --git a/src/AI/ToolJsonOptions.cs b/src/Extensions/ToolJsonOptions.cs
similarity index 100%
rename from src/AI/ToolJsonOptions.cs
rename to src/Extensions/ToolJsonOptions.cs
diff --git a/src/AI/TypeInjectingResolver.cs b/src/Extensions/TypeInjectingResolver.cs
similarity index 100%
rename from src/AI/TypeInjectingResolver.cs
rename to src/Extensions/TypeInjectingResolver.cs
diff --git a/src/AI/UseChatClientsExtensions.cs b/src/Extensions/UseChatClientsExtensions.cs
similarity index 100%
rename from src/AI/UseChatClientsExtensions.cs
rename to src/Extensions/UseChatClientsExtensions.cs
diff --git a/src/AI/Verbosity.cs b/src/Extensions/Verbosity.cs
similarity index 100%
rename from src/AI/Verbosity.cs
rename to src/Extensions/Verbosity.cs
diff --git a/src/AI/WebSearchTool.cs b/src/Extensions/WebSearchTool.cs
similarity index 78%
rename from src/AI/WebSearchTool.cs
rename to src/Extensions/WebSearchTool.cs
index b335cd1..404e233 100644
--- a/src/AI/WebSearchTool.cs
+++ b/src/Extensions/WebSearchTool.cs
@@ -19,7 +19,7 @@ public WebSearchTool(string country)
Country = country;
additionalProperties = new Dictionary
{
- { nameof(WebSearchUserLocation), WebSearchUserLocation.CreateApproximateLocation(country) }
+ { nameof(WebSearchToolLocation), WebSearchToolLocation.CreateApproximateLocation(country) }
};
}
@@ -28,14 +28,14 @@ public WebSearchTool(string country)
///
public string Country { get; }
- internal WebSearchUserLocation Location
+ internal WebSearchToolLocation Location
{
- set => additionalProperties[nameof(WebSearchUserLocation)] = value;
+ set => additionalProperties[nameof(WebSearchToolLocation)] = value;
}
- internal WebSearchContextSize ContextSize
+ internal WebSearchToolContextSize ContextSize
{
- set => additionalProperties[nameof(WebSearchContextSize)] = value;
+ set => additionalProperties[nameof(WebSearchToolContextSize)] = value;
}
internal IDictionary Properties => additionalProperties;
diff --git a/src/AI/readme.md b/src/Extensions/readme.md
similarity index 100%
rename from src/AI/readme.md
rename to src/Extensions/readme.md
diff --git a/src/AI.Tests/ConfigurableTests.cs b/src/Tests/ConfigurableTests.cs
similarity index 100%
rename from src/AI.Tests/ConfigurableTests.cs
rename to src/Tests/ConfigurableTests.cs
diff --git a/src/AI.Tests/Content/LNS0004592.md b/src/Tests/Content/LNS0004592.md
similarity index 100%
rename from src/AI.Tests/Content/LNS0004592.md
rename to src/Tests/Content/LNS0004592.md
diff --git a/src/AI.Tests/Extensions/Attributes.cs b/src/Tests/Extensions/Attributes.cs
similarity index 100%
rename from src/AI.Tests/Extensions/Attributes.cs
rename to src/Tests/Extensions/Attributes.cs
diff --git a/src/AI.Tests/Extensions/Configuration.cs b/src/Tests/Extensions/Configuration.cs
similarity index 100%
rename from src/AI.Tests/Extensions/Configuration.cs
rename to src/Tests/Extensions/Configuration.cs
diff --git a/src/AI.Tests/Extensions/Logging.cs b/src/Tests/Extensions/Logging.cs
similarity index 100%
rename from src/AI.Tests/Extensions/Logging.cs
rename to src/Tests/Extensions/Logging.cs
diff --git a/src/AI.Tests/Extensions/PipelineOutput.cs b/src/Tests/Extensions/PipelineOutput.cs
similarity index 100%
rename from src/AI.Tests/Extensions/PipelineOutput.cs
rename to src/Tests/Extensions/PipelineOutput.cs
diff --git a/src/AI.Tests/GrokTests.cs b/src/Tests/GrokTests.cs
similarity index 100%
rename from src/AI.Tests/GrokTests.cs
rename to src/Tests/GrokTests.cs
diff --git a/src/AI.Tests/OpenAIOptions.cs b/src/Tests/OpenAIOptions.cs
similarity index 100%
rename from src/AI.Tests/OpenAIOptions.cs
rename to src/Tests/OpenAIOptions.cs
diff --git a/src/AI.Tests/OpenAIResponseClientExtensions.cs b/src/Tests/OpenAIResponseClientExtensions.cs
similarity index 100%
rename from src/AI.Tests/OpenAIResponseClientExtensions.cs
rename to src/Tests/OpenAIResponseClientExtensions.cs
diff --git a/src/AI.Tests/OpenAITests.cs b/src/Tests/OpenAITests.cs
similarity index 96%
rename from src/AI.Tests/OpenAITests.cs
rename to src/Tests/OpenAITests.cs
index 700d7fb..3263497 100644
--- a/src/AI.Tests/OpenAITests.cs
+++ b/src/Tests/OpenAITests.cs
@@ -240,7 +240,7 @@ public async Task WebSearchCountryHighContext()
{
Region = "Bariloche",
TimeZone = "America/Argentina/Buenos_Aires",
- ContextSize = WebSearchContextSize.High
+ ContextSize = WebSearchToolContextSize.High
}]
};
@@ -255,9 +255,8 @@ public async Task WebSearchCountryHighContext()
var content = Assert.Single(assistant.Content);
Assert.NotEmpty(content.OutputTextAnnotations);
- Assert.Contains(content.OutputTextAnnotations,
- x => x.Kind == ResponseMessageAnnotationKind.UriCitation &&
- x.UriCitationUri.AbsoluteUri.StartsWith("https://catedralaltapatagonia.com/tarifas/"));
-
+ //Assert.Contains(content.OutputTextAnnotations,
+ // x => x.Kind == ResponseMessageAnnotationKind.UriCitation &&
+ // x.UriCitationUri.AbsoluteUri.StartsWith("https://catedralaltapatagonia.com/tarifas/"));
}
}
diff --git a/src/AI.Tests/RetrievalTests.cs b/src/Tests/RetrievalTests.cs
similarity index 72%
rename from src/AI.Tests/RetrievalTests.cs
rename to src/Tests/RetrievalTests.cs
index d5692d6..57f87eb 100644
--- a/src/AI.Tests/RetrievalTests.cs
+++ b/src/Tests/RetrievalTests.cs
@@ -12,32 +12,41 @@ public class RetrievalTests(ITestOutputHelper output)
public async Task CanRetrieveContent(string model, string question, bool empty = false)
{
var client = new global::OpenAI.OpenAIClient(Configuration["OPENAI_API_KEY"]);
- var store = client.GetVectorStoreClient().CreateVectorStore(true);
+ var store = client.GetVectorStoreClient().CreateVectorStore();
try
{
var file = client.GetOpenAIFileClient().UploadFile("Content/LNS0004592.md", global::OpenAI.Files.FileUploadPurpose.Assistants);
try
{
- client.GetVectorStoreClient().AddFileToVectorStore(store.VectorStoreId, file.Value.Id, true);
+ client.GetVectorStoreClient().AddFileToVectorStore(store.Value.Id, file.Value.Id);
var responses = new OpenAIResponseClient(model, Configuration["OPENAI_API_KEY"]);
- var chat = responses.AsIChatClient(
- ResponseTool.CreateFileSearchTool([store.VectorStoreId]))
+ var options = new ChatOptions();
+ options.Tools ??= [];
+ options.Tools.Add(new HostedFileSearchTool
+ {
+ Inputs =
+ [
+ new HostedVectorStoreContent(store.Value.Id),
+ ],
+ MaximumResultCount = 10,
+ });
+
+ var chat = responses.AsIChatClient()
.AsBuilder()
.UseLogging(output.AsLoggerFactory())
- .Use((messages, options, next, cancellationToken) =>
- {
-
- return next.Invoke(messages, options, cancellationToken);
- })
+ //.Use((messages, options, next, cancellationToken) =>
+ //{
+ // return next.Invoke(messages, options, cancellationToken);
+ //})
.Build();
var response = await chat.GetResponseAsync(
[
new ChatMessage(ChatRole.System, "Use file search tool to respond, exclusively. If no content was found, respond just with the string 'N/A' and nothing else."),
new ChatMessage(ChatRole.User, question),
- ]);
+ ], options);
output.WriteLine(response.Text);
if (empty)
@@ -52,7 +61,7 @@ public async Task CanRetrieveContent(string model, string question, bool empty =
}
finally
{
- client.GetVectorStoreClient().DeleteVectorStore(store.VectorStoreId);
+ client.GetVectorStoreClient().DeleteVectorStore(store.Value.Id);
}
}
}
diff --git a/src/AI.Tests/AI.Tests.csproj b/src/Tests/Tests.csproj
similarity index 86%
rename from src/AI.Tests/AI.Tests.csproj
rename to src/Tests/Tests.csproj
index 4ea0ffb..225c767 100644
--- a/src/AI.Tests/AI.Tests.csproj
+++ b/src/Tests/Tests.csproj
@@ -26,8 +26,9 @@
-
-
+
+
+
diff --git a/src/AI.Tests/ToolsTests.cs b/src/Tests/ToolsTests.cs
similarity index 100%
rename from src/AI.Tests/ToolsTests.cs
rename to src/Tests/ToolsTests.cs