using System.Collections.Generic;

using AIRuntime.Runtime.Providers.OpenAI;


namespace AIRuntime.Runtime.Providers.NousPortal
{
    /// <summary>
    /// Nous Research Portal provider using its
    /// OpenAI-compatible inference API.
    /// </summary>
    public sealed class NousPortalProvider :
        OpenAICompatibleProvider
    {
        public const string DefaultBaseUrl =
            "https://inference-api.nousresearch.com/v1";

        public const string ProductTag =
            "product=airuntime";

        public const string ClientTag =
            "client=airuntime-unity";

        public const string UserTag =
            "user=airuntime";


        public static ProviderStreamTerminationPolicy
            StreamTerminationPolicy =>
                ProviderStreamTerminationPolicy.NousPortal;


        public NousPortalProvider(
            string apiKey,
            string model,
            int timeoutSeconds = 60,
            string baseUrl = DefaultBaseUrl)
            : this(
                new OpenAIClient(
                    apiKey,
                    model,
                    baseUrl,
                    timeoutSeconds: timeoutSeconds,
                    providerName: "Nous Portal",
                    streamTerminationPolicy:
                        StreamTerminationPolicy))
        {
        }


        public NousPortalProvider(
            IOpenAIClient client)
            : base(
                "Nous Portal",
                client,
                requestTags: CreateRequestTags())
        {
        }


        private static IReadOnlyList<string>
            CreateRequestTags()
        {
            return new[]
            {
                ProductTag,
                ClientTag,
                UserTag
            };
        }
    }
}
