ডুয়েট এআই টেকনিক্যাল হ্যান্ডস অন ওয়ার্কশপ গাইড ফর ডেভেলপার কোডল্যাব

1. উদ্দেশ্য

এই কর্মশালার উদ্দেশ্য ব্যবহারকারী এবং অনুশীলনকারীদের হাতে-কলমে ডুয়েট এআই শিক্ষা প্রদান করা।

এই কোডল্যাবে, আপনি নিম্নলিখিতগুলি শিখবেন:

  1. আপনার GCP প্রকল্পে Duet AI সক্রিয় করুন এবং এটি একটি IDE এবং ক্লাউড কনসোলে ব্যবহারের জন্য কনফিগার করুন।
  2. কোড তৈরি, সমাপ্তি এবং ব্যাখ্যার জন্য ডুয়েট এআই ব্যবহার করুন।
  3. একটি অ্যাপ্লিকেশন সমস্যা ব্যাখ্যা এবং সমস্যা সমাধানের জন্য Duet AI ব্যবহার করুন।
  4. ডুয়েট AI বৈশিষ্ট্য যেমন IDE চ্যাট এবং মাল্টি-টার্ন চ্যাট, চ্যাট বনাম ইনলাইন কোড জেনারেশন, স্মার্ট অ্যাকশন যেমন কোড ব্যাখ্যা এবং আবৃত্তি স্বীকৃতি এবং আরও অনেক কিছু।

আখ্যান

ডেভেলপারদের জন্য ডুয়েট এআই কীভাবে প্রামাণিকভাবে দৈনন্দিন উন্নয়নে ব্যবহার করা হয় তা দেখানোর জন্য, এই কর্মশালার কার্যক্রম একটি বর্ণনামূলক প্রেক্ষাপটে সঞ্চালিত হয়।

একজন নতুন বিকাশকারী একটি ইকমার্স কোম্পানিতে যোগদান করেন। তাদের বিদ্যমান ইকমার্স অ্যাপ্লিকেশনে একটি নতুন পরিষেবা যোগ করার দায়িত্ব দেওয়া হয়েছে (যা একাধিক পরিষেবার সমন্বয়ে গঠিত)। নতুন পরিষেবা পণ্য ক্যাটালগে পণ্য সম্পর্কে অতিরিক্ত তথ্য (মাত্রা, ওজন ইত্যাদি) প্রদান করে। এই পরিষেবাটি পণ্যের মাত্রা এবং ওজনের উপর ভিত্তি করে আরও ভাল/সস্তা শিপিং খরচের অনুমতি দেবে।

যেহেতু বিকাশকারী কোম্পানিতে নতুন, তারা কোড তৈরি, ব্যাখ্যা এবং ডকুমেন্টেশনের জন্য ডুয়েট এআই ব্যবহার করবে।

পরিষেবাটি কোড করার পরে, একটি প্ল্যাটফর্ম অ্যাডমিনিস্ট্রেটর আর্টিফ্যাক্ট (ডকার কন্টেইনার) তৈরি করতে সাহায্য করার জন্য ডুয়েট এআই (চ্যাট) এবং জিসিপিতে আর্টিফ্যাক্ট স্থাপন করার জন্য প্রয়োজনীয় সংস্থানগুলি ব্যবহার করবে (উদাহরণস্বরূপ আর্টিফ্যাক্ট রেজিস্ট্রি, আইএএম অনুমতি, একটি কোড সংগ্রহস্থল, গণনা অবকাঠামো যেমন GKE বা CloudRun ইত্যাদি)

একবার অ্যাপ্লিকেশনটি GCP-তে স্থাপন করা হলে, একটি অ্যাপ্লিকেশন অপারেটর/SRE নতুন পরিষেবাতে একটি ত্রুটির সমস্যা সমাধানে সাহায্য করতে ডুয়েট এআই (এবং ক্লাউড অপস) ব্যবহার করবে।

ব্যক্তিত্ব

কর্মশালা নিম্নলিখিত ব্যক্তিত্ব কভার করে:

  1. অ্যাপ্লিকেশন বিকাশকারী - প্রোগ্রামিং এবং সফ্টওয়্যার বিকাশের কিছু জ্ঞান প্রয়োজন।

ডুয়েট এআই ওয়ার্কশপের এই বৈচিত্রটি শুধুমাত্র ডেভেলপারদের জন্য। GCP ক্লাউড সংস্থান সম্পর্কে কোন জ্ঞানের প্রয়োজন নেই। এই অ্যাপ্লিকেশনটি চালানোর জন্য প্রয়োজনীয় GCP সংস্থানগুলি কীভাবে তৈরি করা যায় তার স্ক্রিপ্টগুলি এখানে পাওয়া যাবে। প্রয়োজনীয় GCP সংস্থানগুলি স্থাপন করতে আপনি এই গাইডের নির্দেশাবলী অনুসরণ করতে পারেন।

2. পরিবেশ প্রস্তুত করা

ডুয়েট এআই সক্রিয় করা হচ্ছে

আপনি API (gcloud বা Terraform এর মত IaC টুল) বা ক্লাউড কনসোল UI এর মাধ্যমে একটি GCP প্রকল্পে Duet AI সক্রিয় করতে পারেন।

Google ক্লাউড প্রজেক্টে Duet AI সক্রিয় করতে, আপনি Cloud AI Companion API সক্ষম করুন এবং ক্লাউড AI কম্প্যানিয়ন ব্যবহারকারী এবং ব্যবহারকারীদের পরিষেবা ব্যবহার ভিউয়ার আইডেন্টিটি অ্যান্ড অ্যাক্সেস ম্যানেজমেন্ট (IAM) ভূমিকা প্রদান করুন।

জিক্লাউডের মাধ্যমে

ক্লাউড শেল সক্রিয় করুন:

আপনার PROJECT_ID , USER কনফিগার করুন এবং Cloud AI Companion API সক্ষম করুন৷

export PROJECT_ID=<YOUR PROJECT ID>
export USER=<YOUR USERNAME> # Use your full LDAP, e.g. name@example.com
gcloud config set project ${PROJECT_ID}
gcloud services enable cloudaicompanion.googleapis.com --project ${PROJECT_ID}

আউটপুট নিম্নলিখিত মত:

Updated property [core/project].
Operation "operations/acat.p2-60565640195-f37dc7fe-b093-4451-9b12-934649e2a435" finished successfully.

ক্লাউড এআই কম্প্যানিয়ন ব্যবহারকারী এবং সার্ভিস ইউসেজ ভিউয়ার আইডেন্টিটি অ্যান্ড অ্যাকসেস ম্যানেজমেন্ট (IAM) ভূমিকা USER অ্যাকাউন্টে মঞ্জুর করুন৷ ক্লাউড কম্প্যানিয়ন এপিআই আইডিই এবং কনসোল উভয়ের বৈশিষ্ট্যগুলির পিছনে রয়েছে যা আমরা ব্যবহার করব। কনসোলে UI সক্ষম করার আগে পরিষেবা ব্যবহার দর্শকের অনুমতিটি একটি দ্রুত পরীক্ষা হিসাবে ব্যবহার করা হয় (যাতে ডুয়েট UI শুধুমাত্র সেই প্রকল্পগুলিতে প্রদর্শিত হয় যেখানে API সক্ষম করা আছে)।

