AzureCosmosDB/csharp/DocumentVectorPipelineFunctions/Program.cs (70 lines of code) (raw):
using System.ClientModel.Primitives;
using System.Text.Json;
using Azure.AI.FormRecognizer.DocumentAnalysis;
using Azure.AI.OpenAI;
using Azure.Core;
using Azure.Identity;
using DocumentVectorPipelineFunctions;
using Microsoft.Azure.Cosmos;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using OpenAI.Embeddings;
const string AzureDocumentIntelligenceEndpointConfigName = "AzureDocumentIntelligenceConnectionString";
const string AzureCosmosDBConnectionString = "AzureCosmosDBConnectionString";
const string AzureOpenAIConnectionString = "AzureOpenAIConnectionString";
const string AzureOpenAIModelDeploymentConfigName = "AzureOpenAIModelDeployment";
var managedIdentityClientId = Environment.GetEnvironmentVariable("AzureManagedIdentityClientId");
var local = Convert.ToBoolean(Environment.GetEnvironmentVariable("RunningLocally"));
TokenCredential credential = local
? new DefaultAzureCredential()
: new ManagedIdentityCredential(clientId: managedIdentityClientId);
var hostBuilder = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureAppConfiguration(config =>
{
config.AddUserSecrets<BlobTriggerFunction>(optional: true, reloadOnChange: false);
});
hostBuilder.ConfigureServices(sc =>
{
sc.AddSingleton<DocumentAnalysisClient>(sp =>
{
var config = sp.GetRequiredService<IConfiguration>();
var documentIntelligenceEndpoint = config[AzureDocumentIntelligenceEndpointConfigName] ?? throw new Exception($"Configure {AzureDocumentIntelligenceEndpointConfigName}");
var documentAnalysisClient = new DocumentAnalysisClient(
new Uri(documentIntelligenceEndpoint),
credential);
return documentAnalysisClient;
});
sc.AddSingleton<CosmosClient>(sp =>
{
var config = sp.GetRequiredService<IConfiguration>();
var cosmosDbEndpoint = config[AzureCosmosDBConnectionString] ?? throw new Exception($"Configure {AzureCosmosDBConnectionString}");
var cosmosClient = new CosmosClient(
cosmosDbEndpoint,
credential,
new CosmosClientOptions
{
ApplicationName = "document ingestion",
AllowBulkExecution = true,
UseSystemTextJsonSerializerWithOptions = JsonSerializerOptions.Default,
});
return cosmosClient;
});
sc.AddSingleton<EmbeddingClient>(sp =>
{
var config = sp.GetRequiredService<IConfiguration>();
var openAIEndpoint = config[AzureOpenAIConnectionString] ?? throw new Exception($"Configure {AzureCosmosDBConnectionString}");
// TODO: Implement a custom retry policy that takes the retry-after header into account.
var azureOpenAIClient = new AzureOpenAIClient(
new Uri(openAIEndpoint),
credential,
new AzureOpenAIClientOptions()
{
ApplicationId = "DocumentIngestion",
RetryPolicy = new ClientRetryPolicy(maxRetries: 10),
});
return azureOpenAIClient.GetEmbeddingClient(config[AzureOpenAIModelDeploymentConfigName] ?? throw new Exception($"Configure {AzureOpenAIModelDeploymentConfigName}"));
});
});
var host = hostBuilder.Build();
host.Run();