Character AI অ্যাপ কীভাবে বানাবেন: architecture, code, এবং cost হিসাব

Updated 2026-07-15

একটি character AI অ্যাপ একটি OpenAI-compatible chat endpoint-এর সাথে যুক্ত চারটি component: একটি persona system prompt, একটি memory layer, একটি moderation gate, এবং একটি model router। আপনি 200 লাইনের কম Python-এ একটি কার্যকরী prototype ship করতে পারেন এবং সঠিক model বেছে নিলে প্রতি মাসিক active user-এ এক ডলারের অনেক নিচে চালাতে পারেন।

দ্রুত উত্তর: চার-component architecture

কোনো model train বা fine-tune করার দরকার নেই। আজকের বাজারে প্রতিটি গুরুত্বপূর্ণ companion অ্যাপ, লক্ষ লক্ষ ব্যবহারকারীর সেবা দেওয়া গুলো সহ, hosted LLM API-এর উপর একটি পাতলা orchestration layer মাত্র। Character বাস করে prompt এবং database-এ, weight-এ নয়। এই গাইডের বাকি অংশ একটি standard OpenAI-compatible endpoint-এর বিপরীতে চলা code দিয়ে প্রতিটি component বানায়, তারপর token গণিত walk করে যাতে launch করার আগে আপনি জানেন একজন monthly active user-এর আসলে কত খরচ হয়।

  • Persona prompt: একটি structured system prompt (500 থেকে 1,000 token) যা define করে character কে এবং কীভাবে কথা বলে।
  • Memory: সাম্প্রতিক turn-এর একটি rolling window প্লাস নিয়মিত refresh হওয়া একটি summary, যাতে conversation context limit পার হয়েও টিকে থাকে।
  • Moderation: একটি age gate, একটি input classifier, এবং আপনি যে model-এ route করেন তার সাথে মিলিয়ে content policy।
  • Routing: একটি ছোট function যা casual chat-এর জন্য একটি সস্তা model এবং দীর্ঘ scene-এর জন্য একটি শক্তিশালী model বেছে নেয়।

Component 1: persona prompt

Persona prompt-ই হলো product। এটা একটি system message যা প্রতিটি request-এর সাথে ship হয় এবং typically পাঁচটি অংশ ধারণ করে: identity (name, age, backstory), personality trait, দুই বা তিনটি উদাহরণ লাইন সহ speech style, hard behavioral rule (কখনো character ভাঙবেন না, reply length cap-এর নিচে রাখুন), এবং বর্তমান scenario। 500 থেকে 1,000 token-এর মধ্যে রাখুন। ছোট persona drift করে; অনেক দীর্ঘগুলো প্রতিটি একক message-এ input budget পোড়ায় এবং খুব কমই adherence উন্নত করে। Persona-কে আপনার database-এ row হিসেবে সংরক্ষণ করুন যাতে ব্যবহারকারীরা character তৈরি ও edit করতে পারে, যা Character.AI-স্টাইল product-এর মূল loop। এখানে একটি সম্পূর্ণ request। একই shape যেকোনো OpenAI-compatible backend-এ কাজ করে; এই উদাহরণটি একটি multi-model gateway endpoint ব্যবহার করে যাতে আপনি একটি string বদলে model বদলাতে পারেন:

curl https://api.apisrouter.com/v1/chat/completions \
  -H "Authorization: Bearer $KEAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4-flash",
    "messages": [
      {"role": "system", "content": "You are Mira, a sarcastic starship engineer in her 30s. Personality: dry wit, fiercely loyal, hates small talk. Speech style: short technical sentences, occasional teasing. Example: \"The coupling is fried. Again. Did you touch it?\" Rules: never break character, never mention being an AI, keep replies under 120 words."},
      {"role": "user", "content": "Mira, the reactor is making that noise again."}
    ],
    "temperature": 0.9,
    "max_tokens": 300,
    "stream": true
  }'

Component 2: memory যা দীর্ঘ conversation-এও টিকে থাকে

Companion অ্যাপ session দীর্ঘ চলে। একটি তিন-layer memory stack প্রতিবার পুরো history না পাঠিয়েও context coherent রাখে: Layer 1 হলো rolling window: শেষ 10 থেকে 14টি raw turn, verbatim পাঠানো। Layer 2 হলো running summary: প্রতি প্রায় 20 turn-এ, একটি সস্তা model পুরনো message-কে একটি প্যারাগ্রাফে compress করে যা name, relationship state, এবং open plot thread track করে। Layer 3 হলো pinned fact: টেকসই user detail (name, preference, character-এর মনে রাখা উচিত এমন অতীত ঘটনা) আপনার database-এ extract করা এবং একটি ছোট system message হিসেবে inject করা। এটাই official OpenAI SDK দিয়ে Python-এ পুরো implementation:

