version 2

This commit is contained in:
2025-12-16 16:52:40 +03:30
parent 61e86b1e96
commit 139924db94
52 changed files with 7350 additions and 321 deletions

View File

@@ -0,0 +1,33 @@
namespace GreenHome.AI.DeepSeek;
/// <summary>
/// Configuration options for DeepSeek AI service
/// </summary>
public sealed class DeepSeekOptions
{
/// <summary>
/// DeepSeek API base URL
/// </summary>
public string BaseUrl { get; set; } = "https://api.deepseek.com";
/// <summary>
/// DeepSeek API key (required)
/// </summary>
public required string ApiKey { get; set; }
/// <summary>
/// Default model to use
/// </summary>
public string DefaultModel { get; set; } = "deepseek-chat";
/// <summary>
/// Default temperature for responses (0-2)
/// </summary>
public double DefaultTemperature { get; set; } = 1.0;
/// <summary>
/// Default maximum tokens for responses
/// </summary>
public int? DefaultMaxTokens { get; set; }
}

View File

@@ -0,0 +1,124 @@
using System.Net.Http.Json;
using System.Text.Json;
using Microsoft.Extensions.Logging;
namespace GreenHome.AI.DeepSeek;
/// <summary>
/// DeepSeek AI service implementation
/// </summary>
public sealed class DeepSeekService : IDeepSeekService
{
private readonly HttpClient httpClient;
private readonly DeepSeekOptions options;
private readonly ILogger<DeepSeekService> logger;
public DeepSeekService(
HttpClient httpClient,
DeepSeekOptions options,
ILogger<DeepSeekService> logger)
{
this.httpClient = httpClient;
this.options = options;
this.logger = logger;
}
public async Task<ChatResponse?> AskAsync(
ChatRequest request,
CancellationToken cancellationToken = default)
{
try
{
// Set defaults if not provided
if (string.IsNullOrEmpty(request.Model))
{
request.Model = options.DefaultModel;
}
if (!request.Temperature.HasValue)
{
request.Temperature = options.DefaultTemperature;
}
if (!request.MaxTokens.HasValue && options.DefaultMaxTokens.HasValue)
{
request.MaxTokens = options.DefaultMaxTokens;
}
logger.LogInformation("Sending chat request to DeepSeek AI with {MessageCount} messages",
request.Messages.Count);
var response = await httpClient.PostAsJsonAsync(
"v1/chat/completions",
request,
cancellationToken);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<ChatResponse>(
cancellationToken: cancellationToken);
logger.LogInformation("Received response from DeepSeek AI, used {TotalTokens} tokens",
result?.Usage?.TotalTokens ?? 0);
return result;
}
catch (HttpRequestException ex)
{
logger.LogError(ex, "HTTP error while communicating with DeepSeek AI");
throw;
}
catch (Exception ex)
{
logger.LogError(ex, "Unexpected error while calling DeepSeek AI");
throw;
}
}
public async Task<string?> AskSimpleAsync(
string question,
string? systemPrompt = null,
CancellationToken cancellationToken = default)
{
try
{
var messages = new List<ChatMessage>();
// Add system prompt if provided
if (!string.IsNullOrWhiteSpace(systemPrompt))
{
messages.Add(new ChatMessage
{
Role = "system",
Content = systemPrompt
});
}
// Add user question
messages.Add(new ChatMessage
{
Role = "user",
Content = question
});
var request = new ChatRequest
{
Model = options.DefaultModel,
Messages = messages,
Temperature = options.DefaultTemperature,
MaxTokens = options.DefaultMaxTokens
};
var response = await AskAsync(request, cancellationToken);
// Extract the text content from the response
return response?.Choices?.FirstOrDefault()?.Message?.Content;
}
catch (Exception ex)
{
logger.LogError(ex, "Error in AskSimpleAsync for question: {Question}", question);
throw;
}
}
}

View File

@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.1" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,25 @@
namespace GreenHome.AI.DeepSeek;
/// <summary>
/// Interface for DeepSeek AI service
/// </summary>
public interface IDeepSeekService
{
/// <summary>
/// Sends a chat request to DeepSeek AI and gets a response
/// </summary>
/// <param name="request">The chat request containing messages</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>The AI response</returns>
Task<ChatResponse?> AskAsync(ChatRequest request, CancellationToken cancellationToken = default);
/// <summary>
/// Sends a simple question to DeepSeek AI and gets a text response
/// </summary>
/// <param name="question">The question to ask</param>
/// <param name="systemPrompt">Optional system prompt to set context</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>The AI response text</returns>
Task<string?> AskSimpleAsync(string question, string? systemPrompt = null, CancellationToken cancellationToken = default);
}

