هوش مصنوعی در Android Studio؛ آموزش Gemini، Agent Mode و ساخت اپلیکیشن با API

در این آموزش، استفاده از Gemini و Agent Mode در Android Studio را یاد می‌گیرید و یک اپلیکیشن واقعی Kotlin و Jetpack Compose می‌سازید که از طریق Backend به API هوش مصنوعی درواره متصل می‌شود.

Share
هوش مصنوعی در Android Studio؛ آموزش Gemini، Agent Mode و ساخت اپلیکیشن با API

هوش مصنوعی در Android Studio می‌تواند بخش بزرگی از فرایند توسعه اپلیکیشن اندروید را سریع‌تر کند؛ از توضیح کدهای Kotlin و ساخت رابط کاربری Jetpack Compose تا تحلیل خطاهای Gradle، بررسی Logcat، تولید تست و اعمال تغییرات در چند فایل پروژه.

بااین‌حال، استفاده از هوش مصنوعی در برنامه‌نویسی اندروید دو مفهوم متفاوت دارد:

  1. استفاده از دستیار هوش مصنوعی داخل Android Studio برای کمک به برنامه‌نویس
  2. اضافه‌کردن قابلیت هوش مصنوعی به اپلیکیشن اندروید برای استفاده کاربران

در حالت اول، ابزارهایی مانند Gemini در Android Studio به شما در نوشتن، توضیح، اصلاح و دیباگ کد کمک می‌کنند. در حالت دوم، اپلیکیشن شما از طریق Backend و API به مدل‌های هوش مصنوعی متصل می‌شود و قابلیت‌هایی مانند گفت‌وگو، خلاصه‌سازی، تولید متن، تحلیل تصویر یا دستیار هوشمند را در اختیار کاربران قرار می‌دهد.

در این مقاله هر دو مسیر را به‌صورت عملی بررسی می‌کنیم. ابتدا Gemini و Agent Mode را در Android Studio راه‌اندازی می‌کنیم و سپس یک اپلیکیشن واقعی با Kotlin، Jetpack Compose، Retrofit، FastAPI و API هوش مصنوعی درواره می‌سازیم.

هوش مصنوعی در Android Studio چیست؟

Android Studio محیط رسمی توسعه اپلیکیشن اندروید است. قابلیت‌های هوش مصنوعی در این محیط می‌توانند به توسعه‌دهنده در مراحل مختلف برنامه‌نویسی کمک کنند.

Gemini در Android Studio به‌عنوان دستیار کدنویسی مخصوص توسعه اندروید ارائه شده و می‌تواند در کارهایی مانند پاسخ‌گویی به سؤالات فنی، تولید کد، پیشنهاد منابع، ساخت رابط Compose، رفع خطاهای Gradle، تحلیل Logcat و بررسی Crashها کمک کند. معرفی رسمی Gemini در Android Studio

کاربردهای مهم آن عبارت‌اند از:

  • توضیح کد Kotlin و Java
  • تولید قطعه‌کد
  • تکمیل کد
  • تبدیل و ریفکتور کد
  • ساخت Composable
  • پیشنهاد بهبود رابط کاربری
  • تحلیل خطاهای Build
  • بررسی Stack Trace
  • تحلیل Logcat
  • تولید سناریوهای تست
  • نوشتن مستندات
  • پیشنهاد نام بهتر برای متغیرها
  • اعمال تغییر در چند فایل با Agent Mode
  • کمک به اتصال سرویس‌ها و APIها

برخی قابلیت‌ها ممکن است به نسخه Android Studio، منطقه جغرافیایی، نوع حساب یا پلن استفاده‌شده وابسته باشند. قابلیت‌های Preview نیز ممکن است در نسخه‌های آینده تغییر کنند.

تفاوت Gemini در Android Studio با API هوش مصنوعی

این دو ابزار هدف متفاوتی دارند.

ویژگیGemini در Android StudioAPI هوش مصنوعی
کاربر اصلیتوسعه‌دهندهاپلیکیشن و کاربران آن
محل استفادهداخل محیط توسعهداخل Backend محصول
هدفکمک به کدنویسیافزودن قابلیت هوشمند به نرم‌افزار
تولید کدبلهدر صورت طراحی چنین قابلیتی
پاسخ‌گویی به کاربران اپخیربله
اتصال به رابط اپلیکیشنغیرمستقیمبله
نیاز به Backendبرای دستیار IDE خیرمعمولاً بله
مدیریت مصرف کاربرانخیردر Backend
انتخاب مدل‌های مختلفوابسته به ابزاراز طریق زیرساخت API

برای مثال، می‌توانید با Gemini صفحه چت را در Android Studio بسازید؛ اما پاسخ‌گویی هوشمند داخل همان صفحه باید از طریق یک مدل و API انجام شود.

Gemini در Android Studio چه قابلیت‌هایی دارد؟

قابلیت‌های دقیق با سرعت زیادی در حال توسعه‌اند. گوگل نیز توصیه می‌کند برای مشاهده امکانات جدید، Release Note نسخه پایدار و Preview را بررسی کنید. فهرست رسمی قابلیت‌های Gemini در Android Studio

گفت‌وگوی فنی

می‌توانید درباره پروژه، Android SDK، Kotlin، Compose، Gradle و معماری اپلیکیشن سؤال بپرسید:

تفاوت StateFlow و SharedFlow را در یک اپلیکیشن اندروید توضیح بده.
برای هرکدام یک کاربرد واقعی در ViewModel مثال بزن.

تکمیل و تولید کد

دستیار هوش مصنوعی می‌تواند تابع، کلاس، Composable، تست و بخش‌های تکراری کد را پیشنهاد دهد.

توضیح کد

می‌توانید یک بخش از کد را انتخاب کرده و درباره هدف، جریان اجرا یا مشکل احتمالی آن سؤال کنید.

ساخت رابط کاربری Compose

نمونه درخواست:

یک صفحه چت با Jetpack Compose و Material 3 بساز.

نیازمندی‌ها:
- پیام‌های کاربر سمت راست باشند.
- پیام‌های دستیار سمت چپ باشند.
- فهرست پیام‌ها LazyColumn باشد.
- پایین صفحه TextField و دکمه ارسال قرار بگیرد.
- هنگام دریافت پاسخ Loading نمایش داده شود.
- صفحه از Dark Mode پشتیبانی کند.

تحلیل خطاهای Gradle

می‌توانید پیام خطای Build را برای تشخیص ناسازگاری نسخه، Plugin، Dependency یا تنظیمات Gradle تحلیل کنید.