একটি বাস্তবসম্মত প্রতি-request input budget প্রায় 3,300 token-এ থাকে।
Context slotসাধারণ আকারRefresh হওয়ার হার
Persona system prompt500 থেকে 1,000 tokenপ্রতি character-এর জন্য স্থির
Pinned user fact100 থেকে 200 tokenExtraction event-এ
Running summary300 থেকে 500 tokenপ্রতি ~20 turn-এ
Rolling window (12 turn)~1,800 থেকে 2,200 tokenপ্রতি message-এ
নতুন user message~100 tokenপ্রতি message-এ
from openai import OpenAI

client = OpenAI(
    api_key="sk-...",
    base_url="https://api.apisrouter.com/v1",
)

def build_context(persona, summary, pinned_facts, recent_turns, user_msg):
    facts = "\n".join(f"- {f}" for f in pinned_facts)
    return [
        {"role": "system", "content": persona},
        *([{"role": "system", "content": f"Facts to remember:\n{facts}"}]
          if pinned_facts else []),
        *([{"role": "system", "content": f"Story so far: {summary}"}]
          if summary else []),
        *recent_turns[-12:],
        {"role": "user", "content": user_msg},
    ]

def refresh_summary(old_turns, prev_summary):
    prompt = (
        "Update this running summary of a roleplay chat. Keep names, "
        "relationship state, and open plot threads. Max 150 words.\n\n"
        f"Current summary: {prev_summary}\n\nNew messages: {old_turns}"
    )
    resp = client.chat.completions.create(
        model="deepseek-v4-flash",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=400,
    )
    return resp.choices[0].message.content

Component 3: moderation এবং content policy

একটি companion অ্যাপে moderation-এর তিনটি স্বতন্ত্র কাজ আছে, এবং সেগুলো গুলিয়ে ফেলা সবচেয়ে সাধারণ launch ভুল। প্রথমত, আপনার audience gate করুন। আপনার অ্যাপ mature fictional theme অনুমতি দিলে, সেগুলোকে একটি adult age gate-এর পেছনে রাখুন এবং একটি আলাদা all-ages default রাখুন। App Store এবং Play Store review দুটোই এটা চেক করে, এবং payment processor-ও এটা নিয়ে চিন্তা করে। দ্বিতীয়ত, input screen করুন। User message character model-এ পৌঁছানোর আগে একটি সস্তা classifier pass চালান, এমন category block করুন যা কোনো provider অনুমতি দেয় না: নাবালক জড়িত content, credible real-world harm, এবং illegal instruction। একটি yes/no rubric সহ একটি single deepseek-v4-flash call এক সেন্টের একটি ভগ্নাংশ খরচ করে এবং এক সেকেন্ডের কম latency যোগ করে। তৃতীয়ত, content policy model-এর সাথে মেলান। Fiction নিয়ে provider-রা ভিন্ন: xAI-এর প্রকাশিত policy স্পষ্টভাবে প্রাপ্তবয়স্ক ব্যবহারকারীদের জন্য mature fictional theme অনুমতি দেয়, DeepSeek এবং অন্যান্য open-weight-derived model roleplay-এর জন্য community favorite কারণ তাদের hosted policy fiction-এর জন্য নমনীয়, আর Anthropic-এর policy explicit content নিষিদ্ধ করে, যা Claude-কে শুধু all-ages creative writing-এর জন্যই সঠিক choice বানায়। Traffic route করার আগে এই policy বোঝা production-এ refusal storm থেকে বাঁচায়। আপনি যাই বানান না কেন, এটাকে আপনি যেসব provider-কে কল করেন তাদের প্রতিটির terms of service মেনে চলতে হবে।

Component 4: model routing এবং selection matrix

একটি companion অ্যাপে বেশিরভাগ message ছোট casual turn যা একটি budget model নিখুঁতভাবে সামলায়। সংখ্যালঘু হলো দীর্ঘ emotional scene বা creative set piece যেখানে prose quality-ই product। Scene-এর গভীরতা অনুযায়ী route করা ব্যবহারকারীদের কিছু টের না পাইয়েই খরচ নাটকীয়ভাবে কমিয়ে দেয়:

প্রতিটি route-কে এমন model-এর সাথে মেলান যার content policy সেই audience-এর সাথে ফিট করে।
ModelAPI model IDপ্রতি 1M token rate (in/out)Companion অ্যাপে ফিট
DeepSeek V4 Flashdeepseek-v4-flash$0.126 / $0.252Default chat model। Roleplay-এর জন্য community favorite, catalog-এ সেরা value।
DeepSeek V4 Prodeepseek-v4-pro$0.3915 / $0.783দীর্ঘ scene, শক্তিশালী instruction following, তবু সস্তা।
GLM-5glm-5$0.514 / $2.314শক্তিশালী creative writing-সহ value pick।
Kimi K2.6kimi-k2.6/pricing দেখুনLong-context session-এর জন্য value pick। MiMo একটি অনুরূপ বাজেট option।
grok-4.5grok-4.5$1.60 / $4.80xAI-এর প্রকাশিত policy অনুযায়ী প্রাপ্তবয়স্ক ব্যবহারকারীদের জন্য mature fictional theme। 500K context window।
Claude Sonnet 4.6claude-sonnet-4-6$2.40 / $12.00সর্বোচ্চ prose quality। শুধু all-ages creative writing; Anthropic explicit content নিষিদ্ধ করে।
Gemini 3.5 Flashgemini-3.5-flash$1.20 / $7.20দ্রুত, avatar reaction-এর মতো image-aware feature-এর জন্য ভালো।
ROUTES = {
    "casual": "deepseek-v4-flash",
    "scene": "deepseek-v4-pro",
    "prose": "claude-sonnet-4-6",  # all-ages creative writing only
}

def pick_model(user_msg: str, turns_in_scene: int) -> str:
    if turns_in_scene > 6 or len(user_msg) > 400:
        return ROUTES["scene"]
    return ROUTES["casual"]

একজন monthly active user-এর আসলে কত খরচ হয়

Launch-এর আগে token গণিত billing surprise-এর চেয়ে ভালো। Memory table-এর context budget ব্যবহার করে: প্রতি message প্রায় 3,300 input token এবং 250 output token। Companion অ্যাপ ব্যবহারকারীরা ভারী; community-reported figure engaged ব্যবহারকারীদের দিনে কয়েক ডজন message-এ রাখে, তাই ধরে নিন 20টি active দিনে দিনে প্রায় 40টি message, বা প্রতি MAU প্রতি মাসে প্রায় 800টি message। এটা দেয় প্রতি MAU প্রতি মাসে 2.64M input token এবং 0.2M output token। Catalog rate দিয়ে গুণ করলে:

প্রতি message 3,300 input + 250 output token ধরা হয়েছে, প্রতি MAU প্রতি মাসে ~800টি message।
Modelপ্রতি-MAU input costপ্রতি-MAU output costপ্রতি-MAU/মাসে মোট
deepseek-v4-flash$0.33$0.05$0.38
deepseek-v4-pro$1.03$0.16$1.19
glm-5$1.36$0.46$1.82
gemini-3.5-flash$3.17$1.44$4.61
grok-4.5$4.22$0.96$5.18
claude-sonnet-4-6$6.34$2.40$8.74
gpt-5.5$10.56$4.80$15.36

Matrix-এর প্রতিটি model-এর জন্য একটি endpoint

একটি router চালাতে পাঁচটি provider account-এ sign up করা বাস্তব overhead: পাঁচটি key, পাঁচটি billing dashboard, পাঁচ সেট rate limit। একটি multi-model gateway সেটা এক করে দেয়। APIsRouter উপরের প্রতিটি model একটিমাত্র OpenAI-compatible base URL https://api.apisrouter.com/v1-এ expose করে, তাই router snippet শুধু model string বদলেই যেমন আছে তেমনই কাজ করে। Billing কোনো subscription ছাড়া pay-as-you-go, global model official pricing-এর 20% নিচে চলে আর Chinese model official rate-এর নিচে, এবং /topup-এর no-signup checkout পেমেন্টের পর আপনার ইমেইলে একটি key পাঠায়, সাথে প্রথম top-up-এ +100% balance যোগ করে। আপনার key দিয়ে GET /v1/models লাইভ model list ফেরত দেয়, যা আপনার নিজের admin UI-তে একটি model picker ভরতেও কাজে লাগে।