View File

@@ -0,0 +1,129 @@
using System.Text.Json.Serialization;
namespace GreenHome.AI.DeepSeek;
/// <summary>
/// Request to ask a question to DeepSeek AI
/// </summary>
public sealed class ChatRequest
{
/// <summary>
/// The model to use (default: deepseek-chat)
/// </summary>
public string Model { get; set; } = "deepseek-chat";
/// <summary>
/// The messages to send to the AI
/// </summary>
public required List<ChatMessage> Messages { get; set; }
/// <summary>
/// Temperature for response randomness (0-2, default: 1)
/// </summary>
public double? Temperature { get; set; }
/// <summary>
/// Maximum tokens in the response
/// </summary>
[JsonPropertyName("max_tokens")]
public int? MaxTokens { get; set; }
}
/// <summary>
/// A single message in the chat
/// </summary>
public sealed class ChatMessage
{
/// <summary>
/// Role of the message sender (system, user, or assistant)
/// </summary>
public required string Role { get; set; }
/// <summary>
/// Content of the message
/// </summary>
public required string Content { get; set; }
}
/// <summary>
/// Response from DeepSeek AI
/// </summary>
public sealed class ChatResponse
{
/// <summary>
/// Unique ID for the chat completion
/// </summary>
public string? Id { get; set; }
/// <summary>
/// Object type (e.g., "chat.completion")
/// </summary>
public string? Object { get; set; }
/// <summary>
/// Unix timestamp of when the completion was created
/// </summary>
public long Created { get; set; }
/// <summary>
/// The model used for the completion
/// </summary>
public string? Model { get; set; }
/// <summary>
/// The completion choices
/// </summary>
public List<ChatChoice>? Choices { get; set; }
/// <summary>
/// Usage statistics for the request
/// </summary>
public ChatUsage? Usage { get; set; }
}
/// <summary>
/// A choice in the chat completion response
/// </summary>
public sealed class ChatChoice
{
/// <summary>
/// Index of the choice
/// </summary>
public int Index { get; set; }
/// <summary>
/// The message from the AI
/// </summary>
public ChatMessage? Message { get; set; }
/// <summary>
/// Reason for completion finish
/// </summary>
[JsonPropertyName("finish_reason")]
public string? FinishReason { get; set; }
}
/// <summary>
/// Token usage statistics
/// </summary>
public sealed class ChatUsage
{
/// <summary>
/// Number of tokens in the prompt
/// </summary>
[JsonPropertyName("prompt_tokens")]
public int PromptTokens { get; set; }
/// <summary>
/// Number of tokens in the completion
/// </summary>
[JsonPropertyName("completion_tokens")]
public int CompletionTokens { get; set; }
/// <summary>
/// Total number of tokens used
/// </summary>
[JsonPropertyName("total_tokens")]
public int TotalTokens { get; set; }
}

View File

