src/WebJobs.Extensions.OpenAI/OpenAIExtension.cs (65 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using Microsoft.Azure.WebJobs.Description; using Microsoft.Azure.WebJobs.Extensions.OpenAI.Assistants; using Microsoft.Azure.WebJobs.Extensions.OpenAI.Embeddings; using Microsoft.Azure.WebJobs.Extensions.OpenAI.Models; using Microsoft.Azure.WebJobs.Extensions.OpenAI.Search; using Microsoft.Azure.WebJobs.Host.Config; using Newtonsoft.Json.Linq; namespace Microsoft.Azure.WebJobs.Extensions.OpenAI; [Extension("OpenAI")] partial class OpenAIExtension : IExtensionConfigProvider { readonly OpenAIClientFactory openAIClientFactory; readonly TextCompletionConverter textCompletionConverter; readonly EmbeddingsConverter embeddingsConverter; readonly EmbeddingsStoreConverter embeddingsStoreConverter; readonly SemanticSearchConverter semanticSearchConverter; readonly AssistantBindingConverter assistantConverter; readonly AssistantSkillTriggerBindingProvider assistantskillTriggerBindingProvider; public OpenAIExtension( OpenAIClientFactory openAIClientFactory, TextCompletionConverter textCompletionConverter, EmbeddingsConverter embeddingsConverter, EmbeddingsStoreConverter embeddingsStoreConverter, SemanticSearchConverter semanticSearchConverter, AssistantBindingConverter assistantConverter, AssistantSkillTriggerBindingProvider assistantTriggerBindingProvider) { this.openAIClientFactory = openAIClientFactory ?? throw new ArgumentNullException(nameof(openAIClientFactory)); this.textCompletionConverter = textCompletionConverter ?? throw new ArgumentNullException(nameof(textCompletionConverter)); this.embeddingsConverter = embeddingsConverter ?? throw new ArgumentNullException(nameof(embeddingsConverter)); this.embeddingsStoreConverter = embeddingsStoreConverter ?? throw new ArgumentNullException(nameof(embeddingsStoreConverter)); this.semanticSearchConverter = semanticSearchConverter ?? throw new ArgumentNullException(nameof(semanticSearchConverter)); this.assistantConverter = assistantConverter ?? throw new ArgumentNullException(nameof(assistantConverter)); this.assistantskillTriggerBindingProvider = assistantTriggerBindingProvider ?? throw new ArgumentNullException(nameof(assistantTriggerBindingProvider)); } void IExtensionConfigProvider.Initialize(ExtensionConfigContext context) { // Completions input binding support var rule = context.AddBindingRule<TextCompletionAttribute>(); rule.BindToInput<TextCompletionResponse>(this.textCompletionConverter); rule.BindToInput<string>(this.textCompletionConverter); // Embeddings input binding support var embeddingsRule = context.AddBindingRule<EmbeddingsAttribute>(); embeddingsRule.BindToInput<EmbeddingsContext>(this.embeddingsConverter); embeddingsRule.BindToInput<string>(this.embeddingsConverter); // Embeddings store binding support var embeddingsStoreRule = context.AddBindingRule<EmbeddingsStoreAttribute>(); embeddingsStoreRule.BindToCollector<SearchableDocument>(this.embeddingsStoreConverter); context.AddConverter<string, SearchableDocument>(this.embeddingsStoreConverter.ToSearchableDocument); // Semantic search input binding support var semanticSearchRule = context.AddBindingRule<SemanticSearchAttribute>(); semanticSearchRule.BindToInput<SemanticSearchContext>(this.semanticSearchConverter); semanticSearchRule.BindToInput<string>(this.semanticSearchConverter); // Assistant support var assistantCreateRule = context.AddBindingRule<AssistantCreateAttribute>(); assistantCreateRule.BindToCollector<AssistantCreateRequest>(this.assistantConverter); context.AddConverter<JObject, AssistantCreateRequest>(this.assistantConverter.ToAssistantCreateRequest); context.AddConverter<string, AssistantCreateRequest>(this.assistantConverter.ToAssistantCreateRequest); var assistantPostRule = context.AddBindingRule<AssistantPostAttribute>(); assistantPostRule.BindToInput<AssistantState>(this.assistantConverter); assistantPostRule.BindToInput<string>(this.assistantConverter); var assistantQueryRule = context.AddBindingRule<AssistantQueryAttribute>(); assistantQueryRule.BindToInput<AssistantState>(this.assistantConverter); assistantQueryRule.BindToInput<string>(this.assistantConverter); // Assistant skill trigger support context.AddBindingRule<AssistantSkillTriggerAttribute>() .BindToTrigger(this.assistantskillTriggerBindingProvider); // OpenAI service input binding support (NOTE: This may be removed in a future version.) context.AddBindingRule<OpenAIServiceAttribute>().BindToInput(_ => this.openAIClientFactory); } }