gcloud projects add-iam-policy-binding  ${PROJECT_ID} \
--member=user:${USER} --role=roles/cloudaicompanion.user

gcloud projects add-iam-policy-binding  ${PROJECT_ID} \
--member=user:${USER} --role=roles/serviceusage.serviceUsageViewer

আউটপুট নিম্নলিখিত মত:

...
- members:
  - user:<YOUR USER ACCOUNT>
  role: roles/cloudaicompanion.user

...
- members:
  - user:<YOUR USER ACCOUNT>
  role: roles/serviceusage.serviceUsageViewer

ক্লাউড কনসোলের মাধ্যমে

API সক্ষম করতে, Google ক্লাউড কনসোলে Cloud AI Companion API পৃষ্ঠাতে যান।

প্রজেক্ট সিলেক্টরে, একটি প্রোজেক্ট সিলেক্ট করুন।

সক্ষম করুন ক্লিক করুন।

পৃষ্ঠাটি আপডেট করে এবং সক্রিয় এর একটি স্থিতি দেখায়। Duet AI এখন নির্বাচিত Google ক্লাউড প্রকল্পে প্রয়োজনীয় IAM ভূমিকা আছে এমন সমস্ত ব্যবহারকারীদের কাছে উপলব্ধ।

Duet AI ব্যবহার করার জন্য প্রয়োজনীয় IAM ভূমিকাগুলি মঞ্জুর করতে, IAM পৃষ্ঠাতে যান৷

প্রিন্সিপাল কলামে, আপনার ব্যবহারকারীকে খুঁজুন যার জন্য আপনি Duet AI-তে অ্যাক্সেস সক্ষম করতে চান, এবং তারপর পেন্সিল আইকনে ক্লিক করুন ✏️ সেই সারিতে প্রিন্সিপাল সম্পাদনা করুন

সম্পাদনা অ্যাক্সেস প্যানে, আরেকটি ভূমিকা যোগ করুন এ ক্লিক করুন।

একটি ভূমিকা নির্বাচন করুন-এ, ক্লাউড এআই কম্প্যানিয়ন ব্যবহারকারী নির্বাচন করুন।

অন্য ভূমিকা যোগ করুন ক্লিক করুন এবং পরিষেবা ব্যবহার ভিউয়ার নির্বাচন করুন।

Save এ ক্লিক করুন।

IDE সেট আপ করা হচ্ছে

ডেভেলপাররা বিভিন্ন ধরনের IDE থেকে বেছে নিতে পারেন যা তাদের চাহিদা অনুযায়ী সবচেয়ে ভালো। ডুয়েট এআই কোড সহায়তা একাধিক IDE-তে পাওয়া যায় যেমন ভিজ্যুয়াল স্টুডিও কোড , জেটব্রেন আইডিই (IntelliJ, PyCharm, GoLand, WebStorm এবং আরও অনেক কিছু), ক্লাউড ওয়ার্কস্টেশন , ক্লাউড শেল এডিটর

এই ল্যাবে, আপনি ক্লাউড ওয়ার্কস্টেশন বা ক্লাউড শেল এডিটর ব্যবহার করতে পারেন।

এই কর্মশালা ক্লাউড শেল সম্পাদক ব্যবহার করে।

মনে রাখবেন ক্লাউড ওয়ার্কস্টেশন সেট আপ হতে 20-30 মিনিট সময় নিতে পারে।

অবিলম্বে ব্যবহার করতে, Cloud Shell Editor ব্যবহার করুন।

আপনার ক্লাউড শেল-এর উপরের মেনু বারে পেন্সিল আইকনে ✏️ ক্লিক করে ক্লাউড শেল এডিটর খুলুন।

ক্লাউড শেল এডিটরের একটি খুব অনুরূপ UI এবং UX থেকে VSCode আছে।

d6a6565f83576063.png

সেটিংস প্যানে প্রবেশ করতে CTRL (উইন্ডোজে)/CMD (ম্যাকে) + , (কমা) ক্লিক করুন।

অনুসন্ধান বারে, "duet ai" টাইপ করুন।

ক্লাউডকোড নিশ্চিত করুন বা সক্ষম করুন › ডুয়েট এআই: সক্ষম করুন এবং ক্লাউডকোড › ডুয়েট এআই › ইনলাইন পরামর্শ: অটো সক্ষম করুন

111b8d587330ec74.png

নীচের স্ট্যাটাস বারে, ক্লাউড কোডে ক্লিক করুন - সাইন ইন করুন এবং সাইন ইন ওয়ার্কফ্লো অনুসরণ করুন।

আপনি যদি ইতিমধ্যে সাইন ইন করে থাকেন, স্ট্যাটাস বার দেখায় ক্লাউড কোড - কোন প্রজেক্ট নেই

ক্লাউড কোডে ক্লিক করুন - কোনও প্রকল্প নেই এবং উপরে একটি অ্যাকশন ড্রপডাউন ফলক প্রদর্শিত হবে। একটি Google ক্লাউড প্রকল্প নির্বাচন করুন এ ক্লিক করুন।

3241a59811e3c84a.png

আপনার প্রকল্প আইডি টাইপ করা শুরু করুন এবং আপনার প্রকল্পটি তালিকায় উপস্থিত হওয়া উচিত।

c5358fc837588fe.png

প্রকল্পের তালিকা থেকে আপনার PROJECT_ID নির্বাচন করুন।

নিচের স্ট্যাটাস বার আপডেট করে আপনার প্রোজেক্ট আইডি দেখাতে। যদি এটি না হয়, তাহলে আপনাকে আপনার ক্লাউড শেল এডিটর ট্যাবটি রিফ্রেশ করতে হতে পারে।

ডুয়েট এআই আইকনে ক্লিক করুন d97fc4e7b594c3af.png বাম হাতের মেনু বারে এবং ডুয়েট এআই চ্যাট উইন্ডো প্রদর্শিত হবে। আপনি যদি জিসিপি প্রকল্প নির্বাচন করুন বলে একটি বার্তা পান। ক্লিক করুন এবং প্রকল্পটি পুনরায় নির্বাচন করুন।

আপনি এখন ডুয়েট এআই চ্যাট উইন্ডোটি দেখতে পাচ্ছেন

781f888360229ca6.png

3. অবকাঠামো সেট আপ করা

d3234d237f00fdbb.png

GCP-তে নতুন শিপিং পরিষেবা চালানোর জন্য, আপনার নিম্নলিখিত GCP সংস্থানগুলির প্রয়োজন:

  1. একটি ডাটাবেস সহ একটি ক্লাউড এসকিউএল ইনস্ট্যান্স।
  2. কনটেইনারাইজড পরিষেবা চালানোর জন্য একটি GKE ক্লাস্টার।
  3. ডকার ইমেজ সংরক্ষণ করার জন্য একটি আর্টিফ্যাক্ট রেজিস্ট্রি।
  4. কোডের জন্য একটি ক্লাউড সোর্স রিপোজিটরি।

ক্লাউড শেল টার্মিনালে, নিম্নলিখিত রেপো ক্লোন করুন এবং আপনার GCP প্রকল্পে অবকাঠামো সেট আপ করতে নিম্নলিখিত কমান্ডগুলি চালান।