کمک به Logcat

با ارائه Context مناسب، دستیار می‌تواند Stack Trace و پیام‌های Logcat را تحلیل کند و علت‌های محتمل Crash را پیشنهاد دهد.

تولید تست

هوش مصنوعی می‌تواند Unit Test، تست ViewModel و سناریوهای رابط کاربری را پیشنهاد دهد؛ اما تست تولیدشده باید اجرا و بازبینی شود.

Agent Mode

Agent Mode برای وظایف چندمرحله‌ای طراحی شده است. توسعه‌دهنده هدف را توضیح می‌دهد و ایجنت می‌تواند برنامه‌ای برای انجام آن بسازد، ابزارهای لازم را فراخوانی کند، چند فایل را تغییر دهد و برای اصلاح خطاها تلاش کند. توسعه‌دهنده باید تغییرات پیشنهادی را بررسی و تأیید کند. راهنمای رسمی Agent Mode در Android Studio

پیش‌نیازهای این آموزش

برای ادامه مقاله به این موارد نیاز دارید:

  • نسخه به‌روز Android Studio
  • آشنایی مقدماتی با Kotlin
  • آشنایی اولیه با Jetpack Compose
  • دسترسی به اینترنت
  • حساب Google برای فعال‌سازی Gemini، در صورت دردسترس‌بودن
  • Python برای اجرای Backend نمونه
  • حساب و کلید API درواره
  • شناسه یکی از مدل‌های متنی درواره

برای ایجاد حساب و دریافت کلید به وب‌سایت درواره مراجعه کنید. فهرست مدل‌ها، Model ID و قیمت به‌روز آن‌ها در صفحه مدل‌های درواره قرار دارد.

در نمونه‌کدها از Placeholderهای زیر استفاده می‌کنیم:

YOUR_DARVAREH_API_KEY
YOUR_MODEL_ID

آن‌ها را با کلید و شناسه مدل واقعی خود جایگزین کنید.

نصب و فعال‌سازی Gemini در Android Studio

برای استفاده از قابلیت‌های جدید، ابتدا Android Studio را به نسخه مناسب ارتقا دهید.

مرحله اول: بررسی به‌روزرسانی

در ویندوز و لینوکس:

Help > Check for Updates

در macOS:

Android Studio > Check for Updates

نسخه‌های Preview را فقط زمانی نصب کنید که به قابلیت آزمایشی مشخصی نیاز دارید. برای پروژه‌های اصلی بهتر است نسخه پایدار را جدا از نسخه Preview نگه دارید.

مرحله دوم: بازکردن ابزار Gemini یا Agent

پس از بازکردن پروژه، پنجره ابزار مرتبط با Gemini یا Agent را از نوار ابزار انتخاب کنید. در برخی نسخه‌ها مسیر زیر نیز در دسترس است:

View > Tool Windows > Agent

مرحله سوم: ورود به حساب

در صورت نمایش درخواست، با حساب Google وارد شوید و مراحل فعال‌سازی را تکمیل کنید.

مرحله چهارم: بررسی دسترسی منطقه‌ای

دسترسی Gemini در Android Studio ممکن است براساس کشور، نسخه برنامه و شرایط سرویس متفاوت باشد. گوگل توصیه می‌کند برای دسترسی گسترده‌تر از آخرین نسخه Android Studio استفاده شود. صفحه رسمی دسترسی Gemini در Android Studio

اولین پرامپت در Android Studio

پروژه خود را باز کنید و در پنجره Gemini بنویسید:

ساختار این پروژه اندروید را توضیح بده.

به‌صورت مشخص بگو:
- نقطه شروع برنامه کجاست؟
- رابط کاربری با XML ساخته شده یا Compose؟
- ViewModelها کجا قرار دارند؟
- لایه دسترسی به داده کدام است؟
- چه کتابخانه‌های مهمی استفاده شده‌اند؟
- برای اجرای پروژه چه تنظیماتی لازم است؟

اگر به بخشی از پروژه دسترسی نداری، آن را حدس نزن.

اگر دستیار Context کافی نداشته باشد، ممکن است لازم باشد فایل‌ها یا کدهای مرتبط را به آن معرفی کنید.

پرامپت مناسب برای برنامه‌نویسی اندروید

یک پرامپت حرفه‌ای بهتر است این اجزا را داشته باشد:

  • نقش
  • هدف
  • نسخه‌ها
  • معماری
  • فایل‌های مرتبط
  • رفتار مورد انتظار
  • محدودیت‌ها
  • فرمت پاسخ

نمونه:

نقش:
تو یک توسعه‌دهنده ارشد Android و Kotlin هستی.

محیط فنی:
- Kotlin
- Jetpack Compose
- Material 3
- Coroutines
- StateFlow
- MVVM
- Retrofit
- Hilt

هدف:
می‌خواهم صفحه نمایش فهرست پیام‌ها را بسازم.

رفتار:
- پیام‌ها از ViewModel دریافت شوند.
- وضعیت UI شامل idle، loading، success و error باشد.
- با ارسال پیام جدید، فهرست به آخرین پیام Scroll شود.
- دکمه ارسال هنگام درخواست غیرفعال باشد.

محدودیت‌ها:
- Business Logic داخل Composable قرار نگیرد.
- کتابخانه جدید اضافه نشود.
- State فقط از ViewModel دریافت شود.
- کد با Dark Mode سازگار باشد.

ابتدا برنامه تغییر را توضیح بده.
سپس فقط فایل‌هایی را که باید ایجاد یا ویرایش شوند تولید کن.
در پایان تست‌های لازم را پیشنهاد بده.

استفاده از Gemini برای ساخت Jetpack Compose

Jetpack Compose ابزار مدرن پیشنهادی Android برای ساخت رابط کاربری Native است و از APIهای Kotlin و الگوی Declarative UI استفاده می‌کند. مستندات رسمی Jetpack Compose

نمونه درخواست برای ساخت کارت پیام:

یک Composable به نام MessageBubble بساز.

ورودی‌ها:
- text: String
- isUser: Boolean
- timestamp: String

رفتار:
- پیام کاربر سمت راست و پیام دستیار سمت چپ باشد.
- رنگ پس‌زمینه دو نوع پیام متفاوت باشد.
- عرض حباب حداکثر 80 درصد صفحه باشد.
- متن فارسی راست‌چین باشد.
- از MaterialTheme استفاده شود.
- Preview برای هر دو حالت اضافه شود.

کد احتمالی:

@Composable
fun MessageBubble(
    text: String,
    isUser: Boolean,
    timestamp: String,
    modifier: Modifier = Modifier
) {
    Row(
        modifier = modifier.fillMaxWidth(),
        horizontalArrangement = if (isUser) {
            Arrangement.End
        } else {
            Arrangement.Start
        }
    ) {
        Column(
            modifier = Modifier
                .fillMaxWidth(0.8f)
                .clip(RoundedCornerShape(16.dp))
                .background(
                    if (isUser) {
                        MaterialTheme.colorScheme.primaryContainer
                    } else {
                        MaterialTheme.colorScheme.surfaceVariant
                    }
                )
                .padding(12.dp)
        ) {
            Text(
                text = text,
                style = MaterialTheme.typography.bodyLarge,
                textAlign = TextAlign.Start,
                modifier = Modifier.fillMaxWidth()
            )

            Spacer(modifier = Modifier.height(4.dp))

            Text(
                text = timestamp,
                style = MaterialTheme.typography.labelSmall,
                color = MaterialTheme.colorScheme.onSurfaceVariant
            )
        }
    }
}

کد تولیدشده را از نظر Importها، رفتار RTL، Accessibility، Theme و نسخه Compose پروژه بررسی کنید.

دیباگ اپلیکیشن اندروید با هوش مصنوعی

برای تحلیل خطا فقط نگویید «برنامه Crash می‌کند». اطلاعات لازم را ارائه دهید.

قالب پرامپت دیباگ

این اپلیکیشن هنگام ارسال پیام Crash می‌کند.

محیط:
- Kotlin
- Android Studio
- Jetpack Compose
- Retrofit
- Coroutines
- minSdk: 26

رفتار مورد انتظار:
با لمس دکمه ارسال، درخواست شبکه اجرا و پاسخ در فهرست نمایش داده شود.

رفتار فعلی:
برنامه بلافاصله بسته می‌شود.

Stack Trace:
[LOGCAT_STACK_TRACE]

کد ViewModel:
[VIEWMODEL_CODE]

کد Composable:
[COMPOSABLE_CODE]

ابتدا:
1. علت اصلی را از Stack Trace پیدا کن.
2. خطاهای زنجیره‌ای را از علت اصلی جدا کن.
3. سه فرضیه را به ترتیب احتمال بنویس.
4. برای هر فرضیه یک روش آزمایش ارائه کن.
5. فقط حداقل تغییر لازم را پیشنهاد بده.

نکات مهم برای تحلیل Logcat

  • Stack Trace کامل مرتبط را ارسال کنید.
  • اولین خطی را که به Package پروژه اشاره می‌کند پیدا کنید.
  • نسخه Android و مدل دستگاه را مشخص کنید.
  • تفاوت Emulator و دستگاه واقعی را بررسی کنید.
  • ورودی‌ای را که باعث Crash شده ثبت کنید.
  • پس از اصلاح، همان سناریو را دوباره آزمایش کنید.

تحلیل خطاهای Gradle با Gemini

خطاهای Gradle معمولاً به یکی از این موارد مربوط‌اند:

  • ناسازگاری Gradle و Android Gradle Plugin
  • ناسازگاری Kotlin Plugin
  • Repository تعریف‌نشده
  • Dependency با نسخه نامناسب
  • Duplicate Class
  • مشکل Java Development Kit
  • تنظیم نادرست compileSdk
  • Cache معیوب
  • خطای فایل Version Catalog

پرامپت مناسب:

این خطای Gradle را تحلیل کن:

[GRADLE_ERROR]

نسخه‌ها:
- Android Studio:
- Gradle:
- Android Gradle Plugin:
- Kotlin:
- JDK:
- compileSdk:

فایل‌های مرتبط:
[libs.versions.toml]
[settings.gradle.kts]
[build.gradle.kts]

ابتدا ناسازگاری نسخه‌ها را بررسی کن.
فقط در صورتی پیشنهاد پاک‌کردن Cache بده که شواهدی برای آن وجود داشته باشد.
نسخه‌ها را بدون استناد به فایل‌های پروژه حدس نزن.

استفاده صحیح از Agent Mode

Agent Mode برای تغییرات بزرگ‌تر از یک تکمیل ساده مناسب است؛ مانند:

  • ساخت یک Feature کامل
  • تبدیل صفحه XML به Compose
  • افزودن Repository و ViewModel
  • اصلاح چند فایل مرتبط
  • اضافه‌کردن تست
  • رفع خطاهای Build پس از تغییر
  • اجرای کارهای چندمرحله‌ای

نمونه درخواست:

یک قابلیت History برای گفت‌وگوها اضافه کن.

نیازمندی‌ها:
- هر گفت‌وگو عنوان، زمان ایجاد و آخرین زمان ویرایش داشته باشد.
- پیام‌ها به گفت‌وگو وابسته باشند.
- اطلاعات با Room ذخیره شوند.
- صفحه فهرست گفت‌وگوها ساخته شود.
- امکان ایجاد و حذف گفت‌وگو وجود داشته باشد.
- معماری MVVM فعلی حفظ شود.
- Hilt و Coroutines موجود استفاده شوند.
- برای DAO و ViewModel تست اضافه شود.

قبل از تغییر:
1. ساختار فعلی را بررسی کن.
2. فایل‌های درگیر را فهرست کن.
3. برنامه اجرا را بنویس.
4. ابهام‌های مهم را سؤال کن.

تغییرات را مرحله‌ای انجام بده و بعد از هر مرحله Build را بررسی کن.

حتی در Agent Mode نیز باید Diff هر مرحله را بررسی کنید. دسترسی به ابزار و امکان اجرای فرمان به معنی درست‌بودن تمام تصمیم‌های عامل نیست.

چه کدی را نباید در پرامپت قرار دهیم؟

هنگام استفاده از دستیار آنلاین، اطلاعات زیر را بدون ضرورت ارسال نکنید:

  • API Key واقعی
  • فایل .env
  • رمز عبور
  • Private Key
  • Token دسترسی
  • اطلاعات شخصی کاربران
  • داده محرمانه سازمان
  • کد اختصاصی خارج از مجوز تیم
  • آدرس و رمز دیتابیس Production
  • فایل امضای اپلیکیشن
  • Keystore و رمز آن
  • اطلاعات پرداخت کاربران

طبق اطلاعیه رسمی، داده‌ای که صریحاً برای Gemini ارسال می‌کنید، مانند Prompt یا کد واردشده در آن، مشمول شیوه پردازش داده سرویس خواهد بود. پیش از استفاده سازمانی، تنظیمات و سیاست داده را بررسی کنید. اطلاعیه حریم خصوصی Gemini در Android Studio