প্রোডাকশন টিপস যা বাস্তব টাকা এবং যন্ত্রণা বাঁচায়

  • সবকিছু stream করুন। Time-to-first-token সেই metric যা ব্যবহারকারীরা টের পায়; 2 সেকেন্ডে stream হওয়া reply 4 সেকেন্ডে সম্পূর্ণ reply-এর চেয়ে দ্রুত মনে হয়।
  • Stable prefix stable রাখুন। Persona এবং pinned fact request জুড়ে byte-identical হওয়া উচিত যাতে prefix caching সমর্থন করা backend সেটা কাজে লাগাতে পারে।
  • প্রতি route-এ max_tokens cap করুন। Casual turn-এ কমই 300 output token-এর বেশি লাগে; একটি uncapped model যা বকবক করে তা আপনার output বিল দ্বিগুণ করে দেয়।
  • শুধু প্রতি request নয়, প্রতি user cost log করুন। ভারী ব্যবহারকারীদের একটি ছোট অংশ spend-এ প্রাধান্য পাবে; ন্যায্য usage tier design করতে আপনাকে তাদের দেখতে হবে।
  • Router-এ fallback বানান। Primary model timeout বা refuse করলে, error দেখানোর আগে একটি sibling model-এ একবার retry করুন।
  • Turn নয়, token দিয়ে rolling window trim করুন যাতে একটি দীর্ঘ paste budget উড়িয়ে না দেয়।
  • Refusal-কে character-এর মধ্যেই handle করুন। raw API text দেখানোর বদলে refusal-কে একটি graceful in-story deflection-এ map করুন।
  • যতটা দরকার তার চেয়ে বেশি raw chat store করবেন না, এবং আপনার privacy policy-তে তা বলুন। Companion chat log স্বভাবগতভাবে sensitive।

সাধারণ প্রশ্ন

একটি character AI অ্যাপ বানাতে কত খরচ হয়?

Development খরচ বেশিরভাগই আপনার সময়: কোনো model training জড়িত না থাকায় একটি কার্যকরী prototype একটি weekend project। Running cost হলো আসল সংখ্যা, এবং এটা usage-এর সাথে scale করে। deepseek-v4-flash-এর মতো একটি budget model-এ, একজন ভারী monthly active user token-এ প্রায় $0.38 খরচ করে; gpt-5.5-এর মতো একটি premium model-এ একই user প্রায় $15 খরচ করে। Infrastructure নয়, model choice আপনার margin ঠিক করে।

একটি character AI অ্যাপের জন্য কোন AI model সেরা?

DeepSeek V4 family roleplay-এর জন্য community favorite এবং সেরা value: casual chat-এর জন্য Flash, দীর্ঘ scene-এর জন্য Pro। GLM-5, Kimi K2.6, এবং MiMo শক্ত value pick। xAI-এর প্রকাশিত policy অনুযায়ী Grok প্রাপ্তবয়স্কদের mature fictional theme সেবা দেওয়া অ্যাপের সাথে ফিট করে। Claude Sonnet 4.6 সেরা prose লেখে কিন্তু শুধু all-ages creative writing-এর জন্যই উপযুক্ত কারণ Anthropic explicit content নিষিদ্ধ করে।

Character AI অ্যাপ কীভাবে অতীত conversation মনে রাখে?

Model memory দিয়ে নয়, prompt engineering দিয়ে। অ্যাপ সাম্প্রতিক message-এর একটি rolling window, পুরনো গুলোর একটি নিয়মিত compress করা summary, এবং database-এ extract করা pinned fact-এর একটি ছোট তালিকা আবার পাঠায়। Model নিজে stateless; প্রতিটি request-এ character যা "মনে রাখে" তার সবকিছু থাকে।

একটি AI companion অ্যাপ বানাতে কি নিজের model train করতে হবে?

না। Fine-tuning ব্যয়বহুল, iterate করতে ধীর, এবং character consistency-র জন্য অপ্রয়োজনীয়। 500 থেকে 1,000 token-এর একটি well-structured persona prompt প্লাস একটি memory layer এমন character adherence অর্জন করে যা ব্যবহারকারীরা একটি custom model থেকে আলাদা করতে পারে না, এবং ভালো model ship হলে underlying model অবাধে বদলাতে দেয়।

একটি companion অ্যাপে mature content কীভাবে handle করব?

এটাকে একটি policy-matching সমস্যা হিসেবে treat করুন। Mature fictional theme একটি adult age gate-এর পেছনে রাখুন, কোনো provider অনুমতি দেয় না এমন category-র জন্য input screen করুন, এবং সেই traffic শুধু এমন model-এ route করুন যাদের প্রকাশিত policy প্রাপ্তবয়স্কদের জন্য fiction অনুমতি দেয়, যেমন xAI-এর policy-র অধীনে Grok। কড়া model-এ একটি all-ages default track রাখুন, এবং প্রতিটি provider-এর terms of service মেনে চলুন।

অন্য model-এর সাথে কি একটি character AI অ্যাপের জন্য OpenAI SDK ব্যবহার করা যায়?

হ্যাঁ। DeepSeek, GLM, Kimi, Gemini, Claude, এবং Grok সবগুলোই OpenAI-compatible endpoint-এর মাধ্যমে reach করা যায়, তাদের vendor থেকে সরাসরি বা একটি gateway-এর মাধ্যমে। আপনার অ্যাপ code standard chat.completions interface-এ থাকে এবং model string বদলে model বদলায়, যা প্রতি-message routing সস্তায় বানানোর ঠিক সেই কারণ।