# Set your project
export PROJECT_ID=<INSERT_YOUR_PROJECT_ID>
gcloud config set core/project ${PROJECT_ID}

# Enable Cloudbuild and grant Cloudbuild SA owner role 
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format 'value(projectNumber)')
gcloud services enable cloudbuild.googleapis.com
gcloud projects add-iam-policy-binding ${PROJECT_ID} --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com --role roles/owner

# Clone the repo
git clone https://github.com/duetailabs/dev.git ~/duetaidev
cd ~/duetaidev

# Run Cloudbuild to create the necessary resources
gcloud builds submit --substitutions=_PROJECT_ID=${PROJECT_ID}

# To destroy all GCP resources, run the following
# gcloud builds submit --substitutions=_PROJECT_ID=${PROJECT_ID} --config=cloudbuild_destroy.yaml

4. একটি পাইথন ফ্লাস্ক পরিষেবা তৈরি করা

9745ba5c70782e76.png

আমরা যে পরিষেবাটি তৈরি করব তা শেষ পর্যন্ত নিম্নলিখিত ফাইলগুলি নিয়ে গঠিত হবে। আপনাকে এখন এই ফাইলগুলি তৈরি করতে হবে না এবং নীচের নির্দেশাবলী অনুসরণ করে একবারে এইগুলি তৈরি করবে:

  1. package-service.yaml - প্যাকেজ পরিষেবার জন্য একটি ওপেন API স্পেক যাতে ডেটা যেমন উচ্চতা, প্রস্থ, ওজন এবং বিশেষ পরিচালনা নির্দেশাবলী রয়েছে।
  2. data_model.py - প্যাকেজ-পরিষেবা API স্পেকের জন্য ডেটা মডেল। এছাড়াও product_details DB-তে packages টেবিল তৈরি করে।
  3. connect_connector.py - CloudSQL সংযোগ (ইঞ্জিন, সেশন এবং বেস ORM সংজ্ঞায়িত করে)
  4. db_init.py - packages টেবিলে নমুনা ডেটা তৈরি করে।
  5. main.py - product_id এর উপর ভিত্তি করে packages ডেটা থেকে প্যাকেজ বিশদ পুনরুদ্ধার করতে একটি GET এন্ডপয়েন্ট সহ একটি পাইথন ফ্লাস্ক পরিষেবা।
  6. test.py - ইউনিট পরীক্ষা
  7. requirement.txt - পাইথনের প্রয়োজনীয়তা
  8. Dockerfile - এই অ্যাপ্লিকেশনটিকে কন্টেইনারাইজ করতে

অনুশীলনের সময় আপনি যদি কোনও স্টিকি সমস্যায় পড়েন, চূড়ান্ত ফাইলগুলি রেফারেন্সের জন্য এই কোডল্যাবের পরিশিষ্টে অবস্থিত।

আগের ধাপে, আপনি একটি ক্লাউড সোর্স রিপোজিটরি তৈরি করেছেন। সংগ্রহস্থল ক্লোন করুন। আপনি ক্লোন করা রিপোজিটরি ফোল্ডারে অ্যাপ্লিকেশন ফাইলগুলি তৈরি করবেন।

ক্লাউড শেল টার্মিনালে, সংগ্রহস্থল ক্লোন করতে নিম্নলিখিত কমান্ডটি চালান।

cd ~
gcloud source repos clone shipping shipping
cd ~/shipping 

ক্লাউড শেল এডিটর বাম হাতের মেনু থেকে ডুয়েট এআই চ্যাট সাইডবার খুলুন। আইকন এর মত দেখাচ্ছে 8b135a000b259175.png . আপনি এখন কোড সহায়তার জন্য Duet AI ব্যবহার করতে পারেন।

package-service.yaml

কোনো ফাইল খোলা ছাড়াই, ডুয়েটকে শিপিং পরিষেবার জন্য একটি Open API স্পেক তৈরি করতে বলুন।

প্রম্পট 1: একটি পরিষেবার জন্য একটি OpenAPI yaml স্পেসিফিকেশন তৈরি করুন যা একটি সংখ্যাসূচক পণ্য আইডি দেওয়া শিপিং এবং প্যাকেজ তথ্য প্রদান করে। পরিষেবাটিতে প্যাকেজের উচ্চতা, প্রস্থ, গভীরতা, ওজন এবং কোনও বিশেষ পরিচালনার নির্দেশাবলী সম্পর্কে তথ্য অন্তর্ভুক্ত করা উচিত।

ba12626f491a1204.png

জেনারেটেড কোড উইন্ডোর উপরের ডানদিকে তালিকাভুক্ত তিনটি বিকল্প রয়েছে।

আপনি হয় COPY করতে পারেন 71194556d8061dae.png কোডটি এবং একটি ফাইলে পেস্ট করুন।

আপনি ADD করতে পারেন df645de8c65607a.png সম্পাদকে বর্তমানে খোলা ফাইলের কোড।

অথবা আপনি OPEN পারেন a4c7ed6d845df343.png একটি নতুন ফাইলে কোড।

OPEN এ ক্লিক করুন a4c7ed6d845df343.png একটি নতুন ফাইলে কোড।

ফাইলটি সংরক্ষণ করতে CTRL/CMD + s ক্লিক করুন, এবং package-service.yaml নামক ফাইলের নাম দিয়ে ফাইলটিকে অ্যাপ্লিকেশন ফোল্ডারে সংরক্ষণ করুন। ওকে ক্লিক করুন।

f6ebd5b836949366.png

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট বিভাগে রয়েছে। যদি তা না হয়, ম্যানুয়ালি যথাযথ পরিবর্তন করুন।

আপনি Duet AI এর প্রতিক্রিয়া দেখতে বিভিন্ন প্রম্পট চেষ্টা করতে পারেন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট ইতিহাস রিসেট করুন f574ca2c1e114856.png ডুয়েট এআই সাইডবারের উপরে।

data_model.py

এরপরে, আপনি OpenAPI স্পেকের উপর ভিত্তি করে পরিষেবাটির জন্য ডেটা মডেল পাইথন ফাইল তৈরি করুন।

package-service.yaml ফাইল খোলার সাথে, নিম্নলিখিত প্রম্পট লিখুন।

প্রম্পট 1: python sqlalchemy ORM ব্যবহার করে, এই API পরিষেবার জন্য একটি ডেটা মডেল তৈরি করুন। এছাড়াও একটি পৃথক ফাংশন এবং একটি প্রধান এন্ট্রিপয়েন্ট অন্তর্ভুক্ত করুন যা ডাটাবেস টেবিল তৈরি করে।

b873a6a28bd28ca1.png

চলুন উত্পন্ন হয়েছে যে প্রতিটি অংশ তাকান. ডুয়েট এআই এখনও একজন সহকারী, এবং যদিও এটি দ্রুত কোড লিখতে সাহায্য করতে পারে, আপনার এখনও জেনারেট করা বিষয়বস্তু পর্যালোচনা করা উচিত এবং আপনি যাওয়ার সাথে সাথে এটি বোঝা উচিত।

প্রথমত, Package অফ কাইন্ড Base নামে একটি ক্লাস রয়েছে যা packages ডাটাবেসের জন্য ডেটা মডেলকে নিম্নোক্ত মত সংজ্ঞায়িত করে:

class Package(Base):
    __tablename__ = 'packages'

    id = Column(Integer, primary_key=True)
    product_id = Column(String(255))
    height = Column(Float)
    width = Column(Float)
    depth = Column(Float)
    weight = Column(Float)
    special_handling_instructions = Column(String(255))

এর পরে, আপনার একটি ফাংশন দরকার যা ডাটাবেসে টেবিল তৈরি করে যেমন:

def create_tables(engine):
    Base.metadata.create_all(engine)

অবশেষে, আপনার একটি প্রধান ফাংশন দরকার যা ক্লাউডএসকিউএল ডাটাবেসে টেবিলটি তৈরি করার জন্য create_tables ফাংশন চালায়, যেমন:

if __name__ == '__main__':
    from sqlalchemy import create_engine

    engine = create_engine('sqlite:///shipping.db')
    create_tables(engine)

    print('Tables created successfully.')

মনে রাখবেন যে main ফাংশন একটি স্থানীয় sqlite ডাটাবেস ব্যবহার করে একটি ইঞ্জিন তৈরি করছে। CloudSQL ব্যবহার করার জন্য, আপনাকে এটি পরিবর্তন করতে হবে। তুমি সেটা একটু পরে করো।

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতো একটি নতুন ফাইল ওয়ার্কফ্লোতে কোড। কোডটি data_model.py নামক একটি ফাইলে সংরক্ষণ করুন (নামে আন্ডারস্কোরটি নোট করুন এবং ড্যাশ নয়)।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট ইতিহাস রিসেট করুন f574ca2c1e114856.png ডুয়েট এআই সাইডবারের উপরে।

connect-connector.py

CloudSQL সংযোগকারী তৈরি করুন।

data_model.py ফাইলটি খোলার সাথে, নিম্নলিখিত প্রম্পটগুলি লিখুন৷

প্রম্পট 1: Cloud-sql-python-connector লাইব্রেরি ব্যবহার করে, একটি ফাংশন তৈরি করুন যা Postgres-এর একটি ক্লাউড SQL উদাহরণের জন্য একটি সংযোগ পুল শুরু করে।

ed05cb6ff85d34c5.png

মনে রাখবেন প্রতিক্রিয়াটি cloud-sql-python-connector লাইব্রেরি ব্যবহার করে না। আপনি একই চ্যাট থ্রেডে সুনির্দিষ্ট তথ্য যোগ করে ডুয়েটকে কিছুটা নজ দেওয়ার জন্য প্রম্পটগুলিকে পরিমার্জন করতে পারেন।

এর অন্য প্রম্পট ব্যবহার করা যাক.

প্রম্পট 2: ক্লাউড-এসকিউএল-পাইথন-সংযোগকারী লাইব্রেরি ব্যবহার করতে হবে।

d09095b44dde35bf.png

নিশ্চিত করুন যে এটি cloud-sql-python-connector লাইব্রেরি ব্যবহার করে।

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতো একটি নতুন ফাইল ওয়ার্কফ্লোতে কোড। connect_conector.py নামে একটি ফাইলে কোডটি সংরক্ষণ করুন। আপনাকে ম্যানুয়ালি pg8000 লাইব্রেরি আমদানি করতে হতে পারে, অনুগ্রহ করে নীচের ফাইলটি দেখুন৷

Duet AI চ্যাট ইতিহাস সাফ করুন, এবং connect_connector.py ফাইলটি খোলার সাথে, অ্যাপ্লিকেশনটিতে ব্যবহার করার জন্য DB engine , sessionmaker এবং base ORM তৈরি করুন৷

প্রম্পট 1: connect_with_connector পদ্ধতি ব্যবহার করে একটি ইঞ্জিন, সেশনমেকার ক্লাস এবং বেস ORM তৈরি করুন

6e4214b72ab13a63.png

প্রতিক্রিয়াটি connect_connector.py ফাইলে engine , Session এবং Base যুক্ত করতে পারে।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট বিভাগে রয়েছে। যদি তা না হয়, ম্যানুয়ালি যথাযথ পরিবর্তন করুন।

আপনি সম্ভাব্য ভিন্নতা ডুয়েট এআই এর প্রতিক্রিয়া দেখতে বিভিন্ন প্রম্পট চেষ্টা করতে পারেন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট ইতিহাস রিসেট করুন f574ca2c1e114856.png ডুয়েট এআই সাইডবারের উপরে।

data_model.py আপডেট করা হচ্ছে

CloudSQL ডাটাবেসে একটি টেবিল তৈরি করার জন্য আপনাকে পূর্ববর্তী ধাপে ( connect_connector.py ফাইলে) তৈরি করা ইঞ্জিন ব্যবহার করতে হবে।

ডুয়েট এআই চ্যাটের ইতিহাস সাফ করুন। data_model.py ফাইলটি খুলুন। নিম্নলিখিত প্রম্পট চেষ্টা করুন.

প্রম্পট 1: প্রধান ফাংশনে, connect_connector.py থেকে ইঞ্জিন আমদানি করুন এবং ব্যবহার করুন

2e768c9b6c523b9a.png

আপনি connect_connector (CloudSQL-এর জন্য) থেকে প্রতিক্রিয়া আমদানি engine দেখতে পাবেন। create_table সেই ইঞ্জিনটি ব্যবহার করে (ডিফল্ট sqlite স্থানীয় DB এর পরিবর্তে)।

data_model.py ফাইল আপডেট করুন।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট বিভাগে রয়েছে। যদি তা না হয়, ম্যানুয়ালি যথাযথ পরিবর্তন করুন।

আপনি বিভিন্ন ডুয়েট এআই এর প্রতিক্রিয়া দেখতে বিভিন্ন প্রম্পট চেষ্টা করতে পারেন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট ইতিহাস রিসেট করুন f574ca2c1e114856.png ডুয়েট এআই সাইডবারের উপরে।

requirements.txt

অ্যাপ্লিকেশনের জন্য একটি requirements.txt ফাইল তৈরি করুন।

connect_connector.py এবং data_model.py ফাইল উভয়ই খুলুন এবং নিম্নলিখিত প্রম্পটটি লিখুন।

প্রম্পট 1: এই ডেটা মডেল এবং পরিষেবার জন্য একটি পিপ প্রয়োজনীয়তা ফাইল তৈরি করুন

প্রম্পট 2: সর্বশেষ সংস্করণ ব্যবহার করে এই ডেটা মডেল এবং পরিষেবার জন্য একটি পিপ প্রয়োজনীয়তা ফাইল তৈরি করুন

69fae373bc5c6a18.png

যাচাই করুন নাম এবং সংস্করণ সঠিক. উদাহরণস্বরূপ, উপরের প্রতিক্রিয়াতে, google-cloud-sql-connecter নাম এবং সংস্করণ দুটিই ভুল। ম্যানুয়ালি সংস্করণগুলি ঠিক করুন এবং একটি requirements.txt ফাইল তৈরি করুন যা দেখতে এইরকম:

cloud-sql-python-connector==1.2.4
sqlalchemy==1.4.36
pg8000==1.22.0

কমান্ড টার্মিনালে নিম্নলিখিত চালান:

pip3 install -r requirements.txt

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট ইতিহাস রিসেট করুন f574ca2c1e114856.png ডুয়েট এআই সাইডবারের উপরে।

CloudSQL এ প্যাকেজ টেবিল তৈরি করা হচ্ছে

