first commit
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
# پایگاه دانش CropLogic
|
||||
|
||||
فایلهای `.txt` و `.md` این پوشه بهصورت خودکار embed و به Qdrant اضافه میشوند.
|
||||
@@ -0,0 +1,19 @@
|
||||
# دانش پایه خاک برای کشاورزی
|
||||
|
||||
## انواع خاک
|
||||
خاکها بر اساس بافت (نسبت رس، سیلت و شن) دستهبندی میشوند. خاک رسی زهکشی ضعیفتری دارد و خاک شنی زهکشی سریع. خاک لومی ترکیبی متعادل از هر سه است و برای اغلب گیاهان مناسب است.
|
||||
|
||||
## pH خاک
|
||||
مقیاس pH از ۰ تا ۱۴ است؛ مقدار ۷ خنثی است. خاکهای اسیدی (زیر ۷) و قلیایی (بالای ۷) بر جذب عناصر غذایی تأثیر میگذارند. بیشتر گیاهان زراعی pH حدود ۶ تا ۷.۵ را ترجیح میدهند.
|
||||
|
||||
## رطوبت خاک
|
||||
رطوبت خاک بر رشد ریشه و جذب آب و مواد غذایی تأثیر مستقیم دارد. رطوبت بیش از حد باعث خفگی ریشه و کمبود اکسیژن میشود؛ رطوبت کم باعث تنش آبی و کاهش عملکرد میشود.
|
||||
|
||||
## NPK و عناصر غذایی
|
||||
نیتروژن (N) برای رشد سبزینه و برگها ضروری است. فسفر (P) برای ریشهزایی و گلدهی مهم است. پتاسیم (K) مقاومت به خشکی و بیماری را افزایش میدهد. مقادیر این عناصر در خاک با آزمون خاک قابل اندازهگیری است.
|
||||
|
||||
## هدایت الکتریکی (EC)
|
||||
EC نشاندهنده شوری خاک است. EC بالا یعنی نمک زیاد و میتواند به ریشه گیاه آسیب برساند. واحد آن معمولاً dS/m یا mS/cm است.
|
||||
|
||||
## عمق خاک
|
||||
دادههای خاک معمولاً در اعماق ۰–۵، ۵–۱۵ و ۱۵–۳۰ سانتیمتر اندازهگیری میشوند. لایه سطحی برای جوانهزنی و ریشههای سطحی مهم است؛ لایههای عمیقتر برای گیاهان ریشهعمیق اهمیت دارند.
|
||||
@@ -0,0 +1,24 @@
|
||||
# دانش پایه کودهی
|
||||
|
||||
## نیتروژن (N)
|
||||
نیتروژن برای رشد سبزینه و برگها ضروری است. کمبود آن باعث زردی برگها و کاهش رشد میشود.
|
||||
منابع نیتروژن: اوره (46% N)، نیترات آمونیوم (34% N)، سولفات آمونیوم (21% N).
|
||||
مصرف بیش از حد نیتروژن باعث رشد رویشی بیش از حد و کاهش مقاومت به بیماری میشود.
|
||||
|
||||
## فسفر (P)
|
||||
فسفر برای ریشهزایی، گلدهی و میوهدهی مهم است. کمبود آن رشد ریشه را محدود میکند.
|
||||
منابع فسفر: سوپرفسفات تریپل (46% P2O5)، DAP (18-46-0).
|
||||
فسفر در خاکهای قلیایی (pH > 7.5) بهسختی جذب میشود.
|
||||
|
||||
## پتاسیم (K)
|
||||
پتاسیم مقاومت به خشکی، سرما و بیماری را افزایش میدهد. در کیفیت میوه نقش دارد.
|
||||
منابع پتاسیم: سولفات پتاسیم (50% K2O)، کلرید پتاسیم (60% K2O).
|
||||
|
||||
## pH و جذب عناصر
|
||||
pH خاک بر جذب عناصر غذایی تأثیر مستقیم دارد. pH مناسب برای اغلب محصولات ۶ تا ۷ است.
|
||||
در pH پایین (اسیدی): آهن و منگنز زیاد جذب میشوند ولی فسفر و کلسیم کم.
|
||||
در pH بالا (قلیایی): آهن، روی و منگنز کم جذب میشوند.
|
||||
|
||||
## EC و کودهی
|
||||
EC بالا نشاندهنده شوری خاک است. قبل از کودهی باید EC بررسی شود.
|
||||
اگر EC بالای ۴ dS/m باشد، کودهی باید با احتیاط انجام شود.
|
||||
@@ -0,0 +1,18 @@
|
||||
# دانش پایه آبیاری
|
||||
|
||||
## تبخیر-تعرق مرجع (ET0)
|
||||
ET0 نشاندهنده میزان آب مورد نیاز گیاه مرجع (چمن) در یک روز است. واحد آن mm/day است.
|
||||
ET0 بالا یعنی هوا گرم و خشک است و گیاه آب بیشتری نیاز دارد.
|
||||
|
||||
## رابطه بارش و آبیاری
|
||||
اگر بارش پیشبینی شده از ET0 بیشتر باشد، معمولاً آبیاری لازم نیست.
|
||||
بارش مؤثر حدود ۷۰-۸۰ درصد بارش واقعی است (بخشی تبخیر و رواناب میشود).
|
||||
|
||||
## رطوبت خاک
|
||||
رطوبت مناسب خاک بسته به نوع خاک و محصول متفاوت است.
|
||||
خاک رسی رطوبت بیشتری نگه میدارد. خاک شنی سریعتر خشک میشود.
|
||||
آبیاری باید وقتی انجام شود که رطوبت خاک به حد بحرانی (MAD) رسیده باشد.
|
||||
|
||||
## دمای هوا و آبیاری
|
||||
در دماهای بالای ۳۵ درجه، تبخیر سطحی زیاد است و آبیاری صبح زود یا عصر توصیه میشود.
|
||||
در دماهای زیر ۵ درجه، آبیاری ممکن است به ریشه آسیب بزند.
|
||||
+26
-7
@@ -1,11 +1,14 @@
|
||||
# تنظیمات RAG برای پایگاه دانش CropLogic
|
||||
|
||||
embedding:
|
||||
provider: "avalai" # Avalai API (OpenAI-compatible)
|
||||
provider: "gapgpt" # gapgpt یا avalai
|
||||
model: "text-embedding-3-small"
|
||||
base_url: "https://api.avalai.ir/v1"
|
||||
api_key_env: "AVALAI_API_KEY"
|
||||
base_url: "https://api.gapgpt.app/v1"
|
||||
api_key_env: "GAPGPT_API_KEY"
|
||||
batch_size: 32
|
||||
# تنظیمات Avalai (برای fallback)
|
||||
avalai_base_url: "https://api.avalai.ir/v1"
|
||||
avalai_api_key_env: "AVALAI_API_KEY"
|
||||
|
||||
# فاز یک: Qdrant بهعنوان vector store
|
||||
qdrant:
|
||||
@@ -21,8 +24,24 @@ chunking:
|
||||
# تنظیمات مدل چت (LLM) — Avalai
|
||||
llm:
|
||||
model: "gpt-4o"
|
||||
base_url: "https://api.avalai.ir/v1"
|
||||
api_key_env: "AVALAI_API_KEY"
|
||||
base_url: "https://api.gapgpt.app/v1"
|
||||
api_key_env: "GAPGPT_API_KEY"
|
||||
avalai_base_url: "https://api.avalai.ir/v1"
|
||||
avalai_api_key_env: "AVALAI_API_KEY"
|
||||
|
||||
tone_file: "config/tone.txt"
|
||||
knowledge_base_path: "config/knowledge_base"
|
||||
# سه پایگاه دانش مجزا
|
||||
knowledge_bases:
|
||||
chat:
|
||||
path: "config/knowledge_base/chat"
|
||||
tone_file: "config/tones/chat_tone.txt"
|
||||
description: "پایگاه دانش عمومی برای چت با کاربران"
|
||||
|
||||
irrigation:
|
||||
path: "config/knowledge_base/irrigation"
|
||||
tone_file: "config/tones/irrigation_tone.txt"
|
||||
description: "پایگاه دانش توصیه آبیاری"
|
||||
|
||||
fertilization:
|
||||
path: "config/knowledge_base/fertilization"
|
||||
tone_file: "config/tones/fertilization_tone.txt"
|
||||
description: "پایگاه دانش توصیه کودهی"
|
||||
|
||||
+77
-1
@@ -6,6 +6,8 @@ from dotenv import load_dotenv
|
||||
load_dotenv()
|
||||
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
LOG_DIR = Path(os.environ.get("LOG_DIR", BASE_DIR / "logs"))
|
||||
LOG_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
SECRET_KEY = os.environ.get("SECRET_KEY", "django-insecure-dev-only")
|
||||
DEBUG = os.environ.get("DEBUG", "0") == "1"
|
||||
@@ -20,10 +22,15 @@ INSTALLED_APPS = [
|
||||
"django.contrib.staticfiles",
|
||||
"rest_framework",
|
||||
"corsheaders",
|
||||
"drf_spectacular",
|
||||
"drf_spectacular_sidecar",
|
||||
"rag",
|
||||
"tasks",
|
||||
"soil_data",
|
||||
"location_data",
|
||||
"sensor_data",
|
||||
"weather",
|
||||
"plant",
|
||||
"irrigation",
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
@@ -98,6 +105,25 @@ REST_FRAMEWORK = {
|
||||
"DEFAULT_PERMISSION_CLASSES": [
|
||||
"rest_framework.permissions.AllowAny",
|
||||
],
|
||||
"DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
|
||||
}
|
||||
|
||||
SPECTACULAR_SETTINGS = {
|
||||
"TITLE": "CropLogic AI API",
|
||||
"DESCRIPTION": "APIهای هوش مصنوعی CropLogic — داده خاک، سنسور، هواشناسی و چت RAG",
|
||||
"VERSION": "1.0.0",
|
||||
"SERVE_INCLUDE_SCHEMA": False,
|
||||
"SWAGGER_UI_DIST": "SIDECAR",
|
||||
"SWAGGER_UI_FAVICON_HREF": "SIDECAR",
|
||||
"REDOC_DIST": "SIDECAR",
|
||||
"COMPONENT_SPLIT_REQUEST": True,
|
||||
"TAGS": [
|
||||
{"name": "RAG Chat", "description": "چت هوشمند RAG"},
|
||||
{"name": "Tasks", "description": "مدیریت تسکهای Celery"},
|
||||
{"name": "Soil Data", "description": "دادههای خاک (SoilGrids)"},
|
||||
{"name": "Sensor Data", "description": "دادههای سنسور"},
|
||||
{"name": "Sensor Parameters", "description": "پارامترهای سنسور"},
|
||||
],
|
||||
}
|
||||
|
||||
CORS_ALLOW_ALL_ORIGINS = DEBUG
|
||||
@@ -114,4 +140,54 @@ CELERY_BEAT_SCHEDULE = {
|
||||
"task": "rag.tasks.rag_ingest_task",
|
||||
"schedule": 6 * 60 * 60, # ۶ ساعت
|
||||
},
|
||||
"weather-fetch-periodic": {
|
||||
"task": "weather.tasks.fetch_weather_all_locations_task",
|
||||
"schedule": 6 * 60 * 60, # ۶ ساعت
|
||||
},
|
||||
}
|
||||
|
||||
# Weather API
|
||||
WEATHER_API_BASE_URL = os.environ.get(
|
||||
"WEATHER_API_BASE_URL", "https://api.open-meteo.com/v1/forecast"
|
||||
)
|
||||
WEATHER_API_KEY = os.environ.get("WEATHER_API_KEY", "")
|
||||
|
||||
LOGGING = {
|
||||
"version": 1,
|
||||
"disable_existing_loggers": False,
|
||||
"formatters": {
|
||||
"standard": {
|
||||
"format": "%(asctime)s [%(levelname)s] %(name)s: %(message)s",
|
||||
},
|
||||
},
|
||||
"handlers": {
|
||||
"console": {
|
||||
"class": "logging.StreamHandler",
|
||||
"formatter": "standard",
|
||||
},
|
||||
"file": {
|
||||
"class": "logging.handlers.TimedRotatingFileHandler",
|
||||
"filename": str(LOG_DIR / "app.log"),
|
||||
"when": "midnight",
|
||||
"backupCount": 14,
|
||||
"encoding": "utf-8",
|
||||
"formatter": "standard",
|
||||
},
|
||||
},
|
||||
"loggers": {
|
||||
"django": {
|
||||
"handlers": ["console", "file"],
|
||||
"level": os.environ.get("DJANGO_LOG_LEVEL", "INFO"),
|
||||
"propagate": False,
|
||||
},
|
||||
"rag": {
|
||||
"handlers": ["console", "file"],
|
||||
"level": os.environ.get("RAG_LOG_LEVEL", "INFO"),
|
||||
"propagate": False,
|
||||
},
|
||||
},
|
||||
"root": {
|
||||
"handlers": ["console", "file"],
|
||||
"level": os.environ.get("ROOT_LOG_LEVEL", "INFO"),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
# فایل لحن / سبک پاسخهای RAG
|
||||
|
||||
لحن و سبک پاسخها:
|
||||
- سطح: دوستانه و تخصصی؛ با کشاورز به زبان ساده و علمی صحبت کن.
|
||||
- واژگان: از اصطلاحات رایج کشاورزی و خاکشناسی استفاده کن، در صورت نیاز معادل فارسی بیاور.
|
||||
- طول: پاسخها مختصر و کاربردی؛ در صورت لزوم با بولت یا شماره ساختاربندی کن.
|
||||
- هشدار: اگر موضوع ایمنی یا سلامتی گیاه/خاک باشد، صریحاً هشدار بده.
|
||||
@@ -0,0 +1,8 @@
|
||||
# لحن توصیه کودهی
|
||||
|
||||
سبک پاسخ:
|
||||
- تخصصی و دقیق: نوع کود، مقدار و زمان مصرف را مشخص کن
|
||||
- بر اساس دادههای NPK خاک، pH، و نوع محصول
|
||||
- فرمت خروجی: JSON با فیلدهای fertilizer_needed (bool), fertilizer_type (str), amount_kg_per_hectare (float), reason (str), npk_status (dict)
|
||||
- اگر سطح NPK خاک مناسب باشد، کودهی لازم نیست
|
||||
- هشدارهای مهم درباره مصرف بیش از حد کود را ذکر کن
|
||||
@@ -0,0 +1,8 @@
|
||||
# لحن توصیه آبیاری
|
||||
|
||||
سبک پاسخ:
|
||||
- مستقیم و عملیاتی: زمان، مقدار و روش آبیاری را مشخص کن
|
||||
- بر اساس دادههای هواشناسی (بارش، ET0، دما) و رطوبت خاک
|
||||
- فرمت خروجی: JSON با فیلدهای irrigation_needed (bool), amount_mm (float), reason (str), next_check_date (str)
|
||||
- اگر بارش پیشبینی شده باشد، آبیاری را به تعویق بینداز
|
||||
- اگر رطوبت خاک کافی است، آبیاری لازم نیست
|
||||
+13
-1
@@ -1,10 +1,22 @@
|
||||
from django.contrib import admin
|
||||
from django.urls import include, path
|
||||
from drf_spectacular.views import (
|
||||
SpectacularAPIView,
|
||||
SpectacularRedocView,
|
||||
SpectacularSwaggerView,
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
path("admin/", admin.site.urls),
|
||||
# --- OpenAPI / Swagger ---
|
||||
path("api/schema/", SpectacularAPIView.as_view(), name="schema"),
|
||||
path("api/docs/", SpectacularSwaggerView.as_view(url_name="schema"), name="swagger-ui"),
|
||||
path("api/redoc/", SpectacularRedocView.as_view(url_name="schema"), name="redoc"),
|
||||
# --- App APIs ---
|
||||
path("api/rag/", include("rag.urls")),
|
||||
path("api/tasks/", include("tasks.urls")),
|
||||
path("api/soil-data/", include("soil_data.urls")),
|
||||
path("api/soil-data/", include("location_data.urls")),
|
||||
path("api/sensor-data/", include("sensor_data.urls")),
|
||||
path("api/plants/", include("plant.urls")),
|
||||
path("api/irrigation/", include("irrigation.urls")),
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user