ساخت اپلیکیشن هوش مصنوعی اندروید

اکنون یک اپلیکیشن چت ساده می‌سازیم که:

  1. پیام کاربر را دریافت می‌کند.
  2. پیام را به Backend ما می‌فرستد.
  3. Backend به API درواره متصل می‌شود.
  4. پاسخ مدل به اپلیکیشن بازمی‌گردد.
  5. پیام در رابط Jetpack Compose نمایش داده می‌شود.

چرا اپلیکیشن نباید مستقیماً به API درواره متصل شود؟

قرار‌دادن کلید API در اپلیکیشن Android امن نیست. حتی اگر کلید را در فایل Kotlin، BuildConfig یا Native Library قرار دهید، امکان استخراج آن از APK وجود دارد.

معماری پیشنهادی:

اپلیکیشن Android
        ↓
Backend اختصاصی شما
        ↓
API درواره
        ↓
مدل هوش مصنوعی

Backend باید مسئول این موارد باشد:

  • نگهداری کلید API
  • احراز هویت کاربران
  • محدودیت مصرف
  • اعتبارسنجی ورودی
  • ثبت میزان مصرف
  • مدیریت Timeout و Retry
  • انتخاب مدل
  • کنترل هزینه
  • فیلتر و آماده‌سازی پاسخ

بخش اول پروژه: ساخت Backend با FastAPI

در یک پوشه جداگانه محیط پایتون بسازید:

mkdir android-ai-backend
cd android-ai-backend
python -m venv .venv

فعال‌سازی در ویندوز:

.venv\Scripts\Activate.ps1

فعال‌سازی در لینوکس و macOS:

source .venv/bin/activate

نصب بسته‌ها:

pip install fastapi uvicorn openai python-dotenv

فایل .env:

DARVAREH_API_KEY=YOUR_DARVAREH_API_KEY
DARVAREH_MODEL=YOUR_MODEL_ID
DARVAREH_BASE_URL=https://api.darvareh.ir/v1

فایل .gitignore:

.env
.venv/
__pycache__/

فایل main.py:

import os

from dotenv import load_dotenv
from fastapi import FastAPI, HTTPException
from openai import (
    APIConnectionError,
    AuthenticationError,
    OpenAI,
    RateLimitError,
)
from pydantic import BaseModel, Field

load_dotenv()

api_key = os.getenv("DARVAREH_API_KEY")
model_id = os.getenv("DARVAREH_MODEL")
base_url = os.getenv(
    "DARVAREH_BASE_URL",
    "https://api.darvareh.ir/v1",
)

if not api_key:
    raise RuntimeError("DARVAREH_API_KEY is not configured.")

if not model_id:
    raise RuntimeError("DARVAREH_MODEL is not configured.")

client = OpenAI(
    api_key=api_key,
    base_url=base_url,
    timeout=30.0,
    max_retries=2,
)

app = FastAPI(
    title="Android AI Backend",
    version="1.0.0",
)


class ChatRequest(BaseModel):
    message: str = Field(
        min_length=1,
        max_length=4000,
    )


class ChatResponse(BaseModel):
    answer: str


@app.get("/health")
def health():
    return {"status": "ok"}


@app.post(
    "/chat",
    response_model=ChatResponse,
)
def chat(request: ChatRequest):
    try:
        response = client.chat.completions.create(
            model=model_id,
            messages=[
                {
                    "role": "system",
                    "content": (
                        "تو یک دستیار فارسی برای کاربران اپلیکیشن هستی. "
                        "پاسخ‌ها را روشن، دقیق و کاربردی بنویس. "
                        "اگر اطلاعات کافی وجود ندارد، آن را اعلام کن."
                    ),
                },
                {
                    "role": "user",
                    "content": request.message,
                },
            ],
            temperature=0.3,
            max_tokens=800,
        )

        answer = response.choices[0].message.content

        if not answer:
            raise HTTPException(
                status_code=502,
                detail="مدل پاسخ قابل استفاده‌ای تولید نکرد.",
            )

        return ChatResponse(answer=answer)

    except AuthenticationError:
        raise HTTPException(
            status_code=500,
            detail="تنظیمات سرویس هوش مصنوعی نامعتبر است.",
        )

    except RateLimitError:
        raise HTTPException(
            status_code=429,
            detail="تعداد درخواست‌ها بیش از حد مجاز است.",
        )

    except APIConnectionError:
        raise HTTPException(
            status_code=503,
            detail="ارتباط با سرویس هوش مصنوعی برقرار نشد.",
        )

اجرای Backend:

uvicorn main:app --reload --host 0.0.0.0 --port 8000

برای بررسی سلامت:

http://127.0.0.1:8000/health

مستندات:

http://127.0.0.1:8000/docs

بخش دوم: ایجاد پروژه Android

در Android Studio یک پروژه جدید بسازید:

New Project > Empty Activity

تنظیمات پیشنهادی:

Name: DarvarehAiApp
Language: Kotlin
UI: Jetpack Compose
Minimum SDK: API 26

پس از ساخته‌شدن پروژه، آن را یک‌بار اجرا کنید تا از تنظیم صحیح SDK و Emulator مطمئن شوید.

بخش سوم: افزودن Permission اینترنت

فایل زیر را باز کنید:

app/src/main/AndroidManifest.xml

Permission اینترنت را پیش از تگ application اضافه کنید:

<uses-permission android:name="android.permission.INTERNET" />

نمونه:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:theme="@style/Theme.DarvarehAiApp">

        <!-- Activities -->

    </application>

</manifest>

بخش چهارم: اضافه‌کردن Retrofit

در فایل Dependencyهای ماژول app، کتابخانه‌های Retrofit را اضافه کنید. نسخه‌ها را براساس ساختار پروژه و نسخه پایدار فعلی انتخاب کنید:

dependencies {
    implementation("com.squareup.retrofit2:retrofit:YOUR_VERSION")
    implementation("com.squareup.retrofit2:converter-gson:YOUR_VERSION")
}

به‌جای YOUR_VERSION از نسخه سازگار و تأییدشده پروژه استفاده کنید. سپس Gradle را Sync کنید.

اگر از Version Catalog استفاده می‌کنید، Dependencyها را در libs.versions.toml تعریف کنید.

بخش پنجم: ساخت مدل‌های شبکه

فایل ChatModels.kt:

data class ChatRequest(
    val message: String
)

data class ChatResponse(
    val answer: String
)

بخش ششم: تعریف Retrofit API

فایل ChatApi.kt:

import retrofit2.http.Body
import retrofit2.http.POST

interface ChatApi {

    @POST("chat")
    suspend fun sendMessage(
        @Body request: ChatRequest
    ): ChatResponse
}

بخش هفتم: ساخت Retrofit Client

در Android Emulator، آدرس 127.0.0.1 به خود Emulator اشاره می‌کند، نه کامپیوتر میزبان. برای اتصال به Backend کامپیوتر از آدرس زیر استفاده کنید:

http://10.0.2.2:8000/

فایل NetworkModule.kt:

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

object NetworkModule {

    private const val BASE_URL =
        "http://10.0.2.2:8000/"

    val chatApi: ChatApi by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(
                GsonConverterFactory.create()
            )
            .build()
            .create(ChatApi::class.java)
    }
}

برای دستگاه واقعی باید از IP شبکه کامپیوتر یا آدرس HTTPS سرور استفاده کنید.

اتصال HTTP محلی در محیط Development

نسخه‌های جدید Android به‌صورت پیش‌فرض ارتباط HTTP بدون TLS را محدود می‌کنند. فقط برای آزمایش محلی می‌توانید در تگ application این تنظیم را موقتاً اضافه کنید:

android:usesCleartextTraffic="true"

نمونه:

<application
    android:usesCleartextTraffic="true"
    ...>

این تنظیم برای نسخه Production پیشنهاد نمی‌شود. Backend واقعی باید از HTTPS استفاده کند و گزینه Cleartext حذف شود.

بخش هشتم: ساخت Repository

فایل ChatRepository.kt:

class ChatRepository(
    private val chatApi: ChatApi
) {
    suspend fun sendMessage(
        message: String
    ): Result<String> {
        return runCatching {
            chatApi.sendMessage(
                ChatRequest(message = message)
            ).answer
        }
    }
}

بخش نهم: تعریف مدل پیام

فایل ChatMessage.kt:

import java.util.UUID

data class ChatMessage(
    val id: String = UUID.randomUUID().toString(),
    val text: String,
    val isUser: Boolean
)

در پروژه واقعی بهتر است زمان پیام، وضعیت ارسال و شناسه گفت‌وگو نیز ذخیره شوند.

بخش دهم: ساخت وضعیت رابط کاربری

فایل ChatUiState.kt:

data class ChatUiState(
    val messages: List<ChatMessage> = emptyList(),
    val input: String = "",
    val isLoading: Boolean = false,
    val errorMessage: String? = null
)

بخش یازدهم: ساخت ViewModel

فایل ChatViewModel.kt:

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch

class ChatViewModel(
    private val repository: ChatRepository =
        ChatRepository(NetworkModule.chatApi)
) : ViewModel() {

    private val _uiState =
        MutableStateFlow(ChatUiState())

    val uiState: StateFlow<ChatUiState> =
        _uiState.asStateFlow()

    fun updateInput(value: String) {
        _uiState.update {
            it.copy(
                input = value,
                errorMessage = null
            )
        }
    }

    fun sendMessage() {
        val message = _uiState.value.input.trim()

        if (message.isEmpty()) {
            return
        }

        val userMessage = ChatMessage(
            text = message,
            isUser = true
        )

        _uiState.update {
            it.copy(
                messages = it.messages + userMessage,
                input = "",
                isLoading = true,
                errorMessage = null
            )
        }

        viewModelScope.launch {
            repository
                .sendMessage(message)
                .onSuccess { answer ->
                    val assistantMessage = ChatMessage(
                        text = answer,
                        isUser = false
                    )

                    _uiState.update {
                        it.copy(
                            messages =
                                it.messages + assistantMessage,
                            isLoading = false
                        )
                    }
                }
                .onFailure { error ->
                    _uiState.update {
                        it.copy(
                            isLoading = false,
                            errorMessage =
                                error.message
                                    ?: "خطایی رخ داد."
                        )
                    }
                }
        }
    }
}

برای پروژه Production بهتر است Dependency Injection با Hilt یا ابزار مشابه انجام شود تا ViewModel قابل تست‌تر باشد.

بخش دوازدهم: ساخت رابط Chat با Compose

فایل ChatScreen.kt:

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp

@Composable
fun ChatScreen(
    viewModel: ChatViewModel,
    modifier: Modifier = Modifier
) {
    val uiState by viewModel.uiState.collectAsState()

    Scaffold(
        modifier = modifier
            .fillMaxSize()
            .imePadding(),
        bottomBar = {
            MessageInput(
                value = uiState.input,
                isLoading = uiState.isLoading,
                onValueChange = viewModel::updateInput,
                onSend = viewModel::sendMessage
            )
        }
    ) { paddingValues ->
        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(paddingValues)
                .padding(horizontal = 12.dp)
        ) {
            LazyColumn(
                modifier = Modifier.weight(1f),
                verticalArrangement =
                    Arrangement.spacedBy(10.dp)
            ) {
                items(
                    items = uiState.messages,
                    key = { it.id }
                ) { message ->
                    MessageBubble(message = message)
                }

                if (uiState.isLoading) {
                    item {
                        Row(
                            modifier = Modifier
                                .fillMaxWidth()
                                .padding(12.dp),
                            verticalAlignment =
                                Alignment.CenterVertically
                        ) {
                            CircularProgressIndicator(
                                modifier = Modifier
                                    .width(20.dp)
                                    .height(20.dp)
                            )

                            Spacer(
                                modifier = Modifier.width(8.dp)
                            )

                            Text("در حال دریافت پاسخ...")
                        }
                    }
                }
            }

            uiState.errorMessage?.let { error ->
                Text(
                    text = error,
                    color = MaterialTheme
                        .colorScheme
                        .error,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(vertical = 8.dp)
                )
            }
        }
    }
}


@Composable
private fun MessageBubble(
    message: ChatMessage
) {
    Row(
        modifier = Modifier.fillMaxWidth(),
        horizontalArrangement = if (message.isUser) {
            Arrangement.End
        } else {
            Arrangement.Start
        }
    ) {
        Box(
            modifier = Modifier
                .fillMaxWidth(0.82f)
                .clip(RoundedCornerShape(16.dp))
                .background(
                    if (message.isUser) {
                        MaterialTheme
                            .colorScheme
                            .primaryContainer
                    } else {
                        MaterialTheme
                            .colorScheme
                            .surfaceVariant
                    }
                )
                .padding(12.dp)
        ) {
            Text(
                text = message.text,
                style = MaterialTheme
                    .typography
                    .bodyLarge,
                textAlign = TextAlign.Start
            )
        }
    }
}