CloudSQL ডাটাবেস সংযোগকারীর জন্য পরিবেশ ভেরিয়েবল সেট করুন।

export INSTANCE_NAME=$(gcloud sql instances list --format='value(name)')
export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe ${INSTANCE_NAME} --format="value(connectionName)")
export DB_USER=evolution
export DB_PASS=evolution
export DB_NAME=product_details

এখন data_model.py চালান।

python data_model.py

আউটপুট নিম্নলিখিত অনুরূপ (আসলে কি প্রত্যাশিত দেখতে কোড পরীক্ষা করুন):

Tables created successfully.

CloudSQL ইনস্ট্যান্সের সাথে সংযোগ করুন এবং ডাটাবেস তৈরি করা হয়েছে তা পরীক্ষা করুন।

gcloud sql connect ${INSTANCE_NAME} --user=evolution --database=product_details

পাসওয়ার্ড প্রবেশ করার পরে (এছাড়াও বিবর্তন ), টেবিলগুলি পান।

product_details=> \dt

আউটপুট নিম্নলিখিত অনুরূপ:

           List of relations
 Schema |   Name   | Type  |   Owner   
--------+----------+-------+-----------
 public | packages | table | evolution
(1 row)

আপনি ডেটা মডেল এবং টেবিলের বিবরণও পরীক্ষা করতে পারেন।

product_details=> \d+ packages

আউটপুট নিম্নলিখিত অনুরূপ:

                                                                        Table "public.packages"
            Column             |       Type        | Collation | Nullable |               Default                | Storage  | Compression | Stats target | Description 
-------------------------------+-------------------+-----------+----------+--------------------------------------+----------+-------------+--------------+-------------
 id                            | integer           |           | not null | nextval('packages_id_seq'::regclass) | plain    |             |              | 
 product_id                    | integer           |           | not null |                                      | plain    |             |              | 
 height                        | double precision  |           | not null |                                      | plain    |             |              | 
 width                         | double precision  |           | not null |                                      | plain    |             |              | 
 depth                         | double precision  |           | not null |                                      | plain    |             |              | 
 weight                        | double precision  |           | not null |                                      | plain    |             |              | 
 special_handling_instructions | character varying |           |          |                                      | extended |             |              | 
Indexes:
    "packages_pkey" PRIMARY KEY, btree (id)
Access method: heap

ক্লাউডএসকিউএল থেকে প্রস্থান করতে \q টাইপ করুন।

db_init.py

এর পরে, packages টেবিলে কিছু নমুনা ডেটা যোগ করা যাক।

ডুয়েট এআই চ্যাটের ইতিহাস সাফ করুন। data_model.py ফাইলটি খোলার সাথে, নিম্নলিখিত প্রম্পটগুলি চেষ্টা করুন৷

প্রম্পট 1: একটি ফাংশন তৈরি করুন যা 10টি নমুনা প্যাকেজ সারি তৈরি করে এবং সেগুলিকে প্যাকেজ টেবিলে কমিট করে

প্রম্পট 2: connect_connector থেকে সেশন ব্যবহার করে, একটি ফাংশন তৈরি করুন যা 10টি নমুনা প্যাকেজ সারি তৈরি করে এবং প্যাকেজ টেবিলে সেগুলিকে কমিট করে

34a9afc5f04ba5.png

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতো একটি নতুন ফাইল ওয়ার্কফ্লোতে কোড। কোডটি db_init.py নামক একটি ফাইলে সংরক্ষণ করুন।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট বিভাগে রয়েছে। যদি তা না হয়, ম্যানুয়ালি যথাযথ পরিবর্তন করুন।

আপনি বিভিন্ন ডুয়েট এআই এর প্রতিক্রিয়া দেখতে বিভিন্ন প্রম্পট চেষ্টা করতে পারেন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট ইতিহাস রিসেট করুন f574ca2c1e114856.png ডুয়েট এআই সাইডবারের উপরে।

নমুনা প্যাকেজ ডেটা তৈরি করা হচ্ছে

কমান্ড লাইন থেকে db_init.py চালান।

python db_init.py

আউটপুট নিম্নলিখিত অনুরূপ:

Packages created successfully.

ক্লাউডএসকিউএল ইনস্ট্যান্সের সাথে আবার সংযোগ করুন এবং প্যাকেজ টেবিলে নমুনা ডেটা যোগ করা হয়েছে তা যাচাই করুন।

CloudSQL ইনস্ট্যান্সের সাথে সংযোগ করুন এবং ডাটাবেস তৈরি করা হয়েছে তা পরীক্ষা করুন।

gcloud sql connect ${INSTANCE_NAME} --user=evolution --database=product_details

পাসওয়ার্ড প্রবেশ করার পরে (এছাড়াও বিবর্তন ), প্যাকেজ টেবিল থেকে সমস্ত ডেটা পান।

product_details=> SELECT * FROM packages;

আউটপুট নিম্নলিখিত অনুরূপ:

 id | product_id | height | width | depth | weight |   special_handling_instructions   
----+------------+--------+-------+-------+--------+-----------------------------------
  1 |          0 |     10 |    10 |    10 |     10 | No special handling instructions.
  2 |          1 |     10 |    10 |    10 |     10 | No special handling instructions.
  3 |          2 |     10 |    10 |    10 |     10 | No special handling instructions.
  4 |          3 |     10 |    10 |    10 |     10 | No special handling instructions.
  5 |          4 |     10 |    10 |    10 |     10 | No special handling instructions.
  6 |          5 |     10 |    10 |    10 |     10 | No special handling instructions.
  7 |          6 |     10 |    10 |    10 |     10 | No special handling instructions.
  8 |          7 |     10 |    10 |    10 |     10 | No special handling instructions.
  9 |          8 |     10 |    10 |    10 |     10 | No special handling instructions.
 10 |          9 |     10 |    10 |    10 |     10 | No special handling instructions.
(10 rows)

ক্লাউডএসকিউএল থেকে প্রস্থান করতে \q টাইপ করুন।

main.py

data_model.py , package-service.yaml , এবং connect_connector.py ফাইল খোলার সাথে, অ্যাপ্লিকেশনটির জন্য একটি main.py তৈরি করুন।

প্রম্পট 1: পাইথন ফ্লাস্ক লাইব্রেরি ব্যবহার করে - একটি বাস্তবায়ন তৈরি করুন যা এই পরিষেবার জন্য http বিশ্রামের শেষ পয়েন্ট ব্যবহার করে

প্রম্পট 2: পাইথন ফ্লাস্ক লাইব্রেরি ব্যবহার করে - একটি বাস্তবায়ন তৈরি করুন যা এই পরিষেবার জন্য http বিশ্রামের শেষ পয়েন্ট ব্যবহার করে। প্যাকেজ ডেটার জন্য connect_conector.py থেকে SessionMaker আমদানি করুন এবং ব্যবহার করুন।

প্রম্পট 3: পাইথন ফ্লাস্ক লাইব্রেরি ব্যবহার করে - একটি বাস্তবায়ন তৈরি করুন যা এই পরিষেবার জন্য http বিশ্রামের শেষ পয়েন্ট ব্যবহার করে। প্যাকেজ ডেটার জন্য data_model.py এবং connect_conector.py থেকে SessionMaker থেকে প্যাকেজ আমদানি এবং ব্যবহার করুন।