@@ -0,0 +1,126 @@
# 🚀 راهنمای سریع شروع - 5 دقیقه!
## مرحله 1: دریافت API Key (2 دقیقه)
1. به https://platform.deepseek.com بروید
2. روی "Sign Up" کلیک کنید (یا Login اگر قبلاً ثبت‌نام کرده‌اید)
3. وارد Dashboard شوید
4. از منوی سمت چپ، گزینه "API Keys" را انتخاب کنید
5. روی "Create API Key" کلیک کنید
6. یک نام برای کلید انتخاب کنید (مثلاً "GreenHome")
7. کلید را کپی کنید ⚠️ (فقط یک بار نمایش داده می‌شود!)
## مرحله 2: تنظیم API Key (1 دقیقه)
فایل `appsettings.json` را باز کنید و API Key را جایگزین کنید:
```json
{
"DeepSeek": {
"ApiKey": "اینجا-کلید-خود-را-بگذارید"
}
}
```
## مرحله 3: اجرای برنامه (1 دقیقه)
```bash
cd GreenHome.Api
dotnet run
```
## مرحله 4: تست API (1 دقیقه)
### با Swagger:
1. مرورگر را باز کنید: http://localhost:5000/swagger
2. endpoint `/api/ai/ask` را باز کنید
3. روی "Try it out" کلیک کنید
4. این را در Body بگذارید:
```json
{
"question": "سلام! آیا کار می‌کنی؟"
}
```
5. روی "Execute" کلیک کنید
6. پاسخ را ببینید! ✅
### با Curl:
```bash
curl -X POST http://localhost:5000/api/ai/ask \
-H "Content-Type: application/json" \
-d '{"question":"سلام! آیا کار می‌کنی؟"}'
```
### با Postman:
1. Postman را باز کنید
2. یک درخواست POST جدید بسازید
3. URL: `http://localhost:5000/api/ai/ask`
4. Headers: `Content-Type: application/json`
5. Body (raw JSON):
```json
{
"question": "سلام! آیا کار می‌کنی؟"
}
```
6. Send را بزنید!
## 🎉 تبریک! شما آماده‌اید!
اکنون می‌توانید از AI در پروژه خود استفاده کنید.
## مثال‌های آماده برای تست:
### 1. سوال درباره خانه هوشمند:
```json
{
"question": "چگونه می‌توانم مصرف برق خانه را کاهش دهم؟"
}
```
### 2. دریافت پیشنهاد:
**Endpoint:** POST `/api/ai/suggest`
```json
{
"deviceContext": "دمای اتاق: 28 درجه، رطوبت: 65%، ساعت: 14:00"
}
```
### 3. سوال با زمینه خاص:
```json
{
"question": "بهترین دمای کولر برای خواب چیست؟",
"systemPrompt": "شما یک متخصص خانه هوشمند و بهینه‌سازی انرژی هستید."
}
```
## ❓ مشکل دارید؟
### خطا: 401 Unauthorized
- ✅ بررسی کنید API Key را صحیح کپی کرده‌اید
- ✅ فاصله اضافی ندارد
- ✅ در appsettings.json به درستی قرار دارد
### خطا: Connection Refused
- ✅ مطمئن شوید برنامه اجرا شده است (`dotnet run`)
- ✅ پورت صحیح است (معمولاً 5000 یا 5001)
### خطا: 429 Too Many Requests
- ✅ کمی صبر کنید (1-2 دقیقه)
- ✅ تعداد درخواست‌های شما زیاد بوده است
## 📚 مستندات بیشتر
- مستندات کامل: [README.md](README.md)
- راهنمای استفاده: [USAGE_FA.md](USAGE_FA.md)
- خلاصه پروژه: [SUMMARY.md](SUMMARY.md)
## 🎯 مرحله بعدی
اکنون می‌توانید:
1. ✅ از AI در Controller های خود استفاده کنید
2. ✅ پیشنهادات هوشمند برای کاربران ارائه دهید
3. ✅ تحلیل داده‌های سنسورها را انجام دهید
4. ✅ چت‌بات هوشمند بسازید
موفق باشید! 🚀

View File

