using Microsoft.Extensions.Hosting;
namespace OllamaStudy.UseExtensionsAI
{
///
///
///
public class Startup
{
//支持两种配置样式,并且两种 Configure 方法都受支持
#region HostApplicationBuilder 风格, 此风格优先级高于Startup(只执行一种风格)
//public void ConfigureHostApplicationBuilder(IHostApplicationBuilder hostApplicationBuilder)
//{
//}
//public IHost BuildHostApplicationBuilder(HostApplicationBuilder hostApplicationBuilder)
//{
// return hostApplicationBuilder.Build();
//}
#endregion
#region Startup 风格
///
/// (可选) 创建IHostBuilder
///
///
public IHostBuilder CreateHostBuilder()
{
return Host.CreateDefaultBuilder();
}
public void ConfigureHost(IHostBuilder hostBuilder)
{
hostBuilder.ConfigureAppConfiguration((hostBuilder, configBuilder) =>
{
configBuilder
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("OllamaServerConfig.json", false, true);
});
}
///
/// (可选) 构建Host
///
///
///
public IHost BuildHost(IHostBuilder hostBuilder)
{
return hostBuilder.Build();
}
///
/// 配置服务
///
///
///
public void ConfigureServices(IServiceCollection services, HostBuilderContext context)
{
services
.AddOptions()
.Configure(context.Configuration.GetRequiredSection("OllamaServer"));
services
.AddScoped(provider =>
{
var options = provider.GetRequiredService>().CurrentValue;
return new OllamaApiClient(options.OllamaServerUrl, options.Model);
})
.AddScoped(provider =>
{
var options = provider.GetRequiredService>().CurrentValue;
var openAIClientOptions = new OpenAIClientOptions()
{
Endpoint = new Uri(new Uri(options.OllamaServerUrl), "v1")
};
return new OpenAIClient(new ApiKeyCredential("nokey"), openAIClientOptions);
})
.AddScoped(provider =>
{
var options = provider.GetRequiredService>().CurrentValue;
var openAIClientOptions = new OpenAIClientOptions()
{
Endpoint = new Uri(new Uri(options.OllamaServerUrl), "v1")
};
return new ChatClient(options.Model, new ApiKeyCredential("nokey"), openAIClientOptions);
})
//OpenAI 客户端是线程安全的,可安全的注册为单例
.AddKeyedSingleton("OpenAIChatClient", (provider, obj) =>
{
var options = provider.GetRequiredService>().CurrentValue;
var openAIClientOptions = new OpenAIClientOptions()
{
Endpoint = new Uri(new Uri(options.OllamaServerUrl), "v1")
};
return new ChatClient(options.Model, new ApiKeyCredential("nokey"), openAIClientOptions);
})
//UiUiAPI OpenAI 兼容API
.AddKeyedSingleton("UiUiAPIClient", (provider, obj) =>
{
var openAIClientOptions = new OpenAIClientOptions()
{
Endpoint = new Uri("https://sg.uiuiapi.com/v1")
};
return new OpenAIClient(new ApiKeyCredential("sk-4azuOUkbzNGP22pQkND8ad1vZl7ladwBQyqGKlWWZyxYgX1L"), openAIClientOptions);
})
//阿里百炼 OpenAI兼容API
.AddKeyedSingleton("BailianAPIClient", (provider, obj) =>
{
var openAIClientOptions = new OpenAIClientOptions()
{
Endpoint = new Uri("https://dashscope.aliyuncs.com/compatible-mode/v1")
};
return new OpenAIClient(new ApiKeyCredential("sk-0122f39e383546b9a0999f70b9ef99e3"), openAIClientOptions);
})
//智谱 OpenAI兼容API
.AddKeyedSingleton("ZipuAPIClient", (provider, obj) =>
{
var openAIClientOptions = new OpenAIClientOptions()
{
Endpoint = new Uri("https://open.bigmodel.cn/api/paas/v4/")
};
return new OpenAIClient(new ApiKeyCredential("397a799102a6453282da8abb2a1b2581.8fTMHZGRkPHJya4R"), openAIClientOptions);
});
//HttpClient 注册
//Ollama HttpClient
services
.AddHttpClient("OllamaHttpClient", (provider, client) =>
{
var options = provider.GetRequiredService>().CurrentValue;
client.BaseAddress = new Uri(options.OllamaServerUrl);
client.DefaultRequestHeaders.Add("Authorization", $"Bearer nokey");
client.Timeout = TimeSpan.FromSeconds(60);
});
//OpenAI HttpClient
services
.AddHttpClient("OpenAIHttpClient", (provider, client) =>
{
var options = provider.GetRequiredService>().CurrentValue;
client.BaseAddress = new Uri(options.OllamaServerUrl);
client.DefaultRequestHeaders.Add("Authorization", $"Bearer nokey");
client.Timeout = TimeSpan.FromSeconds(60);
});
//UiUiAPI HttpClient
services
.AddHttpClient("UiUiAPIHttpClient", (provider, client) =>
{
client.BaseAddress = new Uri("https://sg.uiuiapi.com");
client.DefaultRequestHeaders.Add("Authorization", $"Bearer sk-4azuOUkbzNGP22pQkND8ad1vZl7ladwBQyqGKlWWZyxYgX1L");
//client.DefaultRequestHeaders.Add("Content-Type", "application/json");
client.Timeout = TimeSpan.FromSeconds(60);
})
.UseSocketsHttpHandler((socketHttpHandeler, serviceProvider) =>
{
//配置请求代理:请求走 Fiddler 代理,便于调试
//socketHttpHandeler.Proxy = new System.Net.WebProxy("http://127.0.0.1:8888");
});
//阿里百炼 HttpClient
services
.AddHttpClient("BailianHttpClient", (provider, client) =>
{
//var options = provider.GetRequiredService>().CurrentValue;
client.BaseAddress = new Uri("https://dashscope.aliyuncs.com");
client.DefaultRequestHeaders.Add("Authorization", $"Bearer sk-0122f39e383546b9a0999f70b9ef99e3");
client.Timeout = TimeSpan.FromSeconds(60);
});
//智谱 HttpClient
services
.AddHttpClient("ZiPuHttpClient", (provider, client) =>
{
//var options = provider.GetRequiredService>().CurrentValue;
client.BaseAddress = new Uri("https://open.bigmodel.cn");
client.DefaultRequestHeaders.Add("Authorization", $"Bearer 397a799102a6453282da8abb2a1b2581.8fTMHZGRkPHJya4R");
client.Timeout = TimeSpan.FromSeconds(60);
})
.UseSocketsHttpHandler((socketHttpHandeler, serviceProvider) =>
{
//配置请求代理:请求走 Fiddler 代理,便于调试
//socketHttpHandeler.Proxy = new System.Net.WebProxy("http://127.0.0.1:8888");
});
//硅基流动 HttpClient
services
.AddHttpClient("SiliconflowHttpClient", (provider, client) =>
{
//var options = provider.GetRequiredService>().CurrentValue;
client.BaseAddress = new Uri("https://api.siliconflow.cn");
client.DefaultRequestHeaders.Add("Authorization", $"Bearer sk-ylwuqfmfkgvjaarwdpxqrguhcqbsnfzhyregbolpumeqyniy");
client.Timeout = TimeSpan.FromSeconds(60);
})
.UseSocketsHttpHandler((socketHttpHandeler, serviceProvider) =>
{
//配置请求代理:请求走 Fiddler 代理,便于调试
//socketHttpHandeler.Proxy = new System.Net.WebProxy("http://127.0.0.1:8888");
});
}
#endregion
}
}