প্রম্পট 4: পাইথন ফ্লাস্ক লাইব্রেরি ব্যবহার করে - একটি বাস্তবায়ন তৈরি করুন যা এই পরিষেবার জন্য HTTP বাকি শেষ পয়েন্ট ব্যবহার করে। প্যাকেজ ডেটার জন্য data_model.py এবং connect_conector.py থেকে SessionMaker থেকে প্যাকেজ আমদানি এবং ব্যবহার করুন। app.run এর জন্য হোস্ট আইপি 0.0.0.0 ব্যবহার করুন

6d794fc52a90e6ae.png

main.py এর জন্য প্রয়োজনীয়তা আপডেট করুন।

প্রম্পট: main.py এর জন্য প্রয়োজনীয় ফাইল তৈরি করুন

1cc0b318d2d4ca2f.png

requirements.txt ফাইলে এটি যুক্ত করুন। ফ্লাস্ক সংস্করণ 3.0.0 ব্যবহার করা নিশ্চিত করুন।

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতো একটি নতুন ফাইল ওয়ার্কফ্লোতে কোড। কোডটি main.py নামে একটি ফাইলে সংরক্ষণ করুন।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট বিভাগে রয়েছে। যদি তা না হয়, ম্যানুয়ালি যথাযথ পরিবর্তন করুন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট ইতিহাস রিসেট করুন f574ca2c1e114856.png ডুয়েট এআই সাইডবারের উপরে।

5. পরীক্ষা এবং অ্যাপ্লিকেশন চালানো

প্রয়োজনীয়তা ইনস্টল করুন.

pip3 install -r requirements.txt

main.py চালান।

python main.py

আউটপুট নিম্নলিখিত অনুরূপ:

 * Serving Flask app 'main'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://10.88.0.3:5000
Press CTRL+C to quit

একটি দ্বিতীয় টার্মিনাল থেকে, /packages/<product_id> এন্ডপয়েন্ট পরীক্ষা করুন।

curl localhost:5000/packages/1

আউটপুট নিম্নলিখিত অনুরূপ:

{"depth":10.0,"height":10.0,"special_handling_instructions":"No special handling instructions.","weight":10.0,"width":10.0}

আপনি আপনার নমুনা ডেটাতে অন্য কোনো পণ্য আইডি পরীক্ষা করতে পারেন।

টার্মিনালে চলমান ডকার কন্টেইনার থেকে প্রস্থান করতে CTRL_C লিখুন।

ইউনিট পরীক্ষা তৈরি করা হচ্ছে

main.py ফাইল খোলার সাথে, ইউনিট পরীক্ষা তৈরি করুন।

প্রম্পট 1: ইউনিট পরীক্ষা তৈরি করুন।

e861e5b63e1b2657.png

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতো একটি নতুন ফাইল ওয়ার্কফ্লোতে কোড। test.py নামে একটি ফাইলে কোডটি সংরক্ষণ করুন।

test_get_package ফাংশনে, একটি product_id অবশ্যই সংজ্ঞায়িত করতে হবে। আপনি ম্যানুয়ালি এটি যোগ করতে পারেন.

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট বিভাগে রয়েছে। যদি তা না হয়, ম্যানুয়ালি যথাযথ পরিবর্তন করুন।

ট্র্যাশ আইকনে ক্লিক করে ডুয়েট এআই চ্যাট ইতিহাস রিসেট করুন f574ca2c1e114856.png ডুয়েট এআই সাইডবারের উপরে।

ইউনিট পরীক্ষা চলমান

ইউনিট পরীক্ষা চালান।

python test.py

আউটপুট নিম্নলিখিত অনুরূপ:

.
----------------------------------------------------------------------
Ran 1 test in 1.061s

OK

ক্লাউড শেল এডিটরে সমস্ত ফাইল বন্ধ করুন এবং ট্র্যাশ আইকনে ক্লিক করে চ্যাট ইতিহাস সাফ করুন 1ecccfe10d6c540.png শীর্ষ স্ট্যাটাস বারে।

ডকারফাইল

এই অ্যাপ্লিকেশনের জন্য একটি Dockerfile তৈরি করুন।

main.py খুলুন এবং নিম্নলিখিত প্রম্পট চেষ্টা করুন।

প্রম্পট 1: এই অ্যাপ্লিকেশনের জন্য একটি ডকারফাইল তৈরি করুন।

প্রম্পট 2: এই অ্যাপ্লিকেশনের জন্য একটি ডকারফাইল তৈরি করুন। কন্টেইনারে সমস্ত ফাইল কপি করুন।

9c473caea437a5c3.png

এছাড়াও আপনাকে INSTANCE_CONNECTION_NAME , DB_USER , DB_PASS , এবং DB_NAME এর জন্য ENVARS সেট করতে হবে। আপনি ম্যানুয়ালি এটি করতে পারেন. আপনার ডকারফাইল নিম্নলিখিত মত হওয়া উচিত:

FROM python:3.10-slim

WORKDIR /app

COPY . ./

RUN pip install -r requirements.txt

# Add these manually for your project
ENV INSTANCE_CONNECTION_NAME=YOUR_INSTANCE_CONNECTION_NAME
ENV DB_USER=evolution
ENV DB_PASS=evolution
ENV DB_NAME=product_details

CMD ["python", "main.py"]

OPEN ব্যবহার করে a4c7ed6d845df343.png আগের মতো একটি নতুন ফাইল ওয়ার্কফ্লোতে কোড। কোডটি ডকারফাইল নামে একটি ফাইলে সংরক্ষণ করুন।

চূড়ান্ত ফাইলটি এই কোডল্যাবের পরিশিষ্ট বিভাগে রয়েছে। যদি তা না হয়, ম্যানুয়ালি যথাযথ পরিবর্তন করুন।

স্থানীয়ভাবে অ্যাপ্লিকেশন চলমান

Dockerfile খোলার সাথে, নিম্নলিখিত প্রম্পটটি চেষ্টা করুন।

প্রম্পট 1: আমি কীভাবে স্থানীয়ভাবে এই ডকারফাইলটি ব্যবহার করে একটি ধারক চালাব

570fd5c296ca8c83.png

নির্দেশাবলী অনুসরণ করুন.

# Build
docker build -t shipping .
# And run
docker run -p 5000:5000 -it shipping

আউটপুট নিম্নলিখিত অনুরূপ:

 * Serving Flask app 'main'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://172.17.0.2:5000
Press CTRL+C to quit

একটি দ্বিতীয় টার্মিনাল উইন্ডো থেকে, ধারক অ্যাক্সেস করুন.

curl localhost:5000/packages/1

আউটপুট নিম্নলিখিত অনুরূপ:

{"depth":10.0,"height":10.0,"special_handling_instructions":"No special handling instructions.","weight":10.0,"width":10.0}

কন্টেইনারাইজড অ্যাপ্লিকেশন কাজ করছে।

টার্মিনালে চলমান ডকার কন্টেইনার থেকে প্রস্থান করতে CTRL_C লিখুন।

আর্টিফ্যাক্ট রেজিস্ট্রিতে কন্টেইনার ইমেজ তৈরি করা

কন্টেইনার ইমেজ তৈরি করুন এবং আর্টিফ্যাক্ট রেজিস্ট্রিতে পুশ করুন।