@Composable
private fun MessageInput(
    value: String,
    isLoading: Boolean,
    onValueChange: (String) -> Unit,
    onSend: () -> Unit
) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .background(
                MaterialTheme.colorScheme.surface
            )
            .padding(12.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        OutlinedTextField(
            value = value,
            onValueChange = onValueChange,
            modifier = Modifier.weight(1f),
            placeholder = {
                Text("پیام خود را بنویسید...")
            },
            enabled = !isLoading,
            maxLines = 4
        )

        Spacer(modifier = Modifier.width(8.dp))

        Button(
            onClick = onSend,
            enabled = value.isNotBlank() && !isLoading
        ) {
            Text("ارسال")
        }
    }
}

بخش سیزدهم: نمایش صفحه در Activity

فایل MainActivity.kt:

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.lifecycle.viewmodel.compose.viewModel

class MainActivity : ComponentActivity() {

    override fun onCreate(
        savedInstanceState: Bundle?
    ) {
        super.onCreate(savedInstanceState)

        setContent {
            DarvarehAiAppTheme {
                val chatViewModel: ChatViewModel =
                    viewModel()

                ChatScreen(
                    viewModel = chatViewModel
                )
            }
        }
    }
}

نام Theme را با نام واقعی Theme پروژه خود هماهنگ کنید.

اجرای پروژه

ترتیب اجرا:

  1. Backend پایتون را اجرا کنید.
  2. آدرس http://127.0.0.1:8000/docs را آزمایش کنید.
  3. Emulator اندروید را اجرا کنید.
  4. پروژه Android را Build کنید.
  5. برنامه را باز کنید.
  6. یک پیام فارسی ارسال کنید.
  7. Logcat و Terminal Backend را برای خطا بررسی کنید.

خطاهای متداول اتصال Android به Backend

خطای Cleartext HTTP

نشانه:

Cleartext HTTP traffic not permitted

راه‌حل Development:

android:usesCleartextTraffic="true"

برای Production از HTTPS استفاده کنید.

استفاده اشتباه از localhost

در Emulator این آدرس معمولاً به Backend کامپیوتر متصل نمی‌شود:

http://127.0.0.1:8000/

از این آدرس استفاده کنید:

http://10.0.2.2:8000/

خطای Connection Refused

بررسی کنید:

  • Uvicorn در حال اجرا باشد.
  • Backend با --host 0.0.0.0 اجرا شده باشد.
  • پورت درست باشد.
  • Firewall اتصال را مسدود نکرده باشد.
  • آدرس Base URL به / ختم شود.

خطای 401 یا احراز هویت

این خطا باید در Backend بررسی شود؛ زیرا اپلیکیشن Android مستقیماً به درواره متصل نیست. صحت کلید API در فایل .env را بررسی کنید.

خطای مدل نامعتبر

مقدار زیر باید با Model ID واقعی جایگزین شود:

YOUR_MODEL_ID

شناسه مدل را از صفحه مدل‌های درواره دریافت کنید.

پاسخ طولانی یا کند

  • max_tokens را محدود کنید.
  • مدل مناسب‌تری انتخاب کنید.
  • Streaming را پیاده‌سازی کنید.
  • Timeout را تنظیم کنید.
  • تاریخچه غیرضروری را ارسال نکنید.

اضافه‌کردن تاریخچه مکالمه

مثال فعلی فقط آخرین پیام را برای Backend می‌فرستد. برای مکالمه چندمرحله‌ای باید تاریخچه مدیریت شود.

دو روش اصلی:

نگهداری تاریخچه در اپلیکیشن

اپلیکیشن فهرست پیام‌ها را برای Backend می‌فرستد.

مزایا:

  • پیاده‌سازی اولیه ساده
  • کنترل رابط در سمت اپ

معایب:

  • امکان دست‌کاری تاریخچه
  • افزایش حجم درخواست
  • دشواری همگام‌سازی چند دستگاه

نگهداری تاریخچه در Backend

اپلیکیشن فقط conversation_id و پیام جدید را ارسال می‌کند.

مزایا:

  • کنترل بهتر
  • امکان ذخیره در دیتابیس
  • مناسب برای چند دستگاه
  • مدیریت ساده‌تر محدودیت Context

برای یک محصول واقعی، ذخیره تاریخچه در Backend معمولاً معماری مناسب‌تری است.

اضافه‌کردن Streaming به اپلیکیشن

برای نمایش تدریجی پاسخ می‌توانید از یکی از این روش‌ها استفاده کنید:

  • Server-Sent Events
  • WebSocket
  • HTTP Streaming

جریان کلی:

  1. اپلیکیشن اتصال Streaming را باز می‌کند.
  2. Backend درخواست Streaming به API ارسال می‌کند.
  3. هر بخش پاسخ را دریافت می‌کند.
  4. Chunkها برای اپلیکیشن ارسال می‌شوند.
  5. ViewModel متن پیام دستیار را به‌تدریج به‌روزرسانی می‌کند.

Streaming تجربه کاربری را بهتر می‌کند، اما مدیریت قطع اتصال، Retry، تکمیل پیام و ذخیره نتیجه را پیچیده‌تر می‌سازد. بهتر است ابتدا نسخه عادی را کامل و سپس Streaming را اضافه کنید.

تست ViewModel

برای تست مناسب، Repository را به‌صورت Interface تعریف کنید:

interface ChatDataSource {
    suspend fun sendMessage(
        message: String
    ): Result<String>
}

سپس نسخه واقعی:

class ChatRepository(
    private val chatApi: ChatApi
) : ChatDataSource {

    override suspend fun sendMessage(
        message: String
    ): Result<String> {
        return runCatching {
            chatApi.sendMessage(
                ChatRequest(message)
            ).answer
        }
    }
}

نسخه Fake برای تست:

class FakeChatRepository : ChatDataSource {

    override suspend fun sendMessage(
        message: String
    ): Result<String> {
        return Result.success(
            "پاسخ آزمایشی"
        )
    }
}

سناریوهای تست:

  • پیام خالی ارسال نشود.
  • پیام کاربر فوراً به فهرست اضافه شود.
  • هنگام درخواست، Loading فعال شود.
  • پاسخ موفق به فهرست اضافه شود.
  • پس از پاسخ، Loading غیرفعال شود.
  • خطای شبکه در UI State قرار بگیرد.
  • هنگام Loading ارسال دوباره کنترل شود.

استفاده‌های عملی هوش مصنوعی در اپلیکیشن‌های اندروید

بعد از تکمیل پروژه پایه می‌توانید قابلیت‌های زیر را بسازید.

