version 2
This commit is contained in:
33
src/GreenHome.AI.DeepSeek/DeepSeekOptions.cs
Normal file
33
src/GreenHome.AI.DeepSeek/DeepSeekOptions.cs
Normal 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; }
|
||||
}
|
||||
|
||||
124
src/GreenHome.AI.DeepSeek/DeepSeekService.cs
Normal file
124
src/GreenHome.AI.DeepSeek/DeepSeekService.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
15
src/GreenHome.AI.DeepSeek/GreenHome.AI.DeepSeek.csproj
Normal file
15
src/GreenHome.AI.DeepSeek/GreenHome.AI.DeepSeek.csproj
Normal 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>
|
||||
25
src/GreenHome.AI.DeepSeek/IDeepSeekService.cs
Normal file
25
src/GreenHome.AI.DeepSeek/IDeepSeekService.cs
Normal 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);
|
||||
}
|
||||
|
||||
129
src/GreenHome.AI.DeepSeek/Models.cs
Normal file
129
src/GreenHome.AI.DeepSeek/Models.cs
Normal 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; }
|
||||
}
|
||||
|
||||
126
src/GreenHome.AI.DeepSeek/QUICKSTART.md
Normal file
126
src/GreenHome.AI.DeepSeek/QUICKSTART.md
Normal 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. ✅ چتبات هوشمند بسازید
|
||||
|
||||
موفق باشید! 🚀
|
||||
|
||||
399
src/GreenHome.AI.DeepSeek/README.md
Normal file
399
src/GreenHome.AI.DeepSeek/README.md
Normal 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 ایجاد کنید.
|
||||
|
||||
200
src/GreenHome.AI.DeepSeek/SUMMARY.md
Normal file
200
src/GreenHome.AI.DeepSeek/SUMMARY.md
Normal 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 استفاده کنید! 🚀
|
||||
|
||||
110
src/GreenHome.AI.DeepSeek/ServiceCollectionExtensions.cs
Normal file
110
src/GreenHome.AI.DeepSeek/ServiceCollectionExtensions.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
186
src/GreenHome.AI.DeepSeek/USAGE_FA.md
Normal file
186
src/GreenHome.AI.DeepSeek/USAGE_FA.md
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user