cd ~/shipping
gcloud auth configure-docker us-central1-docker.pkg.dev
docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/shipping/shipping .
docker push us-central1-docker.pkg.dev/${PROJECT_ID}/shipping/shipping

অ্যাপ্লিকেশন কন্টেইনারটি এখন us-central1-docker.pkg.dev/${PROJECT_ID}/shipping/shipping এ অবস্থিত যা GKE-তে স্থাপন করা যেতে পারে।

6. GKE ক্লাস্টারে অ্যাপ্লিকেশন স্থাপন করা হচ্ছে

আপনি যখন এই ওয়ার্কশপের জন্য GCP সংস্থান তৈরি করেছিলেন তখন একটি GKE অটোপাইলট ক্লাস্টার তৈরি হয়েছিল৷ GKE ক্লাস্টারে সংযোগ করুন।

gcloud container clusters get-credentials gke1 \
    --region=us-central1

Google পরিষেবা অ্যাকাউন্টের সাথে Kubernetes ডিফল্ট পরিষেবা অ্যাকাউন্টটি টীকা করুন।

kubectl annotate serviceaccount default iam.gke.io/gcp-service-account=cloudsqlsa@${PROJECT_ID}.iam.gserviceaccount.com

আউটপুট নিম্নলিখিত অনুরূপ:

serviceaccount/default annotated

k8s.yaml ফাইলটি প্রস্তুত করুন এবং প্রয়োগ করুন।

cp ~/duetaidev/k8s.yaml_tmpl ~/shipping/.
export INSTANCE_NAME=$(gcloud sql instances list --format='value(name)')
export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe ${INSTANCE_NAME} --format="value(connectionName)")
export IMAGE_REPO=us-central1-docker.pkg.dev/${PROJECT_ID}/shipping/shipping
envsubst < ~/shipping/k8s.yaml_tmpl > k8s.yaml
kubectl apply -f k8s.yaml

আউটপুট নিম্নলিখিত অনুরূপ:

deployment.apps/shipping created
service/shipping created

পড চালু না হওয়া পর্যন্ত অপেক্ষা করুন এবং পরিষেবাটিতে একটি বহিরাগত লোড ব্যালেন্সার আইপি ঠিকানা বরাদ্দ করা আছে।

kubectl get pods
kubectl get service shipping

আউটপুট নিম্নলিখিত অনুরূপ:

# kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
shipping-f5d6f8d5-56cvk   1/1     Running   0          4m47s
shipping-f5d6f8d5-cj4vv   1/1     Running   0          4m48s
shipping-f5d6f8d5-rrdj2   1/1     Running   0          4m47s

# kubectl get service shipping
NAME       TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)        AGE
shipping   LoadBalancer   34.118.225.125   34.16.39.182   80:30076/TCP   5m41s

GKE অটোপাইলট ক্লাস্টারগুলির জন্য, সংস্থানগুলি প্রস্তুত না হওয়া পর্যন্ত কয়েক মুহূর্ত অপেক্ষা করুন৷

EXTERNAL-IP ঠিকানার মাধ্যমে পরিষেবাটি অ্যাক্সেস করুন৷