دستیار پشتیبانی

کاربر سؤال خود را در اپلیکیشن مطرح می‌کند و Backend براساس اطلاعات محصول پاسخ پیشنهادی تولید می‌کند.

خلاصه‌سازی متن

کاربر متن یا یادداشت خود را وارد می‌کند و نسخه کوتاه دریافت می‌کند.

بازنویسی متن فارسی

قابلیت‌هایی مانند:

  • رسمی‌کردن متن
  • کوتاه‌سازی
  • اصلاح نگارشی
  • تغییر لحن
  • تولید عنوان

استخراج اطلاعات

تبدیل متن آزاد به داده ساختاریافته:

{
  "title": "جلسه تیم محصول",
  "date": "2026-08-05",
  "priority": "high"
}

دستیار آموزشی

برنامه می‌تواند مفهوم را توضیح دهد، تمرین بسازد و پاسخ کاربر را تحلیل کند.

تولید توضیحات محصول

فروشنده مشخصات محصول را وارد می‌کند و توضیح کوتاه، مزایا و متن مناسب فروشگاه دریافت می‌کند.

تحلیل تصویر

در صورت انتخاب مدل دارای قابلیت Vision، اپلیکیشن می‌تواند تصویر را برای سناریوهای مجاز و کاربردی تحلیل کند. روش ارسال تصویر و محدودیت حجم به مدل و Endpoint انتخابی وابسته است.

انتخاب مدل مناسب

برای انتخاب مدل فقط به قدرت کلی آن توجه نکنید.

کاربردمعیار مهم
چت فارسیکیفیت فارسی و سرعت
تولید متن کوتاههزینه و زمان پاسخ
برنامه‌نویسیتوانایی Coding
استخراج JSONثبات و خروجی ساختاریافته
تحلیل تصویرپشتیبانی از Vision
مکالمه طولانیContext Window
اپلیکیشن پرترافیکقیمت، سرعت و پایداری
Tool Callingپشتیبانی مدل از ابزار

برای مشاهده مدل‌های در دسترس و قیمت به‌روز آن‌ها به صفحه مدل‌های درواره مراجعه کنید.

کنترل هزینه اپلیکیشن

در یک اپلیکیشن عمومی، کنترل هزینه باید در Backend انجام شود.

راهکارهای عملی:

  • محدودیت تعداد درخواست روزانه برای هر کاربر
  • محدودیت طول پیام
  • محدودیت طول پاسخ
  • ثبت مصرف براساس کاربر
  • انتخاب مدل اقتصادی برای کارهای ساده
  • Cache کردن درخواست‌های تکراری
  • حذف تاریخچه غیرضروری
  • خلاصه‌سازی مکالمات طولانی
  • جلوگیری از ارسال هم‌زمان چند درخواست
  • Timeout و Retry محدود
  • بودجه کلی روزانه و ماهانه
  • غیرفعال‌کردن موقت قابلیت پس از عبور از بودجه

محدودیت فقط در اپلیکیشن Android کافی نیست؛ زیرا کاربر می‌تواند Client را تغییر دهد. کنترل اصلی باید روی سرور انجام شود.

چک‌لیست انتشار اپلیکیشن هوش مصنوعی

پیش از انتشار بررسی کنید:

اپلیکیشن Android

  • کلید API داخل APK وجود نداشته باشد.
  • Base URL مربوط به Production باشد.
  • ارتباط Backend از HTTPS استفاده کند.
  • Cleartext Traffic غیرفعال باشد.
  • وضعیت Loading و Error کامل باشد.
  • قطع اینترنت مدیریت شود.
  • ارسال تکراری کنترل شود.
  • متن‌های طولانی رابط را خراب نکنند.
  • Dark Mode آزمایش شود.
  • RTL و زبان فارسی بررسی شود.
  • Accessibility رعایت شود.

Backend

  • کلید در متغیر محیطی باشد.
  • کاربران احراز هویت شوند.
  • محدودیت نرخ تعریف شده باشد.
  • طول ورودی محدود شود.
  • Timeout و Retry کنترل شوند.
  • مصرف ثبت شود.
  • پاسخ خالی مدیریت شود.
  • مدل از تنظیمات انتخاب شود.
  • خطاهای داخلی برای کاربر افشا نشوند.
  • Logها شامل کلید یا داده حساس نباشند.

مدل و پرامپت

  • Prompt نسخه‌بندی شود.
  • پاسخ‌های نادرست آزمایش شوند.
  • ورودی‌های مبهم بررسی شوند.
  • طول پاسخ کنترل شود.
  • مدل متناسب با کاربرد انتخاب شود.
  • کیفیت فارسی روی نمونه‌های واقعی سنجیده شود.
  • خروجی ساختاریافته اعتبارسنجی شود.

اشتباهات رایج

قراردادن کلید در BuildConfig

BuildConfig محل امنی برای Secret دائمی نیست؛ زیرا مقدار آن در برنامه نهایی قرار می‌گیرد و می‌تواند استخراج شود.

اتصال مستقیم اپلیکیشن به API مدل

این کار کنترل مصرف و حفاظت از کلید را دشوار می‌کند. از Backend استفاده کنید.

دادن یک وظیفه بسیار بزرگ به Agent Mode

قابلیت را به مراحل کوچک تقسیم کنید و پس از هر مرحله Diff و Build را بررسی کنید.

پذیرش کد بدون بررسی نسخه‌ها

کد تولیدشده ممکن است با نسخه Compose، Kotlin یا Gradle پروژه سازگار نباشد.

قرار‌دادن Business Logic داخل Composable

Composable باید بیشتر مسئول نمایش وضعیت و دریافت Event باشد. منطق اصلی را در ViewModel و Service نگه دارید.

نداشتن UI State مشخص

به‌جای چند Boolean پراکنده، وضعیت‌هایی مانند Loading، Success و Error را به‌شکل قابل پیش‌بینی مدیریت کنید.

ارسال تمام تاریخچه بدون محدودیت

این کار زمان پاسخ و هزینه را افزایش می‌دهد. تاریخچه را محدود یا خلاصه کنید.

اجرای Retry در چند لایه

اگر Retrofit، Repository، Backend و SDK هم‌زمان Retry کنند، یک درخواست ممکن است چندین بار تکرار شود. سیاست Retry را آگاهانه طراحی کنید.

پرسش‌های متداول

Gemini در Android Studio چیست؟