@@ -0,0 +1,399 @@
# GreenHome.AI.DeepSeek
سرویس هوش مصنوعی DeepSeek برای پروژه GreenHome
## درباره DeepSeek
DeepSeek یک مدل هوش مصنوعی پیشرفته است که می‌توانید از آن برای:
- پاسخ به سوالات کاربران
- تحلیل داده‌های خانه هوشمند
- ارائه پیشنهادات بهینه‌سازی
- تولید محتوای هوشمند
## نصب و راه‌اندازی
### 1. اضافه کردن Reference به پروژه
در فایل `.csproj` پروژه خود:
```xml
<ItemGroup>
<ProjectReference Include="..\GreenHome.AI.DeepSeek\GreenHome.AI.DeepSeek.csproj" />
</ItemGroup>
```
### 2. دریافت API Key
1. به وب‌سایت [DeepSeek](https://platform.deepseek.com/) بروید
2. ثبت‌نام کنید یا وارد حساب کاربری خود شوید
3. از بخش API Keys، یک کلید API جدید بسازید
4. کلید را کپی کنید (فقط یک بار نمایش داده می‌شود!)
### 3. ثبت سرویس در Program.cs
```csharp
using GreenHome.AI.DeepSeek;
// روش 1: استفاده از Configuration (پیشنهادی)
builder.Services.AddDeepSeek(builder.Configuration);
// روش 2: استفاده از Configuration Section
builder.Services.AddDeepSeek(builder.Configuration.GetSection("DeepSeek"));
// روش 3: تنظیم دستی
builder.Services.AddDeepSeek(options =>
{
options.ApiKey = "YOUR_API_KEY_HERE";
options.BaseUrl = "https://api.deepseek.com";
options.DefaultModel = "deepseek-chat";
options.DefaultTemperature = 1.0;
});
```
### 4. تنظیمات در appsettings.json
```json
{
"DeepSeek": {
"BaseUrl": "https://api.deepseek.com",
"ApiKey": "YOUR_DEEPSEEK_API_KEY_HERE",
"DefaultModel": "deepseek-chat",
"DefaultTemperature": 1.0,
"DefaultMaxTokens": 2000
}
}
```
**نکته امنیتی:** هرگز API Key خود را در کد یا repository قرار ندهید! از Environment Variables یا User Secrets استفاده کنید.
#### استفاده از User Secrets (Development)
```bash
dotnet user-secrets init
dotnet user-secrets set "DeepSeek:ApiKey" "YOUR_API_KEY_HERE"
```
#### استفاده از Environment Variables (Production)
```bash
export DeepSeek__ApiKey="YOUR_API_KEY_HERE"
```
## استفاده در کنترلرها
### تزریق سرویس
```csharp
public class AIController : ControllerBase
{
private readonly IDeepSeekService deepSeekService;
public AIController(IDeepSeekService deepSeekService)
{
this.deepSeekService = deepSeekService;
}
}
```
### سوال ساده
```csharp
var response = await deepSeekService.AskSimpleAsync(
"چگونه می‌توانم مصرف انرژی خانه را کاهش دهم؟"
);
Console.WriteLine(response);
```
### سوال با System Prompt
```csharp
var systemPrompt = "شما یک مشاور خانه هوشمند هستید.";
var question = "بهترین دمای کولر برای صرفه‌جویی انرژی چقدر است؟";
var response = await deepSeekService.AskSimpleAsync(question, systemPrompt);
```
### چت پیشرفته با تاریخچه
```csharp
var request = new ChatRequest
{
Model = "deepseek-chat",
Messages = new List<ChatMessage>
{
new ChatMessage
{
Role = "system",
Content = "شما یک دستیار هوشمند خانه هوشمند هستید."
},
new ChatMessage
{
Role = "user",
Content = "دمای فعلی 28 درجه است"
},
new ChatMessage
{
Role = "assistant",
Content = "باشه، دمای فعلی خانه را دریافت کردم."
},
new ChatMessage
{
Role = "user",
Content = "آیا باید کولر را روشن کنم؟"
}
},
Temperature = 0.7,
MaxTokens = 1000
};
var response = await deepSeekService.AskAsync(request);
var answer = response?.Choices?.FirstOrDefault()?.Message?.Content;
```
## API Endpoints
سرویس شامل 3 endpoint اصلی است:
### 1. POST /api/ai/ask
پرسیدن یک سوال ساده
**Request Body:**
```json
{
"question": "چگونه می‌توانم دمای خانه را کنترل کنم؟",
"systemPrompt": "شما یک مشاور خانه هوشمند هستید."
}
```
**Response:**
```json
{
"question": "چگونه می‌توانم دمای خانه را کنترل کنم؟",
"answer": "برای کنترل دمای خانه می‌توانید از ترموستات هوشمند استفاده کنید...",
"timestamp": "2025-12-16T10:30:00Z"
}
```
### 2. POST /api/ai/chat
چت پیشرفته با تاریخچه
**Request Body:**
```json
{
"model": "deepseek-chat",
"messages": [
{
"role": "system",
"content": "شما یک دستیار هوشمند هستید."
},
{
"role": "user",
"content": "سلام"
}
],
"temperature": 0.7,
"maxTokens": 2000
}
```
**Response:**
```json
{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"created": 1702735200,
"model": "deepseek-chat",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "سلام! چطور می‌تونم کمکتون کنم؟"
},
"finishReason": "stop"
}
],
"usage": {
"promptTokens": 20,
"completionTokens": 15,
"totalTokens": 35
}
}
```
### 3. POST /api/ai/suggest
دریافت پیشنهادات برای بهینه‌سازی خانه هوشمند
**Request Body:**
```json
{
"deviceContext": "دمای اتاق: 28°C، رطوبت: 65%، ساعت: 14:00"
}
```
**Response:**
```json
{
"suggestions": "با توجه به دمای بالای 28 درجه، توصیه می‌شود کولر را روشن کنید...",
"timestamp": "2025-12-16T10:30:00Z"
}
```
## مثال‌های کاربردی
### 1. تحلیل داده‌های سنسور
```csharp
var deviceData = $@"
دمای اتاق خواب: {temperature}°C
رطوبت: {humidity}%
کیفیت هوا: {airQuality}
ساعت: {DateTime.Now:HH:mm}
";
var systemPrompt = "شما یک مشاور خانه هوشمند هستید که بر اساس داده‌های سنسورها پیشنهاد می‌دهید.";
var response = await deepSeekService.AskSimpleAsync(
$"وضعیت خانه: {deviceData}\nچه کاری باید انجام دهم؟",
systemPrompt
);
```
### 2. پاسخ به سوالات کاربر
```csharp
[HttpPost("ask")]
public async Task<IActionResult> Ask([FromBody] string question)
{
var answer = await deepSeekService.AskSimpleAsync(question);
return Ok(new { question, answer });
}
```
### 3. دستیار هوشمند با حافظه
```csharp
// ذخیره تاریخچه در session یا database
var conversationHistory = GetConversationHistory(userId);
var request = new ChatRequest
{
Messages = conversationHistory.Select(m => new ChatMessage
{
Role = m.Role,
Content = m.Content
}).ToList()
};
// اضافه کردن پیام جدید کاربر
request.Messages.Add(new ChatMessage
{
Role = "user",
Content = userMessage
});
var response = await deepSeekService.AskAsync(request);
// ذخیره پاسخ در تاریخچه
SaveToHistory(userId, response);
```
## پارامترها
### Temperature
- **مقدار:** 0 تا 2
- **پیش‌فرض:** 1.0
- **توضیح:** هر چه عدد بالاتر باشد، پاسخ‌ها خلاقانه‌تر و تصادفی‌تر هستند
### MaxTokens
- **توضیح:** حداکثر تعداد توکن در پاسخ
- **توصیه:** برای پاسخ‌های کوتاه: 500، برای پاسخ‌های بلند: 2000
### Model
- **مقدار:** `deepseek-chat` (پیش‌فرض)
- **توضیح:** مدل مورد استفاده برای تولید پاسخ
## نکات مهم
1. **هزینه:** هر درخواست به DeepSeek بر اساس تعداد توکن‌های استفاده شده هزینه دارد
2. **Rate Limiting:** محدودیت تعداد درخواست در واحد زمان را رعایت کنید
3. **Timeout:** درخواست‌های AI ممکن است طولانی باشند (پیش‌فرض: 60 ثانیه)
4. **خطاها:** همیشه خطاها را مدیریت کنید و پیام مناسب به کاربر نمایش دهید
5. **امنیت:** API Key را محرمانه نگه دارید
## عیب‌یابی
### خطای 401 Unauthorized
- بررسی کنید که API Key صحیح است
- مطمئن شوید که در configuration به درستی تنظیم شده است
### خطای 429 Too Many Requests
- به محدودیت rate limit رسیده‌اید
- کمی صبر کنید و دوباره تلاش کنید
### خطای Timeout
- درخواست خیلی طولانی است
- MaxTokens را کاهش دهید یا Timeout را افزایش دهید
## مثال کامل
```csharp
using GreenHome.AI.DeepSeek;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class SmartHomeAIController : ControllerBase
{
private readonly IDeepSeekService _ai;
private readonly ILogger<SmartHomeAIController> _logger;
public SmartHomeAIController(
IDeepSeekService ai,
ILogger<SmartHomeAIController> logger)
{
_ai = ai;
_logger = logger;
}
[HttpPost("analyze")]
public async Task<IActionResult> AnalyzeHome([FromBody] HomeData data)
{
try
{
var prompt = $@"
داده‌های خانه هوشمند:
- دمای داخل: {data.Temperature}°C
- رطوبت: {data.Humidity}%
- مصرف برق: {data.PowerUsage}W
- تعداد افراد: {data.OccupancyCount}
لطفاً تحلیل کامل ارائه دهید و پیشنهادات بهینه‌سازی بدهید.
";
var systemPrompt = "شما یک متخصص خانه هوشمند هستید.";
var analysis = await _ai.AskSimpleAsync(prompt, systemPrompt);
return Ok(new { analysis, timestamp = DateTime.UtcNow });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error analyzing home data");
return StatusCode(500, "خطا در تحلیل داده‌ها");
}
}
}
```
## منابع
- [DeepSeek Documentation](https://platform.deepseek.com/docs)
- [API Reference](https://platform.deepseek.com/api-docs)
- [Pricing](https://platform.deepseek.com/pricing)
## پشتیبانی
در صورت بروز مشکل، لطفاً یک Issue در GitHub ایجاد کنید.

View File

@@ -0,0 +1,200 @@
# خلاصه سرویس DeepSeek برای GreenHome
## ✅ کارهای انجام شده
### 1. ساختار پروژه
- ✅ پروژه `GreenHome.AI.DeepSeek` ایجاد شد
- ✅ به Solution اضافه شد
- ✅ Reference در پروژه API افزوده شد
- ✅ بسته‌های NuGet نصب شدند
### 2. فایل‌های ایجاد شده
#### Core Files:
- ✅ `IDeepSeekService.cs` - Interface سرویس
- ✅ `DeepSeekService.cs` - پیاده‌سازی سرویس
- ✅ `DeepSeekOptions.cs` - تنظیمات
- ✅ `Models.cs` - مدل‌های درخواست و پاسخ
- ✅ `ServiceCollectionExtensions.cs` - ثبت سرویس در DI
#### API Controller:
- ✅ `AIController.cs` - 3 endpoint برای استفاده از AI
#### Documentation:
- ✅ `README.md` - مستندات کامل (فارسی)
- ✅ `USAGE_FA.md` - راهنمای سریع (فارسی)
- ✅ `SUMMARY.md` - این فایل
### 3. تنظیمات
#### Program.cs
```csharp
using GreenHome.AI.DeepSeek;
// ...
builder.Services.AddDeepSeek(builder.Configuration);
```
#### appsettings.json
```json
{
"DeepSeek": {
"BaseUrl": "https://api.deepseek.com",
"ApiKey": "YOUR_DEEPSEEK_API_KEY_HERE",
"DefaultModel": "deepseek-chat",
"DefaultTemperature": 1.0
}
}
```
## 📋 API Endpoints
### 1. POST /api/ai/ask
پرسیدن سوال ساده از AI
**Request:**
```json
{
"question": "سوال شما",
"systemPrompt": "زمینه و کنتکست (اختیاری)"
}
```
### 2. POST /api/ai/chat
چت پیشرفته با تاریخچه
**Request:**
```json
{
"messages": [
{"role": "system", "content": "..."},
{"role": "user", "content": "..."}
],
"temperature": 0.7,
"maxTokens": 2000
}
```
### 3. POST /api/ai/suggest
دریافت پیشنهادات برای خانه هوشمند
**Request:**
```json
{
"deviceContext": "دمای اتاق: 28°C، رطوبت: 65%"
}
```
## 🎯 ویژگی‌ها
- ✅ اتصال به API رسمی DeepSeek
- ✅ پشتیبانی از چت ساده و پیشرفته
- ✅ قابلیت تنظیم Temperature و MaxTokens
- ✅ Logging کامل
- ✅ مدیریت خطا
- ✅ استفاده از HttpClient Factory
- ✅ Dependency Injection
- ✅ Configuration از appsettings.json
- ✅ مستندات کامل فارسی
## 🚀 نحوه استفاده
### در Controller:
```csharp
public class MyController : ControllerBase
{
private readonly IDeepSeekService _ai;
public MyController(IDeepSeekService ai)
{
_ai = ai;
}
[HttpPost]
public async Task<IActionResult> Ask(string question)
{
var answer = await _ai.AskSimpleAsync(question);
return Ok(answer);
}
}
```
### در Service:
```csharp
public class MyService
{
private readonly IDeepSeekService _ai;
public MyService(IDeepSeekService ai)
{
_ai = ai;
}
public async Task<string> GetSuggestion(string context)
{
return await _ai.AskSimpleAsync(
$"پیشنهاد بده: {context}",
"شما یک مشاور خانه هوشمند هستید"
);
}
}
```
## ⚙️ پیش‌نیازها
1. دریافت API Key از https://platform.deepseek.com
2. قرار دادن API Key در appsettings.json
3. اطمینان از اتصال اینترنت
## ⚠️ نکات مهم
1. **امنیت:** API Key را در Git commit نکنید
2. **هزینه:** هر درخواست بر اساس توکن هزینه دارد
3. **محدودیت:** Rate limiting وجود دارد
4. **Timeout:** درخواست‌ها ممکن است کند باشند (60 ثانیه)
## 🔧 عیب‌یابی
| خطا | دلیل | راه حل |
|-----|------|--------|
| 401 Unauthorized | API Key نامعتبر | بررسی API Key در appsettings.json |
| 429 Too Many Requests | تعداد درخواست زیاد | کمی صبر کنید (1-2 دقیقه) |
| Timeout | درخواست طولانی | MaxTokens را کاهش دهید |
## 📚 مستندات
- مستندات کامل: [README.md](README.md)
- راهنمای سریع: [USAGE_FA.md](USAGE_FA.md)
- وب‌سایت DeepSeek: https://platform.deepseek.com
- API Docs: https://platform.deepseek.com/api-docs
## ✨ مثال‌های کاربردی
### تحلیل داده‌های سنسور
```csharp
var data = $"دمای اتاق: {temp}°C، رطوبت: {humidity}%";
var suggestion = await _ai.AskSimpleAsync(
$"تحلیل کن: {data}",
"شما متخصص خانه هوشمند هستید"
);
```
### چت با حافظه
```csharp
var messages = new List<ChatMessage>
{
new() { Role = "system", Content = "شما دستیار هوشمند هستید" },
new() { Role = "user", Content = "سلام" },
// ... تاریخچه قبلی
new() { Role = "user", Content = "پیام جدید" }
};
var response = await _ai.AskAsync(new ChatRequest
{
Messages = messages
});
```
## 🎉 آماده استفاده!
پروژه کامل شده و آماده استفاده است. فقط API Key خود را در appsettings.json قرار دهید و از AI استفاده کنید! 🚀

View File

@@ -0,0 +1,110 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace GreenHome.AI.DeepSeek;
/// <summary>
/// Extension methods for registering DeepSeek AI service
/// </summary>
public static class ServiceCollectionExtensions
{
/// <summary>
/// Adds DeepSeek AI service to the service collection
/// </summary>
/// <param name="services">The service collection</param>
/// <param name="configuration">Configuration root</param>
/// <returns>The service collection for chaining</returns>
public static IServiceCollection AddDeepSeek(
this IServiceCollection services,
IConfiguration configuration)
{
return services.AddDeepSeek(configuration.GetSection("DeepSeek"));
}
/// <summary>
/// Adds DeepSeek AI service to the service collection
/// </summary>
/// <param name="services">The service collection</param>
/// <param name="configurationSection">Configuration section for DeepSeek</param>
/// <returns>The service collection for chaining</returns>
public static IServiceCollection AddDeepSeek(
this IServiceCollection services,
IConfigurationSection? configurationSection = null)
{
// Configure options
DeepSeekOptions? options = null;
if (configurationSection != null)
{
options = configurationSection.Get<DeepSeekOptions>();
}
if (options == null)
{
throw new InvalidOperationException(
"DeepSeek configuration section is missing. " +
"Please add 'DeepSeek' section to your appsettings.json with 'ApiKey' property.");
}
if (string.IsNullOrWhiteSpace(options.ApiKey))
{
throw new InvalidOperationException(
"DeepSeek ApiKey is required. " +
"Please add 'ApiKey' to the 'DeepSeek' section in your appsettings.json.");
}
// Register options as singleton
services.AddSingleton(options);
// Register HttpClient and service
services.AddHttpClient<IDeepSeekService, DeepSeekService>(client =>
{
// Ensure BaseUrl ends with / for proper relative path handling
var baseUrl = options.BaseUrl.TrimEnd('/') + "/";
client.BaseAddress = new Uri(baseUrl);
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer {options.ApiKey}");
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
client.Timeout = TimeSpan.FromSeconds(60); // AI requests may take longer
});
return services;
}
/// <summary>
/// Adds DeepSeek AI service to the service collection with explicit options
/// </summary>
/// <param name="services">The service collection</param>
/// <param name="configureOptions">Action to configure options</param>
/// <returns>The service collection for chaining</returns>
public static IServiceCollection AddDeepSeek(
this IServiceCollection services,
Action<DeepSeekOptions> configureOptions)
{
var options = new DeepSeekOptions
{
ApiKey = string.Empty // Will be set by configureOptions
};
configureOptions(options);
if (string.IsNullOrWhiteSpace(options.ApiKey))
{
throw new InvalidOperationException(
"DeepSeek ApiKey is required.");
}
// Register options as singleton
services.AddSingleton(options);
// Register HttpClient and service
services.AddHttpClient<IDeepSeekService, DeepSeekService>(client =>
{
var baseUrl = options.BaseUrl.TrimEnd('/') + "/";
client.BaseAddress = new Uri(baseUrl);
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer {options.ApiKey}");
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
client.Timeout = TimeSpan.FromSeconds(60);
});
return services;
}
}

View File

@@ -0,0 +1,186 @@
# راهنمای سریع استفاده از سرویس DeepSeek
## نصب و راه‌اندازی
### گام 1: دریافت API Key
1. به آدرس https://platform.deepseek.com بروید
2. ثبت‌نام کنید یا وارد شوید
3. از منوی API Keys یک کلید جدید بسازید
4. کلید را کپی کنید (مهم: فقط یک بار نمایش داده می‌شود!)
### گام 2: تنظیم API Key
API Key خود را در فایل `appsettings.json` قرار دهید:
```json
{
"DeepSeek": {
"ApiKey": "کلید-API-خود-را-اینجا-قرار-دهید"
}
}
```
**هشدار امنیتی:** هرگز API Key را در Git commit نکنید!
### گام 3: اجرای برنامه
```bash
cd GreenHome.Api
dotnet run
```
## استفاده از API
سرویس روی آدرس `http://localhost:5000` (یا پورت دیگری که تنظیم کرده‌اید) اجرا می‌شود.
### 1. پرسیدن یک سوال ساده
**درخواست:**
```http
POST /api/ai/ask
Content-Type: application/json
{
"question": "چگونه می‌توانم مصرف انرژی خانه را کاهش دهم؟"
}
```
**پاسخ:**
```json
{
"question": "چگونه می‌توانم مصرف انرژی خانه را کاهش دهم؟",
"answer": "برای کاهش مصرف انرژی خانه می‌توانید از راه‌کارهای زیر استفاده کنید:\n1. از لامپ‌های LED استفاده کنید\n2. ترموستات هوشمند نصب کنید\n3. عایق‌بندی خانه را بهبود دهید...",
"timestamp": "2025-12-16T10:30:00Z"
}
```
### 2. دریافت پیشنهادات برای خانه هوشمند
**درخواست:**
```http
POST /api/ai/suggest
Content-Type: application/json
{
"deviceContext": "دمای فعلی: 28 درجه، رطوبت: 65%، ساعت: 14:00، تعداد افراد در خانه: 2 نفر"
}
```
**پاسخ:**
```json
{
"suggestions": "با توجه به شرایط فعلی، پیشنهادات زیر را دارم:\n- دمای 28 درجه کمی بالا است، روشن کردن کولر با دمای 24-25 درجه توصیه می‌شود\n- رطوبت 65% در محدوده مناسب است\n- در این ساعت از روز (14:00) پرده‌ها را بکشید تا آفتاب مستقیم وارد نشود",
"timestamp": "2025-12-16T10:30:00Z"
}
```
### 3. چت پیشرفته
**درخواست:**
```http
POST /api/ai/chat
Content-Type: application/json
{
"messages": [
{
"role": "system",
"content": "شما یک دستیار هوشمند خانه هوشمند هستید."
},
{
"role": "user",
"content": "دمای خانه 18 درجه است"
},
{
"role": "assistant",
"content": "درجه حرارت 18 درجه را دریافت کردم. این دما کمی پایین است."
},
{
"role": "user",
"content": "چه کار کنم؟"
}
],
"temperature": 0.7
}
```
## مثال‌های Curl
### سوال ساده
```bash
curl -X POST http://localhost:5000/api/ai/ask \
-H "Content-Type: application/json" \
-d '{"question":"بهترین دمای کولر برای خواب چیست؟"}'
```
### دریافت پیشنهاد
```bash
curl -X POST http://localhost:5000/api/ai/suggest \
-H "Content-Type: application/json" \
-d '{"deviceContext":"دمای اتاق خواب: 26 درجه، ساعت: 22:00"}'
```
## استفاده در کد C#
```csharp
using GreenHome.AI.DeepSeek;
public class MyService
{
private readonly IDeepSeekService _ai;
public MyService(IDeepSeekService ai)
{
_ai = ai;
}
public async Task<string> GetAdvice()
{
var answer = await _ai.AskSimpleAsync(
"چگونه خانه هوشمند خود را امن‌تر کنم؟"
);
return answer ?? "پاسخی دریافت نشد";
}
}
```
## نکات مهم
### هزینه
- هر درخواست به API DeepSeek هزینه دارد
- بر اساس تعداد توکن‌های استفاده شده محاسبه می‌شود
- برای کاهش هزینه، سوالات را مختصر و مفید بپرسید
### محدودیت‌ها
- تعداد درخواست در دقیقه محدود است
- اگر خطای 429 دریافت کردید، کمی صبر کنید
### بهینه‌سازی
- از `temperature` پایین‌تر (0.3-0.7) برای پاسخ‌های دقیق‌تر استفاده کنید
- `maxTokens` را برای کنترل طول پاسخ تنظیم کنید
- پاسخ‌های تکراری را cache کنید
## عیب‌یابی
### خطا: 401 Unauthorized
- API Key را چک کنید
- مطمئن شوید که در appsettings.json صحیح است
### خطا: 429 Too Many Requests
- به محدودیت تعداد درخواست رسیده‌اید
- 1-2 دقیقه صبر کنید
### خطا: Timeout
- درخواست طولانی است
- `maxTokens` را کاهش دهید
- timeout را افزایش دهید
## پشتیبانی
برای سوالات و مشکلات:
- مستندات کامل: [README.md](README.md)
- وب‌سایت DeepSeek: https://platform.deepseek.com
- مستندات API: https://platform.deepseek.com/api-docs