export EXTERNAL_IP=$(kubectl get svc shipping --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl http://${EXTERNAL_IP}/packages/1

আউটপুট নিম্নলিখিত অনুরূপ:

{"depth":10.0,"height":10.0,"special_handling_instructions":"No special handling instructions.","weight":10.0,"width":10.0}

7. অতিরিক্ত ক্রেডিট: আবেদনের সমস্যা সমাধান করা

cloudsqlsa পরিষেবা অ্যাকাউন্ট থেকে CloudSQL ক্লায়েন্ট IAM ভূমিকা সরান। এটি CloudSQL ডাটাবেসের সাথে সংযোগ করার সময় একটি ত্রুটি সৃষ্টি করে।

gcloud projects remove-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:cloudsqlsa@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/cloudsql.client"

শিপিং পড পুনরায় আরম্ভ করুন.

kubectl rollout restart deployment shipping

পড পুনরায় চালু হওয়ার পরে, shipping পরিষেবাটি আবার অ্যাক্সেস করার চেষ্টা করুন।

export EXTERNAL_IP=$(kubectl get svc shipping --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl http://${EXTERNAL_IP}/packages/1 

আউটপুট নিম্নলিখিত অনুরূপ:

...
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>

Kubernetes Engine > Workloads- এ নেভিগেট করে লগগুলি পরিদর্শন করুন

d225b1916c829167.png

shipping স্থাপনায় ক্লিক করুন এবং তারপর লগ ট্যাবে।

1d0459141483d6a7.png

ভিউ ইন লগ এক্সপ্লোরার এ ক্লিক করুন df8b9d19a9fe4c73.png স্ট্যাটাস বারের ডানদিকে আইকন। এটি একটি নতুন লগ এক্সপ্লোরার উইন্ডো খোলে।

e86d1c265e176bc4.png

Traceback ত্রুটি এন্ট্রিগুলির একটিতে ক্লিক করুন এবং তারপরে এই লগ এন্ট্রি ব্যাখ্যা করুন ক্লিক করুন।

d6af045cf03008bc.png

আপনি ত্রুটির ব্যাখ্যা পড়তে পারেন.

এর পরে, ত্রুটির সমস্যা সমাধানে সহায়তা করার জন্য ডুয়েট এআই পান।

নিম্নলিখিত প্রম্পট চেষ্টা করুন.

প্রম্পট 1: এই ত্রুটির সমস্যা সমাধানে আমাকে সাহায্য করুন

9288dd6045369167.png

প্রম্পটে ত্রুটি বার্তা লিখুন।

প্রম্পট 2: নিষিদ্ধ: প্রমাণীকৃত IAM প্রিন্সিপাল API অনুরোধ করার জন্য অনুমোদিত বলে মনে হচ্ছে না। আপনার GCP প্রোজেক্টের মধ্যে 'ক্লাউড এসকিউএল অ্যাডমিন এপিআই' চালু আছে এবং 'ক্লাউড এসকিউএল ক্লায়েন্ট' ভূমিকা আইএএম প্রিন্সিপালকে দেওয়া হয়েছে তা যাচাই করুন

f1e64fbdc435d31c.png

এবং তারপর.

প্রম্পট 3: আমি কিভাবে ক্লাউড এসকিউএল ক্লায়েন্ট ভূমিকা একটি গুগল পরিষেবা অ্যাকাউন্টে gcloud ব্যবহার করে বরাদ্দ করব?

bb8926b995a8875c.png

ক্লাউড এসকিউএল ক্লায়েন্টের ভূমিকা cloudsqlsa বরাদ্দ করুন।

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:cloudsqlsa@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/cloudsql.client"

কয়েক মুহূর্ত অপেক্ষা করুন এবং আবার অ্যাপ্লিকেশন অ্যাক্সেস করার চেষ্টা করুন।

export EXTERNAL_IP=$(kubectl get svc shipping --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl http://${EXTERNAL_IP}/packages/1

আউটপুট নিম্নলিখিত অনুরূপ:

{"depth":10.0,"height":10.0,"special_handling_instructions":"No special handling instructions.","weight":10.0,"width":10.0}

সমস্যাটির সমাধান করতে আপনি সফলভাবে ক্লাউড লগিং , লগ এক্সপ্লোরার এবং লগ এক্সপ্লেনার বৈশিষ্ট্যে ডুয়েট এআই ব্যবহার করেছেন।

8. উপসংহার

অভিনন্দন! আপনি এই কোডল্যাবটি সফলভাবে সম্পন্ন করেছেন।

এই কোডল্যাবে, আপনি নিম্নলিখিতগুলি শিখেছেন:

  1. আপনার GCP প্রকল্পে Duet AI সক্রিয় করুন এবং এটি একটি IDE এবং ক্লাউড কনসোলে ব্যবহারের জন্য কনফিগার করুন।
  2. কোড তৈরি, সমাপ্তি এবং ব্যাখ্যার জন্য ডুয়েট এআই ব্যবহার করুন।
  3. একটি অ্যাপ্লিকেশন সমস্যা ব্যাখ্যা এবং সমস্যা সমাধানের জন্য Duet AI ব্যবহার করুন।
  4. ডুয়েট AI বৈশিষ্ট্য যেমন IDE চ্যাট এবং মাল্টি-টার্ন চ্যাট, চ্যাট বনাম ইনলাইন কোড জেনারেশন, স্মার্ট অ্যাকশন যেমন কোড ব্যাখ্যা এবং আবৃত্তি স্বীকৃতি এবং আরও অনেক কিছু।

9. পরিশিষ্ট

package-service.yaml

swagger: "2.0"
info:
 title: Shipping and Package Information API
 description: This API provides information about shipping and packages.
 version: 1.0.0
host: shipping.googleapis.com
schemes:
 - https
produces:
 - application/json
paths:
 /packages/{product_id}:
   get:
     summary: Get information about a package
     description: This method returns information about a package, including its height, width, depth, weight, and any special handling instructions.
     parameters:
       - name: product_id
         in: path
         required: true
         type: integer
         format: int64
     responses:
       "200":
         description: A successful response
         schema:
           type: object
           properties:
             height:
               type: integer
               format: int64
             width:
               type: integer
               format: int64
             depth:
               type: integer
               format: int64
             weight:
               type: integer
               format: int64
             special_handling_instructions:
               type: string
       "404":
         description: The product_id was not found

data_model.py

from sqlalchemy import Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base

from connect_connector import engine

Base = declarative_base()

class Package(Base):
    __tablename__ = 'packages'

    id = Column(Integer, primary_key=True)
    product_id = Column(Integer, nullable=False)
    height = Column(Float, nullable=False)
    width = Column(Float, nullable=False)
    depth = Column(Float, nullable=False)
    weight = Column(Float, nullable=False)
    special_handling_instructions = Column(String, nullable=True)

def create_tables():
    Base.metadata.create_all(engine)

if __name__ == '__main__':
    create_tables()

    print('Tables created successfully.')

connect_connector.py

import os

from google.cloud.sql.connector import Connector, IPTypes
import sqlalchemy

# You may need to manually import pg8000 and Base as follows
import pg8000
from sqlalchemy.ext.declarative import declarative_base


def connect_with_connector() -> sqlalchemy.engine.base.Engine:
   """Initializes a connection pool for a Cloud SQL instance of Postgres."""
   # Note: Saving credentials in environment variables is convenient, but not
   # secure - consider a more secure solution such as
   # Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
   # keep secrets safe.
   instance_connection_name = os.environ[
       "INSTANCE_CONNECTION_NAME"
   ]  # e.g. 'project:region:instance'
   db_user = os.environ["DB_USER"]  # e.g. 'my-database-user'
   db_pass = os.environ["DB_PASS"]  # e.g. 'my-database-password'
   db_name = os.environ["DB_NAME"]  # e.g. 'my-database'

   ip_type = IPTypes.PRIVATE if os.environ.get("PRIVATE_IP") else IPTypes.PUBLIC

   connector = Connector()

   def getconn() -> sqlalchemy.engine.base.Engine:
       conn: sqlalchemy.engine.base.Engine = connector.connect(
           instance_connection_name,
           "pg8000",
           user=db_user,
           password=db_pass,
           db=db_name,
           ip_type=ip_type,
       )
       return conn

   pool = sqlalchemy.create_engine(
       "postgresql+pg8000://",
       creator=getconn,
       # ...
   )
   return pool

# Create a connection pool
engine = connect_with_connector()

# Create a sessionmaker class to create new sessions
SessionMaker = sqlalchemy.orm.sessionmaker(bind=engine)

# Create a Base class for ORM
# You may need to manually fix the following
Base = declarative_base()

db_init.py

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from connect_connector import engine

from data_model import Package

def create_packages():
    # Create a session
    session = sessionmaker(bind=engine)()

    # Create 10 sample packages
    for i in range(10):
        package = Package(
            product_id=i,
            height=10.0,
            width=10.0,
            depth=10.0,
            weight=10.0,
            special_handling_instructions="No special handling instructions."
        )

        # Add the package to the session
        session.add(package)

    # Commit the changes
    session.commit()

if __name__ == '__main__':
    create_packages()

    print('Packages created successfully.')

main.py

from flask import Flask, request, jsonify

from data_model import Package
from connect_connector import SessionMaker

app = Flask(__name__)

session_maker = SessionMaker()

@app.route("/packages/<int:product_id>", methods=["GET"])
def get_package(product_id):
  """Get information about a package."""

  session = session_maker

  package = session.query(Package).filter(Package.product_id == product_id).first()

  if package is None:
    return jsonify({"message": "Package not found."}), 404

  return jsonify(
      {
          "height": package.height,
          "width": package.width,
          "depth": package.depth,
          "weight": package.weight,
          "special_handling_instructions": package.special_handling_instructions,
      }
  ), 200

if __name__ == "__main__":
  app.run(host="0.0.0.0")

test.py

import unittest

from data_model import Package
from connect_connector import SessionMaker

from main import app

class TestPackage(unittest.TestCase):

    def setUp(self):
        self.session_maker = SessionMaker()

    def tearDown(self):
        self.session_maker.close()

    def test_get_package(self):
        """Test the `get_package()` function."""

        package = Package(
        product_id=11, # Ensure that the product_id different from the sample data
        height=10,
        width=10,
        depth=10,
        weight=10,
        special_handling_instructions="Fragile",
        )

        session = self.session_maker

        session.add(package)
        session.commit()

        response = app.test_client().get("/packages/11")

        self.assertEqual(response.status_code, 200)

        self.assertEqual(
            response.json,
            {
                "height": 10,
                "width": 10,
                "depth": 10,
                "weight": 10,
                "special_handling_instructions": "Fragile",
            },
        )

if __name__ == "__main__":
    unittest.main()

requirements.txt

cloud-sql-python-connector==1.2.4
sqlalchemy==1.4.36
pg8000==1.22.0
Flask==3.0.0
gunicorn==20.1.0
psycopg2-binary==2.9.3

ডকারফাইল

FROM python:3.10-slim

WORKDIR /app

COPY . ./

RUN pip install -r requirements.txt

# Add these manually for your project
ENV INSTANCE_CONNECTION_NAME=YOUR_INSTANCE_CONNECTION_NAME
ENV DB_USER=evolution
ENV DB_PASS=evolution
ENV DB_NAME=product_details

CMD ["python", "main.py"]