Gemini دستیار هوش مصنوعی مخصوص توسعه اندروید است که می‌تواند درباره کد پاسخ دهد، کد تولید و توضیح کند، رابط Compose بسازد و در تحلیل خطاهای Build، Logcat و Crash کمک کند.

چگونه هوش مصنوعی را در Android Studio فعال کنیم؟

Android Studio را به‌روز کنید، پروژه را باز کنید و پنجره Gemini یا Agent را از Tool Window انتخاب کنید. سپس در صورت نیاز با حساب Google وارد شوید. دسترسی می‌تواند به نسخه، منطقه یا نوع حساب وابسته باشد.

Agent Mode در Android Studio چیست؟

Agent Mode برای وظایف چندمرحله‌ای طراحی شده است و می‌تواند برنامه اجرا بسازد، چند فایل را تغییر دهد و برای اصلاح خطاها تلاش کند. تغییرات آن باید توسط توسعه‌دهنده بررسی و تأیید شوند.

آیا Gemini در Android Studio رایگان است؟

نوع دسترسی، سقف استفاده و قابلیت‌ها ممکن است به پلن، حساب، منطقه و نسخه Android Studio وابسته باشد. برای اطلاعات به‌روز باید صفحه رسمی مقایسه پلن‌ها را بررسی کنید.

آیا Gemini می‌تواند اپلیکیشن کامل بسازد؟

می‌تواند در ساخت بخش‌های مختلف کمک کند، اما طراحی محصول، معماری، بررسی کد، تست و انتشار همچنان به توسعه‌دهنده نیاز دارند. پروژه را به وظایف کوچک و قابل ارزیابی تقسیم کنید.

آیا می‌توان با Android Studio اپلیکیشن هوش مصنوعی ساخت؟

بله. رابط اپ با Kotlin و Compose ساخته می‌شود و Backend از طریق API به مدل هوش مصنوعی متصل خواهد شد.

آیا باید API Key را در اپلیکیشن Android قرار دهیم؟

خیر. API Key باید فقط در Backend و متغیر محیطی نگهداری شود. اپلیکیشن Android به Backend اختصاصی شما درخواست می‌فرستد.

API درواره چه Base URL دارد؟

آدرس پایه API درواره:

https://api.darvareh.ir/v1

این آدرس در Backend تنظیم می‌شود، نه در اپلیکیشن منتشرشده همراه با کلید محرمانه.

شناسه مدل را از کجا دریافت کنیم؟

فهرست مدل‌ها، Model ID و اطلاعات قیمت در صفحه مدل‌های درواره قرار دارد.

چرا در Emulator نمی‌توانم به localhost متصل شوم؟

در Emulator، localhost به خود دستگاه مجازی اشاره می‌کند. برای دسترسی به کامپیوتر میزبان معمولاً از این آدرس استفاده کنید:

http://10.0.2.2:8000/

چرا خطای Cleartext HTTP دریافت می‌کنم؟

Android ارتباط HTTP بدون TLS را محدود می‌کند. برای آزمایش محلی می‌توان موقتاً Cleartext را فعال کرد، اما در Production باید از HTTPS استفاده شود.

آیا می‌توان پاسخ را به‌صورت Streaming نمایش داد؟

بله. Backend می‌تواند پاسخ را با SSE، WebSocket یا HTTP Streaming برای اپلیکیشن ارسال کند و ViewModel متن را به‌تدریج به‌روزرسانی کند.

آیا Jetpack Compose برای ساخت رابط چت مناسب است؟

بله. با LazyColumn، مدیریت State، Material 3 و Coroutines می‌توان رابط چت واکنش‌گرا ایجاد کرد. Compose ابزار مدرن پیشنهادی Android برای رابط Native است.

چگونه هزینه اپلیکیشن هوش مصنوعی را کنترل کنیم؟

محدودیت تعداد درخواست، محدودیت طول پیام، انتخاب مدل مناسب، ثبت مصرف، کنترل تاریخچه، Cache و بودجه‌بندی را در Backend پیاده‌سازی کنید.

جمع‌بندی

هوش مصنوعی در Android Studio دو فرصت مهم ایجاد می‌کند:

  • افزایش سرعت و کیفیت فرایند توسعه اپلیکیشن
  • افزودن قابلیت‌های هوشمند به خود اپلیکیشن

Gemini و Agent Mode می‌توانند در توضیح کد، ساخت Compose UI، رفع خطاهای Gradle، تحلیل Logcat، تولید تست و ویرایش چند فایل کمک کنند. بااین‌حال، کد تولیدشده باید اجرا، تست و بازبینی شود.

برای ارائه قابلیت هوش مصنوعی به کاربران اپلیکیشن نیز معماری مناسب شامل Android، Backend اختصاصی و API مدل است. کلید API نباید در APK قرار بگیرد و تمام کنترل‌های مصرف، مدل، هزینه و خطا باید در Backend انجام شوند.

در پروژه عملی این مقاله، یک اپلیکیشن Kotlin و Jetpack Compose ساختیم که از طریق Retrofit به Backend مبتنی بر FastAPI متصل می‌شود و Backend پاسخ را با استفاده از API هوش مصنوعی درواره دریافت می‌کند.

برای اجرای پروژه، در درواره ثبت‌نام کنید، کلید API بسازید و یک مدل مناسب را از صفحه مدل‌ها و قیمت‌ها انتخاب کنید.

مقالات مرتبط

برای مطالعه شرایط استفاده و محدودیت‌های مسئولیت، صفحه «سلب مسئولیت» را مشاهده کنید.

Read more

اتوماسیون هوش مصنوعی چیست؟ کاربردها و آموزش ساخت AI Automation

اتوماسیون هوش مصنوعی چیست؟ کاربردها و آموزش ساخت AI Automation

اتوماسیون هوش مصنوعی با ترکیب گردش‌کارهای خودکار و مدل‌های هوش مصنوعی، پردازش متن، دسته‌بندی، استخراج اطلاعات و تصمیم‌های پیشنهادی را خودکار می‌کند. در این راهنما، معماری و ساخت نمونه عملی آن با API درواره را می‌آموزید.

Agentic Commerce چیست؟ آینده خرید با ایجنت هوش مصنوعی

Agentic Commerce چیست؟ آینده خرید با ایجنت هوش مصنوعی

Agentic Commerce شیوه‌ای جدید برای خرید اینترنتی است که در آن ایجنت هوش مصنوعی می‌تواند نیاز کاربر را بفهمد، محصولات را جست‌وجو و مقایسه کند و فرایند خرید را پیش ببرد. در این راهنما با معماری، UCP، ACP و پیاده‌سازی آن با API درواره آشنا می‌شوید.