English | 简体中文 | 日本語 | 한국어 | Español | Français | Deutsch | Русский | Português
NewLife.AI est une bibliothèque d'IA open source pour l'écosystème .NET, fournissant une interface unifiée IChatClient qui encapsule 46 fournisseurs majeurs de LLM. Elle intègre les appels de fonctions, le protocole MCP, la sortie en streaming, le support multimodal, les capacités multi-agents, et peut être intégrée en tant que package NuGet dans tout projet .NET (net45 / netstandard2.1).
NewLife.ChatAI est une application web de chat complète construite sur NewLife.AI (ASP.NET Core), offrant un frontend de chat multi-modèle prêt à l'emploi, une passerelle AI unifiée et une évolution automatique de la mémoire. Elle peut être déployée indépendamment ou intégrée dans des projets ASP.NET Core existants.
- 46 fournisseurs d'IA, 6 protocoles : OpenAI / Anthropic / Gemini / Tongyi DashScope / Ollama / AWS Bedrock — changez avec une ligne de code
- Interface unifiée
IChatClient: Alignée sur la spécification MEAI — tour unique, streaming, appels de fonctions, multimodal, le tout avec une seule API - Appels de fonctions (Outils) : L'attribut
[ToolDescription]génère automatiquement le JSON Schema ; boucle multi-tourToolChatClient; outils intégrés de recherche / météo / traduction / web scraping / géolocalisation IP - Support MCP bidirectionnel : Le client se connecte aux serveurs MCP externes (stdio / HTTP SSE) ; le serveur expose les outils locaux en tant que services MCP standard
- Noyau de chat complet : Pipeline en 3 étapes
IChatHandler(OnBefore → Execute → OnAfter) ; gestionnaires intégrés (activation de compétences / injection de mémoire / persistance / statistiques d'utilisation / génération de titres) ;IChatFilterenfichable - Évolution de la mémoire utilisateur : Extrait automatiquement 10 catégories de souvenirs structurés des conversations — plus vous discutez, mieux il vous comprend
- Passerelle AI unifiée : Compatible avec les protocoles OpenAI / Anthropic / Gemini ; adaptation automatique snake_case/camelCase ; multi-location AppKey ; nouvelle tentative avec backoff exponentiel 429
- Système de compétences : Réutilisation de prompts Markdown, références récursives
@, activation automatique par mots-clés - Multi-agent :
ConversableAgent/GroupChat/ParallelGroupChat/FunctionCallingPlanner - Frontend Web React 19 : Streaming SSE + préréglages de chat + aperçu Artifact en temps réel (HTML/SVG/Mermaid) + bifurcation de conversation + visualisation des appels d'outils + chronométrage du raisonnement + multimodal
- Couche d'évolution des connaissances : Extrait automatiquement les connaissances des conversations, construit une base de connaissances consultable avec navigation TOC et recherche sémantique vectorielle
- Synthèse vocale TTS : Support DashScope TTS et CosyVoice V3.5 ; synthèse vocale en streaming ; API TTS dédiée pour le frontend
- Embedding / Recherche vectorielle : HashTextEmbedder v2 intégré et stockage vectoriel ; vectorisation de documents et recherche sémantique
- Amélioration multi-agent : Nouveaux ReflectionAgent et ReviewAgent ; décomposition de tâches complexes avec agrégation parallèle de sous-agents
- Points de contrôle avec intervention humaine : Sélection humaine en temps réel parmi les chemins multiples de l'IA ; points de décision pour groupes de questions multiples
- Appels d'outils améliorés : Propagation de contexte ToolCallContext ; disjoncteur de fournisseur d'outils ; filtrage de visibilité au niveau session ; erreurs structurées avec système de permissions à trois niveaux
- Évolution de la mémoire : Service de consolidation de mémoire avec déduplication/fusion/expiration ; la mémoire d'apprentissage extrait automatiquement les connaissances structurées
46 fournisseurs : 9 clients de protocole indépendant + 37 adaptateurs compatibles OpenAI.
| Fournisseur | Protocole | Caractéristiques |
|---|---|---|
| OpenAI | ChatCompletions / Responses | Vision / Appels de fonctions / Génération d'images / Raisonnement o3 |
| DeepSeek | DeepSeek API | reasoning_content / Paramètres exclusifs DeepSeek v4 |
| Anthropic | Messages | Claude 3.5 / Claude 4 |
| Gemini | Gemini 1.5 / 2.0 / 2.5 | |
| Alibaba Cloud | DashScope | qwen-plus / qwen-max / Omni multimodal / Files API |
| Azure AI | Azure OpenAI | URL de nom de déploiement + api-key |
| Ollama | Ollama API | llama / deepseek / qwen local |
| AWS Bedrock | Signature SigV4 | Claude / Llama / Titan / Mistral |
| NewLifeAI | Proxy en cascade | Agrégation multi-fournisseur |
| (Autres) | Compatible OpenAI | 37 plateformes compatibles |
Doubao (Volcano Engine), Zhipu Qingyan (GLM), Wenxin Yiyan, Moonshot (Kimi), MiniMax, StepFun, Baichuan, iFlytek Spark, 01.AI, Mistral, Perplexity, Cohere, Together AI, Fireworks, OpenRouter, SiliconCloud, DeepInfra, Groq, Cerebras, Hyperbolic, Nebius, Novita, Lepton, 302.AI, xAI (Grok)… et autres plateformes compatibles OpenAI.
Tous les fournisseurs sont déclarés via l'attribut [AiClient] ; AiClientRegistry scanne et enregistre automatiquement au démarrage — configuration zéro pour les nouveaux fournisseurs.
dotnet add package NewLife.AIusing NewLife.AI.Clients;
// Chat à tour unique
using var client = new DashScopeChatClient("your-api-key", "qwen-plus");
var reply = await client.ChatAsync("Expliquez les grands modèles de langage en trois phrases");
Console.WriteLine(reply);
// Messages multi-rôles (tableau de tuples, sans construction manuelle de ChatMessage)
var reply2 = await client.ChatAsync([
("system", "Vous êtes un assistant de développement C# professionnel"),
("user", "Expliquez la différence entre ValueTask et Task"),
]);
// Sortie en streaming
await foreach (var chunk in client.GetStreamingResponseAsync([
new ChatMessage { Role = "user", Content = "Écrivez un court poème sur le code" }
], new ChatOptions()))
{
Console.Write(chunk.Text);
}dotnet add package NewLife.AI.Extensions// Enregistrer le service
builder.Services.AddDashScope("your-api-key", "qwen-plus");
// Coexistence multi-fournisseur avec Keyed
builder.Services.AddOpenAI("openai-key", serviceKey: "openai");
builder.Services.AddAnthropic("anthropic-key", serviceKey: "anthropic");
// Injecter et utiliser
public class MyService(IChatClient chatClient)
{
public Task<String> ChatAsync(String question)
=> chatClient.ChatAsync(question);
}public class MyTools
{
/// <summary>Obtenir la météo d'une ville spécifiée</summary>
[ToolDescription("get_weather")]
public async Task<String> GetWeatherAsync(
[Description("Nom de la ville")] String city)
=> $"{city} : Ensoleillé, 22°C aujourd'hui";
}
// Enregistrer les outils
var registry = new ToolRegistry();
registry.AddTools<MyTools>(new MyTools());
// Ajouter au pipeline — boucle automatique d'appels d'outils multi-tour
var client = rawClient.AsBuilder()
.UseTools(registry)
.Build();
// Le modèle appelle automatiquement get_weather("北京"), renvoie la réponse finale
var reply = await client.ChatAsync("Quel temps fait-il à Pékin aujourd'hui ?");Lorsque l'IA a tendance à deviner ou à prendre des raccourcis sur des problèmes complexes, utilisez le format ReAct dans le System Prompt pour forcer le raisonnement étape par étape. ToolChatClient a une boucle while intégrée (MaxIterations = 10), pas besoin d'écrire un Agent manuellement.
var client = rawClient.AsBuilder()
.UseTools(registry)
.Build();
var reply = await client.ChatAsync([
("system",
"Vous devez raisonner étape par étape dans le format suivant. Ne sautez pas d'étapes et ne devinez pas directement :\n" +
"Thought: <analysez ce que vous devez faire>\n" +
"Action: <quel outil appeler et paramètres>\n" +
"Observation: <analysez le résultat de l'outil>\n" +
"(Répétez Thought/Action/Observation jusqu'à avoir suffisamment d'informations)\n" +
"Answer: <conclusion finale basée sur les observations ci-dessus>\n\n" +
"Règle : Ne donnez pas d'Answer sans d'abord appeler un outil."),
("user", "Le temps à Pékin aujourd'hui est-il adapté aux sports de plein air ?"),
]);git clone https://github.com/NewLifeX/NewLife.AI.git
cd NewLife.AI
# Construire le frontend (nécessite Node.js + pnpm)
cd Web && pnpm install && pnpm build && cd ..
# Démarrer
cd NewLife.ChatAI
dotnet run --framework net8.0Ouvrez http://localhost:5000 dans votre navigateur — SQLite par défaut, prêt à l'emploi. Au premier démarrage, configurez les clés API des fournisseurs via /Admin.
Vous pouvez également intégrer NewLife.ChatAI dans un projet existant via NuGet :
dotnet add package NewLife.ChatAIusing NewLife.ChatAI;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddChatAI();
var app = builder.Build();
app.UseChatAI(redirectToChat: true);
app.Run();NewLife.ChatAI inclut une passerelle AI multi-protocole intégrée. Les systèmes tiers peuvent se connecter sans modification — tous les chemins passent par l'injection de mémoire et l'amélioration des compétences.
| Protocole | Route | Description |
|---|---|---|
| OpenAI ChatCompletions | POST /v1/chat/completions |
Streaming / non-streaming / appels de fonctions / vision |
| OpenAI Responses | POST /v1/responses |
Modèles de raisonnement o3 / gpt-5 |
| Anthropic Messages | POST /v1/messages |
Série Claude |
| Google Gemini | POST /v1/gemini/... |
Série Gemini |
| Génération d'images | POST /v1/images/generations |
Text-to-Image |
| Édition d'images | POST /v1/images/edits |
Inpainting (multipart/form-data) |
| Découverte de modèles | GET /v1/models |
Liste des modèles disponibles |
Authentification : Authorization: Bearer sk-xxxx (AppKey)
Caractéristiques : Nouvelle tentative avec backoff exponentiel 429 (jitter aléatoire, max 5 tentatives) ; enregistrement automatique de l'utilisation des tokens ; statistiques bidimensionnelles par AppKey + Utilisateur
Héritez de OpenAIChatClient, ajoutez l'attribut [AiClient] — AiClientRegistry scanne automatiquement au démarrage :
[AiClient("MyAI", "Mon Service", "https://api.myai.com/v1",
Description = "Service d'IA personnalisé")]
[AiClientModel("myai-latest", "MyAI Latest", Code = "MyAI",
FunctionCalling = true, Vision = true)]
public class MyAiChatClient : OpenAIChatClient
{
public MyAiChatClient() { }
public MyAiChatClient(String apiKey, String? model = null, String? endpoint = null)
: base(apiKey, model, endpoint) { }
}public class MyTools
{
/// <summary>Obtenir l'heure actuelle</summary>
[ToolDescription("get_current_time")]
public String GetCurrentTime()
=> DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
var registry = new ToolRegistry();
registry.AddTools<MyTools>(new MyTools());[ChatHandlerOrder(150)]
public class CurrentTimeHandler : ChatHandlerBase
{
public override Task OnBefore(IChatContext context, CancellationToken cancellationToken)
{
context.ContextMessages.Insert(0,
new ChatMessage { Role = "system", Content = $"Heure actuelle : {DateTime.Now:yyyy-MM-dd HH:mm}" });
return Task.CompletedTask;
}
}
services.AddSingleton<IChatHandler, CurrentTimeHandler>();| Document | Description |
|---|---|
| Spécification des exigences | Objectifs du produit, liste des fonctionnalités, exigences non fonctionnelles |
| Conception de l'architecture | Architecture 4 couches, détails de conception des modules |
| Framework d'orchestration AI | Conception des outils / agents / planificateur |
| Exigences de la passerelle API | Détails d'adaptation des protocoles |
| Architecture MCP | Conception du client et du serveur MCP |
| Gestion des compétences | Conception détaillée du système de compétences |
| Système d'auto-apprentissage | Analyse de conversation + extraction de mémoire |
| Flux de persistance des données | Processus détaillé de MessageFlow |
| Liste des modules fonctionnels | Inventaire complet des fonctionnalités |
Les Issues et Pull Requests sont les bienvenues.
- GitHub : https://github.com/NewLifeX/NewLife.AI
- Site web : https://newlifex.com
- Groupe QQ : 1600800
- NewLife.Core — Bibliothèque de base .NET
- XCode — Framework ORM de données
- NewLife.Cube — Plateforme de développement rapide