ឯកសារអ្នកអភិវឌ្ឍន៍
ភាសាខ្មែរ

ការអភិវឌ្ឍបូត

បូតសំឡេង

ពេលមនុស្សហៅទៅបូតពីកម្មវិធី ម៉ូដែលសំឡេង AI ជាអ្នកឆ្លើយ។ របៀបបើក សេចក្តីណែនាំ និងសំឡេង ការជូនដំណឹងអំពីការហៅ ឧបករណ៍ ម៉ាស៊ីនមេ MCP សោផ្ទាល់ខ្លួន កំណត់ត្រាសន្ទនា របៀបសំឡេងដើម Apple Watch និងការរក្សាទុកការសន្ទនា — ការណែនាំសម្រាប់ម្ចាស់បូត។

បូតសំឡេង គឺជាបូតដែលមនុស្សអាចហៅទូរស័ព្ទមកពីកម្មវិធីបាន។ អ្នកទទួលការហៅមិនមែនជាកូដរបស់ម្ចាស់បូតទេ គឺជាម៉ូដែលសំឡេង AI របស់ Pabal ហើយម្ចាស់បូតប្រើ Bot API ដើម្បីកំណត់សេចក្តីណែនាំ ពាក្យស្វាគមន៍ សំឡេង ភាសា និងដែនកំណត់ ដែលម៉ូដែលនោះត្រូវអនុវត្តតាម។ រាល់ពេលការហៅចាប់ផ្តើម និងបញ្ចប់ អ្នកទទួល update voice_call ហើយក្នុងពេលការហៅ ម៉ូដែលអាចហៅកូដរបស់បូត (ឧបករណ៍) ដើម្បីរកការបញ្ជាទិញ ឬពិនិត្យការកក់បាន។ ក៏មានរបៀបសំឡេងដើមដែរ ដែលម៉ាស៊ីនមេរបស់អ្នកទទួលសំឡេងដោយផ្ទាល់ ជំនួសម៉ូដែល AI។ បើអ្នកទើបបង្កើតបូតលើកដំបូង សូមមើល ការបង្កើតបូត ជាមុនសិន។

ស្ថានភាពបច្ចុប្បន្ន

បូតសំឡេងប្រើបានតែពេលវាត្រូវបានបើកនៅលើម៉ាស៊ីនមេនីមួយៗ ហើយនៅពេលកែឯកសារនេះ (2026-10-02) វាកំពុងបិទនៅលើ pabal.me — កំពុងសាកល្បងលើម៉ាស៊ីនមេអភិវឌ្ឍន៍

អាចហៅទៅបូតសំឡេងបានតែនៅលើម៉ាស៊ីនមេដែលបំពេញលក្ខខណ្ឌខាងក្រោមទាំងអស់ប៉ុណ្ណោះ។ method ទាំងនេះមានសូម្បីតែនៅលើម៉ាស៊ីនមេដែលសំឡេងបិទ ដូច្នេះអ្នកអាចអានការកំណត់បាន។ ប៉ុន្តែមុនពេលសំឡេងត្រូវបានបើកនៅលើម៉ាស៊ីនមេនេះ ហើយប្រតិបត្តិករអនុញ្ញាតបូតនោះ គ្មានការកំណត់ណាមួយត្រូវបានរក្សាទុកទេ លើកលែងតែការបិទ (បិទសំឡេង · បិទកំណត់ត្រាសន្ទនា · បិទរបៀបសំឡេងដើម · លុបសោផ្ទាល់ខ្លួន · លុបម៉ាស៊ីនមេ MCP) (403 VOICE_NOT_AVAILABLE)។ available និង unavailable_reason នៃ getVoiceCallSettings ប្រាប់ថាតើបូតរបស់អ្នកអាចទទួលការហៅឥឡូវនេះឬអត់។

មុខងារដើម្បីបើក (ទាំងអស់)pabal.me ឥឡូវនេះ
ការហៅបូតសំឡេងម៉ាស៊ីនមេមាន gateway សំឡេង និងការបញ្ជូនបន្តការហៅ (TURN) · ផ្នែកការហៅបូត (bot-calls) ត្រូវបានផ្សាយក្នុងគោលការណ៍ឯកជនភាព · ប្រតិបត្តិករបានអនុញ្ញាតបូតនោះ · មុនបើកជាសាធារណៈ មានតែអ្នកសាកល្បងដែលប្រតិបត្តិករកំណត់ទេដែលហៅបាន · កម្មវិធីរបស់អ្នកហៅជាbuild ដែលមានផ្ទាំងបញ្ជាក់ (កុំព្យូទ័រ pabal-bc2 — ខណៈដែលផ្ទាំងបញ្ជាក់មានតែភាសាកូរ៉េ និងអង់គ្លេស ក៏ទទួល pabal-bc1 ដែរ, Android 62151, iPhone build 5 ឡើងទៅ, កម្មវិធី Apple Watch build 1 ឡើងទៅ) — build ទាំងនេះមិនទាន់ចេញផ្សាយនៅឡើយទេបិទ
ការហៅពី Apple Watchការហៅបូតសំឡេង + API នាឡិការបស់ម៉ាស៊ីនមេ + ច្រកចូលសំឡេងនាឡិកា (pabal-voice-edge) + gateway ដែលទទួលការហៅផ្ទាល់ (direct) · build កម្មវិធីនាឡិកាចាប់ពី TELEGRAM_VOICE_MIN_BUILD_WATCHOS ឡើងទៅ · បូតដែលប្រើឧបករណ៍ · ម៉ាស៊ីនមេ MCP · សោផ្ទាល់ខ្លួន · របៀបសំឡេងដើម · កំណត់ត្រាសន្ទនារបស់ម្ចាស់បូត មិនទាន់បានទេបិទ — កំពុងសាកល្បងលើម៉ាស៊ីនមេអភិវឌ្ឍន៍
រក្សាទុកការសន្ទនា (ច្បាប់ចម្លងរបស់អ្នកហៅ)ការហៅបូតសំឡេង + ផ្នែក bot-calls-keep-text ក្នុងគោលការណ៍ + gateway ដែលប្រកាស keep_text (0.9.0) + build កម្មវិធីដែលមានប្រអប់ធីក · ការពិនិត្យផ្នែកច្បាប់លើពាក្យពេចន៍នៃផ្ទាំងបញ្ជាក់បិទ — មុនការពិនិត្យផ្នែកច្បាប់
ការហៅពីបូតផ្នែក bot-calls-outbound ក្នុងគោលការណ៍ឯកជនភាព និងផ្នែក voice-bot-owners-outbound ក្នុងលក្ខខណ្ឌនៃសេវាកម្មត្រូវបានផ្សាយ (ព្រមទាំងផ្នែក voice-bot-owners ដើម្បីឲ្យម្ចាស់បូតយល់ព្រមលក្ខខណ្ឌកំណែ 4) · កុងតាក់រួមរបស់ប្រតិបត្តិករ ក្រោយការពិនិត្យផ្នែកច្បាប់ · ម្ចាស់បូតបើកក្នុង @BotFather (លក្ខខណ្ឌកំណែ 4 គោលបំណង) · ការពិនិត្យបូតដោយប្រតិបត្តិករ · ការអនុញ្ញាតរបស់អ្នកទទួលការហៅ (កំណែកម្មវិធីដែលមានផ្ទាំងអនុញ្ញាត) · gateway ដែលមានការថតសេចក្តីជូនដំណឹងការហៅចេញដែលបានអនុម័ត · ភាសាបូតជាកូរ៉េ ឬអង់គ្លេសបិទ — កំពុងរង់ចាំការពិនិត្យផ្នែកច្បាប់
ភាសាបូតក្រៅពីភាសាកូរ៉េ និងអង់គ្លេស (7 ភាសា)ការហៅបូតសំឡេង + gateway ដែលធ្វើការហៅជាភាសារបស់បូតនោះ (ចាប់ពី 0.7.0 គាំទ្រទាំង 9 ភាសា) · ប្រតិបត្តិករបានអានសេចក្តីណែនាំ និងពាក្យស្វាគមន៍របស់បូតនោះ ហើយអនុញ្ញាត (សូម្បីតែនៅលើម៉ាស៊ីនមេដែលទទួលបូតទាំងអស់)បិទ — មិនទាន់ដាក់ឲ្យប្រើ
ផ្ទាំងបញ្ជាក់ និងសំឡេងជូនដំណឹងក្រៅពីភាសាកូរ៉េ និងអង់គ្លេស (8 ភាសា)ភាសានីមួយៗត្រូវបានដាក់ក្នុង build កម្មវិធី និង image របស់ gateway បន្ទាប់ពីបានបញ្ចប់ការពិនិត្យផ្នែកច្បាប់ និងការពិនិត្យដោយអ្នកនិយាយភាសានោះពីកំណើត។ មុននោះ សូម្បីតែអ្នកហៅដែលប្រើកម្មវិធីជាភាសានោះ ក៏ឃើញផ្ទាំងបញ្ជាក់ជាភាសាអង់គ្លេស ហើយឮសេចក្តីជូនដំណឹងជាភាសាអង់គ្លេសដែរសេចក្តីព្រាង — មិនទាន់ពិនិត្យ
លក្ខខណ្ឌម្ចាស់បូត (កំណែ 4)ផ្នែកម្ចាស់បូត (voice-bot-owners) ត្រូវបានផ្សាយក្នុងលក្ខខណ្ឌនៃសេវាកម្ម។ កំណត់ត្រាសន្ទនា សោផ្ទាល់ខ្លួន របៀបសំឡេងដើម ម៉ាស៊ីនមេ MCP និងការហៅពីបូត សុទ្ធតែត្រូវការលក្ខខណ្ឌនេះជាមុនមិនអាចយល់ព្រមបាន
ឧបករណ៍ការហៅបូតសំឡេង + gateway ដែលគាំទ្រឧបករណ៍បិទ
ម៉ាស៊ីនមេ MCPសមាសភាគ MCP · អាសយដ្ឋានចេញក្រៅផ្តាច់មុខ (លក្ខខណ្ឌប្រតិបត្តិការ — កូដមិនពិនិត្យទេ) · ផ្នែក bot-calls-mcp នៃគោលការណ៍ និងផ្នែកម្ចាស់បូតនៃលក្ខខណ្ឌ · ម្ចាស់បូតយល់ព្រមលក្ខខណ្ឌម្ចាស់បូត · build កម្មវិធីដែលបង្ហាញកន្លែងទទួល MCP របស់បូតលើផ្ទាំងបញ្ជាក់ (មុននោះ ទោះចុះឈ្មោះក៏គ្មានការហៅណាផ្ទុកឧបករណ៍ MCP ដែរ)បិទ
សោម៉ូដែលផ្ទាល់ខ្លួនសោមេនៅលើម៉ាស៊ីនមេ · ប្រតិបត្តិករបើកក្រោយពេលកម្មវិធីចេញផ្សាយផ្ទាំងបញ្ជាក់ (កំណែ 2) ដែលបង្ហាញកន្លែងទទួលរបស់បូតសោផ្ទាល់ខ្លួន · លក្ខខណ្ឌម្ចាស់បូត · gateway ដែលអាចប្រើសោរបស់ម្ចាស់បូត (លំនាំដើមតែសោ Google)បិទ — មិនទទួលសោទេ
កំណត់ត្រាសន្ទនាប្រតិបត្តិករអនុញ្ញាតនៅក្នុងទំព័រគ្រប់គ្រងក្រោយការពិនិត្យផ្នែកច្បាប់ (លំនាំដើមបិទ) · លក្ខខណ្ឌម្ចាស់បូត · កុងតាក់របស់ម្ចាស់បូត · gateway ដែលមានសំឡេងជូនដំណឹងអំពីកំណត់ត្រាសន្ទនា · ការហៅ managedបិទ
របៀបសំឡេងដើមសោមេនៅលើម៉ាស៊ីនមេ · ផ្នែក bot-calls-stream នៃគោលការណ៍ និងផ្នែកម្ចាស់បូតនៃលក្ខខណ្ឌ · gateway ដែលទទួលការហៅសំឡេងដើម · build កម្មវិធីដែលមានផ្ទាំងបញ្ជាក់សំឡេងដើម (មិនទាន់មាន)បិទ
  • អ្នកហៅ (អ្នកដែលធ្វើការហៅ) ត្រូវមានអាយុចាប់ពី 19 ឆ្នាំឡើងទៅ ឃើញផ្ទាំងបញ្ជាក់ «An AI answers this call» (AI នឹងឆ្លើយការហៅនេះ) មុនពេលហៅ ហើយពេលតភ្ជាប់ ឮសំឡេងជូនដំណឹង AI មុនគេ (អ្វីដែលអ្នកហៅឃើញ)។ កម្មវិធីដែលគ្មានផ្ទាំងបញ្ជាក់ (រួមទាំងកម្មវិធី Telegram ដើម និង client ដូចជា Telethon) មិនមានប៊ូតុងហៅសម្រាប់បូតទេ។
  • សំឡេងនៃការហៅ managed (ការហៅដែលម៉ូដែល AI ឆ្លើយ) ទៅ Google — Gemini Live API របស់ Vertex AI នៅ Iowa សហរដ្ឋអាមេរិក (Google Cloud us-central1)។ Pabal មិនរក្សាទុកសំឡេងទេ។ Google មិនរក្សាទុកសំឡេង និងអត្ថបទក្រោយពេលបង្កើតចម្លើយទេ ប៉ុន្តែខ្លឹមសារដែលការត្រួតពិនិត្យស្វ័យប្រវត្តិសង្ស័យថាជាការរំលោភបំពាន អាចត្រូវបានកត់ត្រារហូតដល់ 90 ថ្ងៃ (ដូចខ្លឹមសារនៅលើផ្ទាំងបញ្ជាក់)។ engine ដែលប្រើក្នុងផលិតកម្មមានតែមួយនេះប៉ុណ្ណោះ ហើយមិនប្តូរទៅអ្នកផ្តល់សេវាផ្សេងដោយស្ងាត់ៗទេ (គ្មានការប្តូរដោយស្វ័យប្រវត្តិ)។
  • ខុសពីការហៅរវាងមនុស្ស ការហៅបូតមិនត្រូវបានអ៊ិនគ្រីបពីចុងដល់ចុងទេ៖ gateway សំឡេងរបស់ Pabal ឌិគ្រីបសំឡេង ហើយបញ្ជូនទៅម៉ូដែល AI។ ផ្ទាំងបញ្ជាក់របស់អ្នកហៅប្រាប់អំពីរឿងនេះ។

ដំណើរនៃការហៅមួយ

អ្នកហៅ Pabal (ម៉ាស៊ីនមេរបស់ប្រតិបត្តិករ) ក្រៅ Pabal កម្មវិធី Pabal ផ្ទាំងបញ្ជាក់ · 19+ build ដែលបានកែ pabal-server MTProto · Bot API ការទទួល · ដែនកំណត់ កំណត់ត្រាការហៅ កម្មវិធីម្ចាស់បូត Bot API (HTTPS) កូដ និងម៉ាស៊ីនមេរបស់អ្នក coturn បញ្ជូនបន្តតែប៉ុណ្ណោះ pabal-voice សារ AI · សេចក្តីណែនាំ មិនរក្សាទុកសំឡេង Google Vertex AI Gemini Live us-central1 (អាមេរិក) ① ហៅ ② តំណ ការហៅ · ការកំណត់ · ឧបករណ៍ ③ voice_call · សំណួរ ការកំណត់ · លទ្ធផល · endVoiceCall សំឡេង (តាមការបញ្ជូនបន្ត) ④ សំឡេង ↔ AI ឆ្លើយ
ការហៅ managed៖ សញ្ញានៅខាងលើ សំឡេងនៅខាងក្រោម

ការពន្យល់ដ្យាក្រាម

  • តំបន់បី៖ កម្មវិធីរបស់អ្នកហៅ → ម៉ាស៊ីនមេរបស់ប្រតិបត្តិករ Pabal (ម៉ាស៊ីនមេ Pabal, gateway សំឡេង និងម៉ាស៊ីនមេបញ្ជូនបន្ត) → ក្រៅ Pabal (ម៉ូដែល AI របស់ Google និងកម្មវិធីរបស់ម្ចាស់បូត)។ កូដរបស់ម្ចាស់បូតមិនឃើញសំឡេងសូម្បីតែមួយបៃទេ។
  • ① ហៅ៖ កម្មវិធីប្រាប់ម៉ាស៊ីនមេអំពីការយល់ព្រមដែលទទួលបានពីផ្ទាំងបញ្ជាក់ រួចទើបហៅ។ ម៉ាស៊ីនមេពិនិត្យទាំងអ្នកហៅ (ការយល់ព្រម — បញ្ជាក់ខ្លួនឯងថាមានអាយុចាប់ពី 19 ឆ្នាំ · build កម្មវិធី · អ្នកសាកល្បង · ដែនកំណត់) និងបូត (ការអនុញ្ញាត · ការកំណត់ · ដែនកំណត់) ហើយទទួល ឬបញ្ចប់ដោយសញ្ញារវល់។
  • ② តំណ៖ ម៉ាស៊ីនមេប្រគល់ការហៅទៅ gateway សំឡេង ព្រមទាំងផ្ញើសេចក្តីណែនាំ ពាក្យស្វាគមន៍ សំឡេង ភាសា និងឧបករណ៍របស់ម្ចាស់បូតទៅជាមួយ។ gateway តែងដាក់ច្បាប់មូលដ្ឋានរបស់ Pabal (ដូចជាការប្រាប់ថាជា AI) មុនជានិច្ច ទើបដាក់សេចក្តីណែនាំនៅពីក្រោយ។
  • ③ Bot API៖ កម្មវិធីរបស់ម្ចាស់បូតរៀបចំការកំណត់ ទទួល voice_call ពេលការហៅចាប់ផ្តើម និងបញ្ចប់ ហើយទទួល voice_call_tool_query ពេលម៉ូដែលហៅឧបករណ៍ រួចឆ្លើយ។ ព្រួញខៀវនៃ ③ គឺអ្វីដែលម៉ាស៊ីនមេផ្ញើទៅបូត ហើយព្រួញប្រផេះខាងក្រោមគឺអ្វីដែលបូតផ្ញើទៅម៉ាស៊ីនមេ។
  • ④ សំឡេង (ជួរខាងក្រោម)៖ កម្មវិធី និង gateway មិនដឹងអាសយដ្ឋានរបស់គ្នាទេ ហើយផ្លាស់ប្តូរសំឡេងតែតាមម៉ាស៊ីនមេបញ្ជូនបន្ត (coturn) ប៉ុណ្ណោះ។ gateway បញ្ជូនសំឡេងទៅម៉ូដែលរបស់ Google ហើយទទួលចម្លើយត្រឡប់មកវិញ។ ប្រអប់ក្រហមគឺជាកន្លែងដែលសំឡេងចេញពី Pabal។
  • ក្នុងរបៀបសំឡេងដើម ម៉ាស៊ីនមេរបស់ម្ចាស់បូតចូលជំនួសកន្លែងរបស់ Google នៅ ④ (របៀបសំឡេងដើម)។

ការហៅពី Apple Watch (កំពុងរៀបចំ)

កម្មវិធីនាឡិកាមិនប្រើ MTProto ទេ។ នាឡិកាចូលគណនី ទទួលបញ្ជីបូត និងផ្ទាំងបញ្ជាក់ ហើយហៅ តាម API នាឡិកា (HTTPS JSON) របស់ម៉ាស៊ីនមេ។ ម៉ាស៊ីនមេឆ្លងកាត់ការទទួលដូចការហៅពីកម្មវិធី រួចឲ្យសំបុត្រប្រើតែម្តង (15 វិនាទី) ដែលប្រើសម្រាប់តែការហៅនោះ ទៅនាឡិកា ហើយប្រគល់ការហៅទៅ gateway។ នាឡិកាកាន់សំបុត្រនោះ ភ្ជាប់ទៅច្រកចូលសំឡេង (WSS, pabal-voice-edge) ហើយច្រកចូលភ្ជាប់សំឡេងទៅកិច្ចការ gateway ដែលទទួលខុសត្រូវការហៅនោះ។ គ្មានការផ្លាស់ប្តូរសោ (DH) ហើយក៏គ្មានការបញ្ជូនបន្តការហៅ (coturn) ដែរ។ ទោះយ៉ាងណា gateway នៅតែដោះសំឡេង ហើយបញ្ជូនទៅម៉ូដែល ដូច្នេះវាមិនមែនការអ៊ិនគ្រីបពីចុងដល់ចុងទេ ហើយកន្លែងដែលសំឡេងទៅក៏ដូចគ្នាដែរ។ ម្ចាស់បូតទទួល voice_call ដូចការហៅពីកម្មវិធីទាំងស្រុង (មានតែពេលវេលានៃ started ដែលខុសគ្នា ខាងក្រោម)។

ការបើកការហៅជាសំឡេង

ការបើកការហៅជាសំឡេង ត្រូវធ្វើដោយមនុស្សនៅ @BotFather — ព្រោះការយល់ព្រមច្បាប់បូតសំឡេង ជាការសន្យារបស់ម្ចាស់បូត មិនមែនរបស់តូខឹនទេ។ ការកំណត់ផ្សេងទៀតអាចធ្វើបានទាំងនៅ @BotFather និងតាម Bot API។

  1. សុំប្រតិបត្តិករឲ្យអនុញ្ញាតបូត។ នៅលើម៉ាស៊ីនមេដែលទទួលតែបូតដែលបានអនុញ្ញាត (លំនាំដើម) រហូតដល់ប្រតិបត្តិករអនុញ្ញាតតាម ID បូត (លេខនៅមុខ : នៃតូខឹន) នៅក្នុងផ្ទាំងសំឡេងនៃទំព័រគ្រប់គ្រង នោះ @BotFather មិនមានប៊ូតុងការហៅជាសំឡេងទេ ហើយការផ្លាស់ប្តូរការកំណត់នឹងទទួល 403 VOICE_NOT_AVAILABLE។ បើមិនទាន់បើកជាសាធារណៈ សូមសុំឲ្យដាក់គណនីរបស់អ្នកដែលនឹងសាកហៅ ជាអ្នកសាកល្បងផងដែរ (id អ្នកប្រើរបស់អ្នក គឺ message.from.id នៃ getUpdates ក្រោយពេលអ្នកផ្ញើសារទៅបូត)។
  2. កំណត់សេចក្តីណែនាំ។ វាជាអត្ថបទដែលសរសេរថាបូតធ្វើអ្វីក្នុងការហៅ។ កំណត់វាដោយ setVoiceCallSettings ខាងក្រោម ឬផ្ញើតាមប៊ូតុង សេចក្តីណែនាំ (지시문) នៅលើអេក្រង់ការហៅជាសំឡេងនៃ @BotFather។ បើគ្មានសេចក្តីណែនាំ មិនអាចបើកបានទេ (លើកលែងរបៀបសំឡេងដើម)។
  3. នៅ @BotFather៖ /mybots → បូត → ការហៅជាសំឡេង (음성 통화) → បើក (켜기)។ លើកដំបូង ច្បាប់បូតសំឡេងនឹងបង្ហាញ ហើយពេលចុច យល់ព្រមច្បាប់ ហើយបើក (규칙에 동의하고 켜기) វាបើក។ ពីលើកក្រោយ វាគ្រាន់តែសួរថា «បើកឬ?» (켤까요?)។
  4. រង់ចាំការអនុញ្ញាតម្តងទៀត។ នៅលើម៉ាស៊ីនមេដែលទទួលតែបូតដែលបានអនុញ្ញាត ការអនុញ្ញាត គឺអនុញ្ញាតសេចក្តីណែនាំ ពាក្យស្វាគមន៍ និងឧបករណ៍នៅពេលនោះ ដូច្នេះបើអ្នកសរសេរសេចក្តីណែនាំក្រោយពេលត្រូវបានអនុញ្ញាត វានឹងក្លាយជា unavailable_reason: "awaiting_review"។ ប្រតិបត្តិករត្រូវពិនិត្យ ហើយអនុញ្ញាតម្តងទៀត ទើបវាទទួលការហៅ។ វាដូចគ្នារាល់ពេលដែលអ្នកផ្លាស់ប្តូរមួយក្នុងចំណោមបីនេះ (ក្នុងរបៀបសំឡេងដើម គឺអាសយដ្ឋានសំឡេងដើម)។ បើភាសាបូតមិនមែនជាភាសាកូរ៉េ ឬអង់គ្លេសទេ សូម្បីតែនៅលើម៉ាស៊ីនមេដែលទទួលបូតទាំងអស់ ប្រតិបត្តិករក៏ត្រូវអានសេចក្តីណែនាំ និងពាក្យស្វាគមន៍ ហើយអនុញ្ញាតជាមុនសិន ទើបវាទទួលការហៅ (សំឡេង និងភាសា)។
  5. មើលថា available នៃ getVoiceCallSettings ជា true ឬអត់ រួចសាកហៅដោយប៊ូតុងហៅនៅក្នុងប្រវត្តិរូបបូត ពីbuild កម្មវិធីដែលមានផ្ទាំងបញ្ជាក់។
켜기
BotFather음성 통화를 켜기 전에 음성 봇 규칙을 확인해 주세요. 1. 봇은 언제나 AI 라고 밝혀요. 사람인 척하게 할 수 없어요. 2. 실제 기관·회사·사람을 사칭할 수 없어요. 3. 카드 번호·주민등록번호·비밀번호·인증 번호를 묻게 할 수 없어요. 4. 통화 소리는 파발이 저장하지 않고, 대답을 만들기 위해 Google(Vertex AI)로 보내져요. 5. 봇과의 음성 통화는 만 19세 이상만 할 수 있어요. 6. 규칙을 어기면 운영자가 음성 통화나 봇을 멈출 수 있어요.
규칙에 동의하고 켜기
BotFather음성 통화를 켰어요. 음성 통화 · @order_helper_bot 상태: 켜짐 목소리: Kore (단단한) · 언어: 한국어 … 전화를 받으면 먼저 "AI 음성 봇과 연결되었습니다" 안내가 나가고, 그다음 봇이 인사해요.

បច្ចុប្បន្ន BotFather ឆ្លើយជាភាសាកូរ៉េ។ ក្នុងការសន្ទនាខាងលើ ក្រោយពេលអ្នកចុច បើក BotFather បង្ហាញច្បាប់បូតសំឡេង៖

  1. បូតតែងតែប្រាប់ថាខ្លួនជា AI។ មិនអាចឲ្យវាធ្វើពុតជាមនុស្សបានទេ។
  2. មិនអាចក្លែងបន្លំជាស្ថាប័ន ក្រុមហ៊ុន ឬមនុស្សពិតប្រាកដបានទេ។
  3. មិនអាចឲ្យវាសួរលេខកាត លេខអត្តសញ្ញាណផ្ទាល់ខ្លួន ពាក្យសម្ងាត់ ឬលេខកូដផ្ទៀងផ្ទាត់បានទេ។
  4. Pabal មិនរក្សាទុកសំឡេងនៃការហៅទេ ហើយសំឡេងត្រូវបានផ្ញើទៅ Google (Vertex AI) ដើម្បីបង្កើតចម្លើយ។
  5. មានតែអ្នកដែលមានអាយុចាប់ពី 19 ឆ្នាំឡើងទៅទេ ដែលអាចហៅជាសំឡេងជាមួយបូតបាន។
  6. បើបំពានច្បាប់ ប្រតិបត្តិករអាចផ្អាកការហៅជាសំឡេង ឬបូតបាន។

ក្រោយពេលអ្នកចុច យល់ព្រមច្បាប់ ហើយបើក BotFather ប្រាប់ថាបានបើកការហៅជាសំឡេង ហើយបង្ហាញអេក្រង់ស្ថានភាព (បូត @order_helper_bot · ស្ថានភាព៖ បើក · សំឡេង៖ Kore (រឹងមាំ) · ភាសា៖ កូរ៉េ …) ព្រមទាំងរំលឹកថា ពេលទទួលការហៅ សេចក្តីជូនដំណឹង "AI 음성 봇과 연결되었습니다" (ជាភាសាអង់គ្លេស៖ «You're now talking to an AI voice bot.») ត្រូវបានចាក់មុន បន្ទាប់មកបូតទើបស្វាគមន៍។

នៅលើម៉ាស៊ីនមេដែលទទួលតែបូតដែលបានអនុញ្ញាត ស្ថានភាពអាចបង្ហាញជា "켜짐 — 바뀐 지시문·인사말을 운영자가 확인할 때까지 전화를 받지 않아요" (បើក — មិនទទួលការហៅទេ រហូតដល់ប្រតិបត្តិករពិនិត្យសេចក្តីណែនាំ និងពាក្យស្វាគមន៍ដែលបានផ្លាស់ប្តូរ) (ជំហានទី 4 ខាងលើ)។ បើភាសាបូតមិនមែនជាភាសាកូរ៉េ ឬអង់គ្លេសទេ នៅលើម៉ាស៊ីនមេណាក៏ដោយ មុនពេលប្រតិបត្តិករអនុញ្ញាត ស្ថានភាពបង្ហាញជា "켜짐 — 한국어·영어가 아닌 봇은 운영자가 지시문·인사말을 읽고 허용할 때까지 전화를 받지 않아요 (자동 규칙 검사가 한국어와 영어만 읽어요)" (បើក — បូតដែលមិនមែនជាភាសាកូរ៉េ ឬអង់គ្លេស មិនទទួលការហៅទេ រហូតដល់ប្រតិបត្តិករអានសេចក្តីណែនាំ និងពាក្យស្វាគមន៍ ហើយអនុញ្ញាត ព្រោះការពិនិត្យច្បាប់ស្វ័យប្រវត្តិអានបានតែភាសាកូរ៉េ និងអង់គ្លេស)។

អេក្រង់ការហៅជាសំឡេងមានប៊ូតុង បើក/បិទ · សេចក្តីណែនាំ · ពាក្យស្វាគមន៍ · សំឡេង · ភាសា · ដែនកំណត់ · ការប្រើប្រាស់ · កំណត់ត្រាសន្ទនា · សោផ្ទាល់ខ្លួន · របៀបសំឡេងដើម និង (នៅលើម៉ាស៊ីនមេដែលបើក MCP) ម៉ាស៊ីនមេ MCP។ ទោះបីក្រោយពេលសំឡេងត្រូវបិទ ឬការអនុញ្ញាតត្រូវដកចេញក៏ដោយ ការបិទ និងការលុបធ្វើបានជានិច្ច — បិទសំឡេង · លុបសោផ្ទាល់ខ្លួន · បិទរបៀបសំឡេងដើម · លុបម៉ាស៊ីនមេ MCP។

ពេលបើក និងរាល់ការហៅ ឈ្មោះបូតក៏ត្រូវពិនិត្យការក្លែងបន្លំដែរ។ បូតដែលប្រើឈ្មោះស្ថាប័ន ឬក្រុមហ៊ុនពិតប្រាកដ នឹងមិនបើកទេ ដោយមាន VOICE_CONTENT_REFUSED: name: impersonation។ បើវាពិតជាបូតរបស់ស្ថាប័ននោះ សូមប្រាប់ផ្នែកជំនួយរបស់ម៉ាស៊ីនមេ។

ការកំណត់ — setVoiceCallSettings

កំណត់ការកំណត់សំឡេងរបស់បូត។ វាជាការកែមួយផ្នែក ដែលមានតែអ្វីដែលបានផ្ញើទេដែលផ្លាស់ប្តូរ ហើយវាពិនិត្យទាំងមូល រួចសរសេរម្តងតែមួយ ឬបដិសេធទាំងអស់។ បើគ្មានអ្វីផ្លាស់ប្តូរទេ វាមិនសរសេរអ្វីទាំងអស់។

curl -s "https://pabal.me/bot$BOT_TOKEN/setVoiceCallSettings" -H 'Content-Type: application/json' -d '{
  "instructions": "អ្នកជាបុគ្គលិកឆ្លើយទូរស័ព្ទរបស់ហាង Order Helper។ សូមឆ្លើយខ្លីៗ និងគួរសម។ ហាងបើកពីម៉ោង 10 ព្រឹក ដល់ម៉ោង 8 យប់។",
  "greeting": "Order Helper សូមស្តាប់។ តើខ្ញុំអាចជួយអ្វីបានខ្លះ?",
  "voice": "kore",
  "language": "ko-KR",
  "max_call_duration": 180
}'
# {"ok":true,"result":true}
ប៉ារ៉ាម៉ែត្រប្រភេទការពិពណ៌នា
enabledBooleanបើក · បិទ។ ដើម្បីបើក ត្រូវបានយល់ព្រមច្បាប់នៅ @BotFather រួចហើយ (បើមិនទាន់ទេ នឹងទទួល 403 VOICE_RULES_NOT_ACCEPTED) ហើយបើជា managed ត្រូវមានសេចក្តីណែនាំ។ ការបិទធ្វើបានជានិច្ច — ការហៅដែលកំពុងដំណើរការ នៅបន្តរហូតដល់ចប់ មានតែការហៅថ្មីទេដែលមិនត្រូវទទួល
instructionsStringសេចក្តីណែនាំដែលម៉ូដែលអនុវត្តតាម។ រហូតដល់ UTF-8 8,192 បៃ (ប្រហែល 2,700 តួអក្សរខ្មែរ ឬកូរ៉េ)។ "" មានន័យថាលុប — បូត managed ដែលកំពុងបើក មិនអាចទុកទទេបានទេ។ កាន់តែវែង ថ្លៃការហៅកាន់តែកើន ហើយអ្នកហៅអាចលួងសួររកខ្លឹមសាររបស់វាបាន ដូច្នេះកុំដាក់ពាក្យសម្ងាត់ ឬសោ
greetingStringពាក្យដំបូងដែលបូតនិយាយក្រោយសេចក្តីជូនដំណឹង AI។ រហូតដល់ 512 បៃ (ប្រហែល 170 តួអក្សរខ្មែរ ឬកូរ៉េ)។ បើ "" ម៉ូដែលស្វាគមន៍ខ្លីៗដោយខ្លួនឯង
voiceStringid សំឡេង (បញ្ជី) · លំនាំដើម kore
languageStringភាសាដែលបូតនិយាយ និងស្តាប់យល់។ ជា id មួយក្នុងចំណោម id ទាំង 9 (លំនាំដើម ko-KR · បញ្ជី)។ zh-CN ត្រូវរក្សាទុកជា cmn-CN ហើយ id ដែលខុសគ្នាតែអក្សរធំតូច (ja-jp) ត្រូវរក្សាទុកតាមទម្រង់ក្នុងបញ្ជី។ បើមិនមែនជាភាសាកូរ៉េ ឬអង់គ្លេសទេ បូតទទួលការហៅតែបន្ទាប់ពីប្រតិបត្តិករអានសេចក្តីណែនាំ និងពាក្យស្វាគមន៍ ហើយអនុញ្ញាតប៉ុណ្ណោះ។ សំឡេងជូនដំណឹង AI នៅដើមការហៅ មិនតាមតម្លៃនេះទេ តែតាមភាសានៃផ្ទាំងបញ្ជាក់ដែលអ្នកហៅបានឃើញ
max_call_durationIntegerរយៈពេលអតិបរមានៃការហៅមួយ (វិនាទី)។ ចាប់ពី 60 ហើយមិនលើស limits.max_call_duration (តម្លៃតូចជាងរវាងពិដានរបស់ប្រតិបត្តិករ និងម៉ាស៊ីនមេ · លំនាំដើម 600)។ លំនាំដើមរបស់បូតគឺ 300
max_concurrent_callsIntegerចំនួនការហៅដែលទទួលក្នុងពេលតែមួយ។ ចាប់ពី 1 ហើយមិនលើស limits.max_concurrent_calls (លំនាំដើម 2)។ លំនាំដើមរបស់បូតគឺ 2
toolsArrayឧបករណ៍របស់បូតដែលម៉ូដែលអាចហៅក្នុងពេលការហៅ (ឧបករណ៍)។ [] មានន័យថាលុបទាំងអស់
transcriptBooleanកុងតាក់កំណត់ត្រាសន្ទនា (កំណត់ត្រាសន្ទនា)
mode, stream_url, stream_secretStringរបៀបសំឡេងដើម (ការកំណត់របៀបសំឡេងដើម)
model, api_keyមិនទទួល — VOICE_FIELD_NOT_AVAILABLE។ ម៉ូដែលត្រូវបានកំណត់ដោយម៉ាស៊ីនមេ ហើយសោកំណត់បានតែតាម setVoiceCallApiKey ប៉ុណ្ណោះ
  • ច្បាប់ខ្លឹមសារ៖ សេចក្តីណែនាំ ពាក្យស្វាគមន៍ និងការពិពណ៌នាឧបករណ៍ ត្រូវពិនិត្យពេលរក្សាទុក និងពេលហៅ។ ការឲ្យនិយាយថាជាមនុស្ស (claims_human) ការឲ្យលាក់ថាជា AI (hides_ai) ការប្រាប់ឲ្យមិនអើពើច្បាប់ Pabal (overrides_rules) ការក្លែងបន្លំជាស្ថាប័ន ឬក្រុមហ៊ុនពិតប្រាកដ (impersonation) ការណែនាំខ្លួនថាជាស្ថាប័នផ្លូវការ (official_claim) ការសួរលេខកាត · លេខអត្តសញ្ញាណផ្ទាល់ខ្លួន · ពាក្យសម្ងាត់ · លេខកូដផ្ទៀងផ្ទាត់ (asks_secrets) អត្ថបទដែលមើលទៅដូចសោសម្ងាត់ (looks_like_secret) និងតួអក្សរមើលមិនឃើញ (hidden_text) ត្រូវបដិសេធដោយ VOICE_CONTENT_REFUSED: <វាល>: <កូដ>។ ប្រយោគបដិសេធដូចជា «កុំសួរពាក្យសម្ងាត់ជាដាច់ខាត» អាចឆ្លងកាត់បាន។
  • ច្បាប់មូលដ្ឋានរបស់ Pabal តែងនៅមុនជានិច្ច។ រាល់ការហៅ ម៉ូដែលអានតាមលំដាប់៖ ច្បាប់របស់ Pabal → សេចក្តីណែនាំរបស់ម្ចាស់បូត → ផ្នែកបញ្ចប់នៃច្បាប់ Pabal ហើយសេចក្តីណែនាំត្រូវបានដាក់ក្នុងប្រអប់ដែលសម្គាល់ថា «អត្ថបទរបស់ម្ចាស់បូត»។ សេចក្តីណែនាំមិនអាចជំនួស ឬនៅមុនច្បាប់របស់ Pabal បានទេ។
  • អាចផ្លាស់ប្តូរបាន30 ដងក្នុងមួយម៉ោង (រួមជាមួយ @BotFather រាប់តែការផ្លាស់ប្តូរពិតប្រាកដ)។ បើលើស នឹងទទួល 429 Too Many Requests: retry after N និង parameters.retry_after។
  • ពេលផ្ញើជា form (-d name=value) tools ត្រូវដាក់ជាខ្សែអក្សរ JSON។
  • បូតដែលចូលតែតាម MTProto ផ្ញើ JSON ដដែលតាម bots.sendCustomRequest (បូត MTProto)។

មើលការកំណត់បច្ចុប្បន្ន — getVoiceCallSettings

curl -s "https://pabal.me/bot$BOT_TOKEN/getVoiceCallSettings"
{
  "ok": true,
  "result": {
    "enabled": true,
    "available": true,
    "suspended": false,
    "rules_accepted": true,
    "instructions": "អ្នកជាបុគ្គលិកឆ្លើយទូរស័ព្ទរបស់ហាង Order Helper។ …",
    "greeting": "Order Helper សូមស្តាប់។ តើខ្ញុំអាចជួយអ្វីបានខ្លះ?",
    "voice": "kore",
    "language": "ko-KR",
    "max_call_duration": 180,
    "max_concurrent_calls": 2,
    "limits": {"max_call_duration": 600, "max_concurrent_calls": 2, "bot_minutes_per_day": 60, "owner_minutes_per_day": 120},
    "voices": [{"id": "zephyr", "name": "Zephyr", "description": "Bright"}, …],
    "languages": ["ko-KR", "en-US", "ja-JP", "cmn-CN", "fr-FR", "es-US", "id-ID", "vi-VN", "ar-EG"],
    "testers_only": true,
    "mode": "managed",
    "has_stream_secret": false,
    "owner_terms_accepted": false,
    "stream_available": false,
    "updated_date": 1790380712,
    "tools": [],
    "tool_limits": {"max_tools": 16, "max_definition_bytes": 8192, "definition_bytes": 0, "mcp_tools": 0},
    "tool_delivery": "none",
    "transcript": false,
    "transcript_available": false,
    "transcript_delivery": "get_updates",
    "has_api_key": false,
    "own_keys_available": false,
    "mcp_available": false
  }
}
វាលអត្ថន័យ
enabledម្ចាស់បូតបានបើកឬនៅ
available, unavailable_reasonថាតើឥឡូវនេះបូតអាចទទួលការហៅពីនរណាក៏ដោយឬអត់ ហើយបើមិនអាច មូលហេតុ (តារាងខាងក្រោម)
rules_accepted, owner_terms_acceptedបានយល់ព្រមច្បាប់បូតសំឡេង និងលក្ខខណ្ឌម្ចាស់បូតបច្ចុប្បន្ន (កំណែ 4) ឬនៅ
limitsតម្លៃអតិបរមាដែលអាចកំណត់បាននៅលើម៉ាស៊ីនមេនេះ និងដែនកំណត់ប្រចាំថ្ងៃ (នាទី)
voices, languagesសំឡេង និងភាសាដែលអាចជ្រើសបាន
testers_onlytrue បើមិនទាន់បើកជាសាធារណៈ ដូច្នេះមានតែអ្នកសាកល្បងដែលប្រតិបត្តិករកំណត់ទេដែលហៅបាន
tools, tool_limits, tool_delivery, tool_delivery_problemឧបករណ៍ និងដែនកំណត់របស់វា កន្លែងដែលសំណួរឧបករណ៍ទៅឥឡូវនេះ (webhook·get_updates·mtproto·none) និងមូលហេតុដែលវាមិនអាចទៅដល់ (ការទទួលសំណួរឧបករណ៍)
mode, stream_url, stream_secret_fingerprint, has_stream_secret, stream_available, stream_ignoresរបៀបសំឡេងដើម — សម្ងាត់មិនបង្ហាញទេ មានតែស្នាមម្រាមដៃ 8 ខ្ទង់
transcript, transcript_available, transcript_unavailable_reason, transcript_delivery, transcript_delivery_problemកុងតាក់កំណត់ត្រាសន្ទនា និងថាតើវាពិតជានឹងត្រូវបញ្ជូនឥឡូវនេះឬអត់
has_api_key, api_key, own_keys_availableសោម៉ូដែលផ្ទាល់ខ្លួន — សោមិនបង្ហាញទេ មានតែអ្នកផ្តល់សេវា · ស្នាមម្រាមដៃ · ថ្ងៃដែលបានកំណត់ · អាចប្រើបានឬអត់
mcp_available, mcp_servers, mcp_unavailable_reasonម៉ាស៊ីនមេ MCP
outboundស្ថានភាពនៃការហៅពីបូត (ការហៅពីបូត — ការកំណត់ និងការប្រើប្រាស់)
updated_dateពេលផ្លាស់ប្តូរចុងក្រោយ (វិនាទី Unix)
unavailable_reasonអត្ថន័យ
voice_offសំឡេងកំពុងបិទនៅលើម៉ាស៊ីនមេនេះ ឬគោលការណ៍ឯកជនភាពមិនទាន់មានផ្នែកការហៅបូត
kill_switchប្រតិបត្តិករបានបញ្ឈប់ការហៅជាសំឡេងទាំងអស់
bot_voice_offម្ចាស់បូតមិនទាន់បើក
not_allowedប្រតិបត្តិករមិនទាន់អនុញ្ញាតបូតនេះ
awaiting_reviewប្រតិបត្តិករមិនទាន់ពិនិត្យសេចក្តីណែនាំ · ពាក្យស្វាគមន៍ · ឧបករណ៍ដែលបានផ្លាស់ប្តូរ (ក្នុងរបៀបសំឡេងដើម គឺអាសយដ្ឋានសំឡេងដើម)។ បើភាសាបូតមិនមែនជាភាសាកូរ៉េ ឬអង់គ្លេសទេ សូម្បីតែនៅលើម៉ាស៊ីនមេដែលទទួលបូតទាំងអស់ ប្រតិបត្តិករក៏ត្រូវអានសេចក្តីណែនាំ និងពាក្យស្វាគមន៍ ហើយអនុញ្ញាតដែរ
suspendedប្រតិបត្តិករបានផ្អាកសំឡេងរបស់បូតនេះ (ឬគណនីម្ចាស់)
name_refused, text_refusedឈ្មោះបូត ឬសេចក្តីណែនាំ · ពាក្យស្វាគមន៍ · ការពិពណ៌នាឧបករណ៍ដែលបានរក្សាទុក មិនត្រូវនឹងច្បាប់ខ្លឹមសារបច្ចុប្បន្ន។ text_refused ក៏កើតឡើងដែរ ពេលភាសាដែលបូតបានជ្រើស ត្រូវដកចេញពីបញ្ជី ហើយលែងប្រើបានទៀត — សូមជ្រើសភាសាម្តងទៀត
no_relay, no_gatewayម៉ាស៊ីនមេគ្មានការបញ្ជូនបន្តការហៅ ឬ gateway សំឡេង
no_gateway_with_tools, no_own_key_gatewayគ្មាន gateway ណាអាចប្រើឧបករណ៍ ឬសោផ្ទាល់ខ្លួនរបស់បូតនេះបាន
no_gateway_with_languageគ្មាន gateway ណាដែលធ្វើការហៅជាភាសារបស់បូតនេះ កំពុងភ្ជាប់ទេ (សំឡេង និងភាសា)
own_key_unavailable, stream_unavailableសោផ្ទាល់ខ្លួន ឬរបៀបសំឡេងដើមដែលបានកំណត់ មិនអាចប្រើបានឥឡូវនេះ ដូច្នេះមិនទទួលការហៅ (មិនទទួលជំនួសដោយសោរបស់វេទិកាទេ)

សំឡេង និងភាសា

ជ្រើសពីសំឡេងដែលបង្កើតរួច 30 របស់ Gemini Live (លំនាំដើម kore)។ គ្មានមុខងារបង្ហោះ ឬចម្លងសំឡេងទេ។ ប៊ូតុង សំឡេង (목소리) របស់ @BotFather ឲ្យជ្រើសតាមឈ្មោះ និងអារម្មណ៍។

idអារម្មណ៍idអារម្មណ៍idអារម្មណ៍
zephyrភ្លឺស្វាងpuckរីករាយcharonច្បាស់
koreរឹងមាំfenrirរំភើបledaក្មេងស្រស់
orusរឹងមាំaoedeស្រស់ស្រាយcallirrhoeធូរស្រាល
autonoeភ្លឺស្វាងenceladusលាយដង្ហើមiapetusថ្លា
umbrielធូរស្រាលalgiebaទន់ភ្លន់despinaទន់ភ្លន់
erinomeថ្លាalgenibគ្រើមrasalgethiច្បាស់
laomedeiaរីករាយachernarស្រទន់alnilamរឹងមាំ
schedarស្ងប់ស្ងាត់gacruxចាស់ទុំpulcherrimaសកម្ម
achirdរួសរាយzubenelgenubiស្រួលស្តាប់vindemiatrixស្និទ្ធស្នាល
sadachbiaរស់រវើកsadaltagerចេះដឹងsulafatកក់ក្តៅ

ភាសា (language) គឺជាភាសាមួយក្នុងចំណោម 9 ខាងក្រោម។ វាជាភាសាដែលបូតនិយាយ និងស្តាប់យល់ ហើយបូតឆ្លើយជាភាសានេះ។ នៅ @BotFather អ្នកជ្រើសវាដោយប៊ូតុង ភាសា (언어) នៅលើអេក្រង់ការហៅជាសំឡេង។

idភាសាអ្វីដែលគួរដឹង
ko-KRភាសាកូរ៉េលំនាំដើម
en-USភាសាអង់គ្លេស—
ja-JPភាសាជប៉ុន—
cmn-CNភាសាចិន (កុកងឺ)ស្ថិតនៅក្រៅបញ្ជីភាសាដែល Google គាំទ្រជាផ្លូវការ ដូច្នេះ Google មិនធានាគុណភាពទេ (ក្នុងការសាកល្បង ទាំងការស្តាប់យល់ និងចម្លើយសុទ្ធតែត្រឹមត្រូវ)។ ទោះផ្ញើជា zh-CN ក៏ទទួលដែរ ហើយរក្សាទុកជា cmn-CN
fr-FRភាសាបារាំង—
es-USភាសាអេស្ប៉ាញ—
id-IDភាសាឥណ្ឌូណេស៊ី—
vi-VNភាសាវៀតណាម—
ar-EGភាសាអារ៉ាប់ (ស្តង់ដារ)និយាយជាភាសាអារ៉ាប់ស្តង់ដារទំនើប។ កូដគឺ ar-EG ដែលជាកូដភាសាអារ៉ាប់តែមួយគត់ក្នុងម៉ូដែលពេលវេលាជាក់ស្តែងរបស់ Google ប៉ុន្តែកូដនេះមិនកំណត់គ្រាមភាសាទេ — បូតនិយាយគ្រាមភាសាណាមួយ តែពេលសេចក្តីណែនាំស្នើសុំគ្រាមភាសានោះប៉ុណ្ណោះ
  • បូតដែលមិនមែនជាភាសាកូរ៉េ ឬអង់គ្លេស ទទួលការហៅតែបន្ទាប់ពីប្រតិបត្តិករអានសេចក្តីណែនាំ និងពាក្យស្វាគមន៍ ហើយអនុញ្ញាតប៉ុណ្ណោះ — សូម្បីតែនៅលើម៉ាស៊ីនមេដែលទទួលបូតទាំងអស់ក៏ដោយ។ ព្រោះការពិនិត្យច្បាប់ស្វ័យប្រវត្តិពេលរក្សាទុក (ការធ្វើពុតជាមនុស្ស ការក្លែងបន្លំ ។ល។) អានបានតែភាសាកូរ៉េ និងអង់គ្លេសប៉ុណ្ណោះ។ មុនការអនុញ្ញាត វាជា unavailable_reason: "awaiting_review" ហើយបើអ្នកផ្លាស់ប្តូរសេចក្តីណែនាំ ពាក្យស្វាគមន៍ ឬឧបករណ៍ក្រោយការអនុញ្ញាត វានឹងរង់ចាំការអនុញ្ញាតម្តងទៀត។ នៅលើអេក្រង់ជ្រើសភាសា និងក្រោយពេលអ្នកជ្រើសរួច @BotFather ប្រាប់ថា "한국어·영어가 아닌 언어는 자동 규칙 검사가 읽지 못해서, 운영자가 지시문·인사말을 읽고 허용한 뒤에 전화를 받아요." (ការពិនិត្យច្បាប់ស្វ័យប្រវត្តិអានភាសាក្រៅពីកូរ៉េ និងអង់គ្លេសមិនបាន ដូច្នេះបូតទទួលការហៅតែបន្ទាប់ពីប្រតិបត្តិករអានសេចក្តីណែនាំ និងពាក្យស្វាគមន៍ ហើយអនុញ្ញាត)។ នៅក្នុងផ្ទាំងសំឡេងនៃទំព័រគ្រប់គ្រងរបស់ប្រតិបត្តិករ បូតនោះបង្ហាញជា "한국어·영어가 아닌 봇 (자동 규칙 검사가 읽지 못함): 지시문·인사말을 읽어 주세요" (បូតដែលមិនមែនជាភាសាកូរ៉េ ឬអង់គ្លេស — ការពិនិត្យច្បាប់ស្វ័យប្រវត្តិអានមិនបាន៖ សូមអានសេចក្តីណែនាំ និងពាក្យស្វាគមន៍)។
  • ត្រូវមាន gateway ដែលធ្វើការហៅជាភាសារបស់បូត ទើបបូតទទួលការហៅបាន។ ពេល gateway ភ្ជាប់ទៅម៉ាស៊ីនមេ វាប្រកាសភាសាបូតដែលខ្លួនអាចធ្វើការហៅបាន (ចាប់ពី 0.7.0 ប្រកាសទាំង 9) ហើយ gateway ដែលមិនប្រកាសភាសា ត្រូវចាត់ទុកថាធ្វើការហៅបានតែភាសាកូរ៉េ និងអង់គ្លេស។ បើគ្មាន gateway ណាធ្វើការហៅជាភាសារបស់បូតទេ វាជា no_gateway_with_language ហើយប៊ូតុងហៅត្រូវលាក់។ វាមិនធ្វើការហៅជាភាសាផ្សេងជំនួសទេ។
  • id មិនប្រកាន់អក្សរធំតូចទេ (ja-jp) ហើយត្រូវរក្សាទុកតាមទម្រង់ក្នុងបញ្ជី។ តម្លៃដែលគ្មានក្នុងបញ្ជី ត្រូវបដិសេធដោយ VOICE_LANGUAGE_INVALID: language is one of ko-KR, en-US, ja-JP, cmn-CN, fr-FR, es-US, id-ID, vi-VN, ar-EG ដែលប្រាប់ពី id ដែលទទួលយក។
  • បើភាសាដែលបានជ្រើស ត្រូវដកចេញពីបញ្ជីនៅពេលក្រោយ បូតនោះរក្សាការកំណត់របស់ខ្លួនទុក ប៉ុន្តែមិនទទួលការហៅទេ (text_refused)។ វាមិនទទួលជំនួសជាភាសាផ្សេងទេ ដូច្នេះសូមជ្រើសម្តងទៀតតាមប៊ូតុង ភាសា របស់ @BotFather។
  • មិនទាន់អាចជ្រើសភាសាខ្មែរជាភាសាបូតបាននៅឡើយទេ។ ម៉ូដែលស្តាប់យល់ភាសាខ្មែរ ប៉ុន្តែចម្លើយដែលវានិយាយដោយសេរី មិនទាន់ត្រូវបានពិនិត្យដោយអ្នកនិយាយភាសាខ្មែរពីកំណើតនៅឡើយទេ។

បើអ្នកហៅនិយាយភាសាផ្សេងជាប់ៗ ម៉ូដែលនឹងឆ្លើយជាភាសានោះ។ សំឡេងជូនដំណឹង AI មិនតាម language របស់បូតទេ តែតាមភាសានៃផ្ទាំងបញ្ជាក់ដែលអ្នកហៅបានឃើញ (អ្វីដែលអ្នកហៅឃើញ)។

ការទទួលការជូនដំណឹងការហៅ — voice_call

ពេលមានការហៅមកបូត update voice_call មកដល់។ update សំឡេងបីប្រភេទ (voice_call, voice_call_tool_query, voice_call_transcript) មកតែពេលអ្នកស្នើដោយសរសេរឈ្មោះវាប៉ុណ្ណោះ៖ សូមដាក់វាក្នុង allowed_updates នៃ getUpdates ឬ setWebhook។ ទោះបញ្ជីទទេក៏វាមិនមកដែរ (ប្រភេទផ្សេងទៀតមកទាំងអស់ពេលបញ្ជីទទេ)។

curl -s "https://pabal.me/bot$BOT_TOKEN/getUpdates" -H 'Content-Type: application/json' \
  -d '{"allowed_updates": ["message", "voice_call", "voice_call_tool_query"], "timeout": 30}'
{
  "update_id": 7,
  "voice_call": {
    "id": "4611686018427387905",
    "direction": "incoming",
    "event": "started",
    "from": {"id": 100002, "is_bot": false, "first_name": "សុខា", "language_code": "ko"},
    "date": 1790380803,
    "max_duration": 180
  }
}
{
  "update_id": 9,
  "voice_call": {
    "id": "4611686018427387905",
    "direction": "incoming",
    "event": "ended",
    "from": {"id": 100002, "is_bot": false, "first_name": "សុខា", "language_code": "ko"},
    "date": 1790380952,
    "start_date": 1790380803,
    "duration": 149,
    "max_duration": 180,
    "end_reason": "caller"
  }
}
  • direction៖ "incoming" សម្រាប់ការហៅទៅបូត "outgoing" សម្រាប់ការហៅដែលបូតធ្វើ (update នៃការហៅពីបូត)។ ការអានវាលដែលមិនមានថាជាការហៅទៅបូត ដូចពីមុន នៅតែត្រឹមត្រូវ។
  • allowed_updates គឺជាការកំណត់តែមួយសម្រាប់បូតនីមួយៗ ហើយតម្លៃដែល getUpdates ឬ setWebhook បានផ្តល់ចុងក្រោយ ត្រូវបានរក្សាទុក (បើមិនផ្តល់ តម្លៃមុននៅដដែល)។ ដូច្នេះបើអ្នកផ្តល់បញ្ជីដូចឧទាហរណ៍ខាងលើ ប្រភេទលំនាំដើមដែលមិនមានក្នុងបញ្ជី (edited_message, callback_query) នឹងលែងមកទៀតហើយ — សូមសរសេរប្រភេទទាំងអស់ដែលបូតប្រើ។ ការជូនដំណឹងនៃការហៅដែលកើតឡើងមុនពេលស្នើ មិនត្រូវបានរក្សាទុកទេ ដូច្នេះទោះស្នើក្រោយក៏មិនមកដែរ។
  • អ្នកហៅ (from) មានតែ ID ឈ្មោះ និងភាសាកម្មវិធីប៉ុណ្ណោះ។ ឈ្មោះអ្នកប្រើ និងលេខទូរស័ព្ទមិនមកទេ (ផ្ទាំងបញ្ជាក់សន្យាដូច្នោះ)។ គណនីដែលត្រូវបានលុបមាន first_name: "Deleted Account"។
  • បើប្រើ webhook វាមកជា POST តាមលំដាប់ ដូច update ផ្សេងទៀត។ ជួររង់ចាំរបស់ getUpdates រក្សាក្នុងអង្គចងចាំរហូតដល់ 1,000 update ចុងក្រោយសម្រាប់បូតនីមួយៗ ហើយបាត់ពេលម៉ាស៊ីនមេចាប់ផ្តើមឡើងវិញ។
  • បូតដែលត្រូវបានផ្អាក ឬត្រូវបានលុប មិនទទួលបានអ្វីទាំងអស់។
eventពេលណាវាលបន្ថែម
startedពេលកម្មវិធីរបស់អ្នកហៅបានបញ្ជាក់ការហៅ (ការផ្លាស់ប្តូរសោបានចប់) ហើយម៉ាស៊ីនមេបានប្រាប់ gateway ថាការហៅបានតភ្ជាប់។ ម៉ាស៊ីនមេមិនឃើញសំឡេងទេ ដូច្នេះវាជា «បានតភ្ជាប់» តាមការដឹងរបស់ម៉ាស៊ីនមេ។ ការហៅពី Apple Watch គ្មានការផ្លាស់ប្តូរសោទេ ដូច្នេះវាជាពេលដែល gateway ប្រាប់ថាសំឡេងរបស់នាឡិកាបានតភ្ជាប់max_duration
endedពេលការហៅដែលបានតភ្ជាប់បានបញ្ចប់។ បើរង់ចាំកំណត់ត្រាសន្ទនា វាអាចមកយឺតរហូតដល់ 10 វិនាទី។ នៅលើម៉ាស៊ីនមេដែលបើករក្សាទុកការសន្ទនា ការហៅទាំងអស់ដែលមិនមែនរបៀបសំឡេងដើម មកយឺតរហូតដល់ 10 វិនាទី ដោយមិនគិតពីជម្រើសរបស់អ្នកហៅ — ដើម្បីកុំឲ្យម្ចាស់បូតអាចដឹងជម្រើសរបស់អ្នកហៅstart_date, duration (វិនាទីដែលបានតភ្ជាប់តាមនាឡិកាម៉ាស៊ីនមេ), max_duration, end_reason, (បើកំណត់ត្រាសន្ទនាបើក) transcript
missedការហៅដែលបញ្ចប់មុនពេលតភ្ជាប់ (កំពុងរោទ៍ហើយផ្តាច់ ជាដើម)end_reason
refusedតែពេលអ្នកហៅឆ្លងកាត់ការពិនិត្យទាំងអស់ ប៉ុន្តែមិនអាចទទួលបាន ដោយសារហេតុផលខាងបូត (ការហៅក្នុងពេលតែមួយ · ពេលប្រចាំថ្ងៃ · gateway) ប៉ុណ្ណោះ (ការបដិសេធផ្សេងទៀតមិនប្រាប់ម្ចាស់បូតទេ)refused_reason៖ busy (ការហៅក្នុងពេលតែមួយពេញ) · budget (ពេលប្រចាំថ្ងៃរបស់បូត · ម្ចាស់ · ម៉ាស៊ីនមេអស់) · unavailable (gateway ដែលអាចទទួលពេញ)

end_reason៖ caller (អ្នកហៅផ្តាច់) · bot (បូតផ្តាច់ · endVoiceCall) · max_length (រយៈពេលអតិបរមា) · failed (ការតភ្ជាប់បរាជ័យ) · operator (ប្រតិបត្តិករ · កុងតាក់បិទបន្ទាន់) · suspended (បូតត្រូវផ្អាក · ត្រូវលុប)។

សម្រាប់ការហៅនីមួយៗដែលត្រូវប្រគល់ទៅ gateway កំណត់ត្រាការហៅ (រយៈពេលការហៅ ឬ «ការហៅដែលបានបោះបង់») នៅសល់ក្នុងការសន្ទនារវាងអ្នកហៅ និងបូត (ការហៅដែលត្រូវបានបដិសេធមុនពេលទទួល មិនបន្សល់កំណត់ត្រាទេ)។ ច្បាប់ចម្លងខាងបូតមិនមកជា update message ទេ — កំណត់ត្រារបស់បូតគឺ voice_call។ បើអ្នកហៅជ្រើសរក្សាទុកការសន្ទនា អត្ថបទសន្ទនានៅសល់តែក្នុងការសន្ទនារបស់អ្នកហៅប៉ុណ្ណោះ នៅខាងក្រោមកំណត់ត្រាការហៅភ្លាម ហើយខាងបូតគ្មានអ្វីនៅសល់ទេ។ នៅលើម៉ាស៊ីនមេដែលបើករក្សាទុកការសន្ទនា លេខសារ 30 នៅក្រោយកំណត់ត្រាការហៅត្រូវបានបម្រុងទុកជាមុន ដូច្នេះលេខនៃសារបន្ទាប់ពីកំណត់ត្រាការហៅ ធំជាងលេខនៃកំណត់ត្រាយ៉ាងហោចណាស់ 31 (ការហៅដែលមិនបានរក្សាទុកក៏ដូចគ្នា)។

ក្នុងពេលការហៅ

ការផ្តាច់ការហៅ — endVoiceCall

curl -s "https://pabal.me/bot$BOT_TOKEN/endVoiceCall" -d voice_call_id=4611686018427387905
  • farewell (Boolean · លំនាំដើម true)៖ បើជាការហៅដែលបានតភ្ជាប់ ម៉ូដែលនិយាយលាខ្លីៗ រួចផ្តាច់។ បើមិនផ្តាច់ក្នុង 10 វិនាទី ម៉ាស៊ីនមេបញ្ចប់។ បើ false ផ្តាច់ភ្លាម។ ការហៅក្នុងរបៀបសំឡេងដើម តែងផ្តាច់ភ្លាមជានិច្ច។
  • voice_call.end_reason នៃការហៅដែលបានបញ្ចប់គឺ bot។ បើមិនមែនជាការហៅដែលកំពុងដំណើរការរបស់បូតនេះទេ នឹងទទួល 400 VOICE_CALL_NOT_FOUND។

ការផ្តល់កំណត់ចំណាំទៅម៉ូដែល — sendVoiceCallContext

ប្រាប់ម៉ូដែលអំពីអ្វីដែលវាត្រូវដឹងក្នុងពេលការហៅ។ ម៉ូដែលអានវាជាអត្ថបទរបស់ម្ចាស់បូត មិនមែនជាសម្តីរបស់អ្នកហៅទេ ហើយច្បាប់របស់ Pabal នៅតែនៅមុនជានិច្ច។

curl -s "https://pabal.me/bot$BOT_TOKEN/sendVoiceCallContext" -d voice_call_id=4611686018427387905 \
  --data-urlencode "text=អ្នកហៅនេះទើបតែបោះបង់ការបញ្ជាទិញ A-1042។ បើគេសួរ សូមប្រាប់ដូច្នោះ។" -d respond=false
  • text៖ រហូតដល់ 2,000 តួ (6,144 បៃ) ត្រូវពិនិត្យតាមច្បាប់ខ្លឹមសារ។ បើ respond=true ម៉ូដែលឆ្លើយតបភ្លាម ហើយបើ false (លំនាំដើម) ម៉ូដែលប្រើវានៅវេនបន្ទាប់។
  • កំណត់ចំណាំក៏ទៅម៉ូដែលដែរ (ក្នុងការហៅ managed គឺ Google) ហើយម៉ូដែលអាចនិយាយវាទៅអ្នកហៅ — សូមដាក់តែអ្វីដែលអាចប្រាប់អ្នកហៅបាន។
  • បើមិនទាន់តភ្ជាប់ នឹងទទួល 400 VOICE_CALL_NOT_ACTIVE · បើជាការហៅក្នុងរបៀបសំឡេងដើម ឬ gateway ដែលមិនទទួលកំណត់ចំណាំ នឹងទទួល 400 VOICE_CONTEXT_NOT_SUPPORTED · ហើយបើលើស 10 ក្នុងមួយនាទីសម្រាប់ការហៅមួយ នឹងទទួល 429 (retry_after 60)។

ការប្រើប្រាស់ — getVoiceCallUsage

curl -s "https://pabal.me/bot$BOT_TOKEN/getVoiceCallUsage?period=today"
{"ok": true, "result": {"period": "today", "from_date": 1790348400, "to_date": 1790434799,
 "calls": 3, "seconds": 412, "missed": 1,
 "refused": {"busy": 0, "budget": 0, "unavailable": 0},
 "platform_seconds": 412, "own_key_seconds": 0,
 "remaining_seconds_today": {"bot": 3188, "owner": 6788}}}
  • period៖ today (លំនាំដើម) ឬ month។ បើ month អ្នកអាចជ្រើសខែដូចជា month=2026-09 (ខែអនាគតគឺ VOICE_USAGE_PERIOD_INVALID)។
  • ព្រំដែនថ្ងៃ និងខែ គឺតាមតំបន់ម៉ោងរបស់ម៉ាស៊ីនមេ (លំនាំដើម Asia/Seoul)។ remaining_seconds_today គឺដែនកំណត់ប្រចាំថ្ងៃ ដកការហៅដែលបានបញ្ចប់ និងពេលវេលាដែលការហៅកំពុងដំណើរការកំពុងបម្រុងទុក។
  • កំណត់ត្រាការប្រើប្រាស់នៃការហៅនីមួយៗ (មិនកត់ត្រាអ្នកហៅ) ត្រូវរក្សាទុក 180 ថ្ងៃក្រោយខែនោះបញ្ចប់ ហើយចំនួនសរុបប្រចាំខែនៅដរាបណាបូតនៅមាន។

ឧបករណ៍ — ការហៅកូដរបស់បូតក្នុងពេលការហៅ

ពេលអ្នកហៅសួរថា «ការបញ្ជាទិញ A-1042 មកដល់ណាហើយ?» ម៉ូដែលហៅឧបករណ៍ check_order របស់បូត ម៉ាស៊ីនមេបញ្ជូនសំណួរនោះទៅបូត ហើយម៉ូដែលនិយាយចម្លើយរបស់បូតវិញ។ ម្ចាស់បូតកំណត់ឧបករណ៍ ហើយកូដរបស់បូតជាអ្នកឆ្លើយ។

ម៉ូដែល · gateway ម៉ាស៊ីនមេ Pabal កូដរបស់បូត ① check_order {"order_id": "A-1042"} ពិនិត្យអាគុយម៉ង់ · ដក key មិនស្គាល់ លេខកាត · អត្តសញ្ញាណ៖ ឈប់ ② voice_call_tool_query · budget_ms ស្ងាត់៖ "One moment, let me check." >5 s៖ "Just a moment longer, please." ③ answerVoiceCallToolQuery(result) ពិនិត្យ · បដិសេធសម្ងាត់ លេខកាត រហូតដល់ 16,384 បៃ ④ tool_result (ជាទិន្នន័យប៉ុណ្ណោះ) ម៉ូដែលនិយាយលទ្ធផលវិញ យឺត៖ "The tool did not answer in time."
សំណួរឧបករណ៍មួយ៖ ម៉ូដែល → ម៉ាស៊ីនមេ → បូត → ម៉ាស៊ីនមេ → ម៉ូដែល

ការពន្យល់ដ្យាក្រាម

  • ជួរឈរបី៖ ខាងឆ្វេងជាម៉ូដែល និង gateway សំឡេង កណ្តាលជាម៉ាស៊ីនមេ Pabal ខាងស្តាំជាកូដរបស់ម្ចាស់បូត។ បន្ទាត់ចុចបញ្ឈរគឺពេលវេលា។ ម៉ូដែលមិននិយាយជាមួយបូតដោយផ្ទាល់ទេ សំណួរ និងចម្លើយទាំងអស់ឆ្លងកាត់ម៉ាស៊ីនមេ។
  • ប្រអប់ប្រផេះនៃ ① — ម៉ាស៊ីនមេពិនិត្យអាគុយម៉ង់មុនគេ៖ ថាត្រូវនឹង parameters របស់ឧបករណ៍ឬអត់ ទំហំ និងជម្រៅ key ដែលមិនបានប្រកាស (ត្រូវដកចេញ រួចទើបបញ្ជូន) និងតម្លៃដែលមើលទៅដូចលេខកាត ឬលេខអត្តសញ្ញាណផ្ទាល់ខ្លួន (មិនទៅដល់បូតទេ ហើយម៉ូដែលឮការបដិសេធ)។
  • អ្វីដែលបូតទទួលនៅ ② គឺ ID សំណួរ · ID ការហៅ · អ្នកហៅ · ឈ្មោះឧបករណ៍ · អាគុយម៉ង់ (ខ្សែអក្សរ JSON) និង budget_ms — មីលីវិនាទីដែលនៅសល់រហូតដល់ពេលចម្លើយត្រូវទៅដល់ម៉ាស៊ីនមេ។ ក្នុងពេលរង់ចាំ gateway បំពេញភាពស្ងាត់ (ប្រអប់ខាងឆ្វេង)។
  • ចម្លើយនៃ ③ ក៏ត្រូវពិនិត្យដែរ៖ អ្វីដែលមើលទៅដូចសម្ងាត់ ពាក្យដែលធ្វើឲ្យបំពានច្បាប់ លេខកាត និងលេខអត្តសញ្ញាណផ្ទាល់ខ្លួន ត្រូវបដិសេធ ហើយម៉ូដែលឮកំហុស។ ចម្លើយដំបូងគឺជាចម្លើយចុងក្រោយ ដូច្នេះចម្លើយដែលត្រូវបដិសេធក៏បិទសំណួរដែរ។
  • នៅ ④ បន្ទាត់ពេញពណ៌ខៀវគឺធម្មតា ហើយបន្ទាត់ចុចពណ៌ក្រហមគឺពេលហួសពេល។ ម៉ូដែលទទួលលទ្ធផលរបស់ឧបករណ៍ជាទិន្នន័យប៉ុណ្ណោះ មិនមែនជាបញ្ជាទេ ហើយបើបរាជ័យ វាឮប្រយោគខ្លីរបស់ Pabal រួចពន្យល់ស្ថានភាពដល់អ្នកហៅ។

ការកំណត់ឧបករណ៍

curl -s "https://pabal.me/bot$BOT_TOKEN/setVoiceCallSettings" -H 'Content-Type: application/json' -d '{
  "instructions": "អ្នកជាបុគ្គលិកឆ្លើយទូរស័ព្ទរបស់ហាង Order Helper។ សូមឆ្លើយខ្លីៗ និងគួរសម។ ពេលអ្នកហៅប្រាប់លេខបញ្ជាទិញ សូមប្រើឧបករណ៍ check_order ដើម្បីរកស្ថានភាពដឹកជញ្ជូន ហើយប្រាប់គេ។",
  "tools": [{
    "name": "check_order",
    "description": "រកស្ថានភាពដឹកជញ្ជូនតាមលេខបញ្ជាទិញ។ ហៅពេលអ្នកហៅប្រាប់លេខបញ្ជាទិញ។",
    "parameters": {"type": "object",
                   "properties": {"order_id": {"type": "string", "description": "លេខបញ្ជាទិញ ឧទាហរណ៍៖ A-1042"}},
                   "required": ["order_id"]},
    "timeout_ms": 5000
  }]
}'
ធាតុច្បាប់
Keyមានតែបួន៖ name, description, parameters (ជាជម្រើស), timeout_ms (ជាជម្រើស)
ចំនួន · ទំហំឧបករណ៍របស់បូត និងឧបករណ៍ MCP ដែលបានខ្ទាស់ រួមគ្នា 16 ហើយផលបូក UTF-8 នៃនិយមន័យ (name·description·parameters) 8,192 បៃ។ បូតសោផ្ទាល់ខ្លួនក៏ដូចគ្នា
name[A-Za-z_][A-Za-z0-9_-]{0,63}។ មិនអាចមាន __ (ប្រើសម្រាប់ឈ្មោះឧបករណ៍ MCP) មិនអាចចាប់ផ្តើមដោយ pabal ហើយមិនអាចជាន់គ្នាដោយមិនគិតអក្សរធំតូច
descriptionចាំបាច់ · រហូតដល់ 1,024 បៃ · ត្រូវពិនិត្យតាមច្បាប់ខ្លឹមសារ។ ម៉ូដែលសម្រេចថាពេលណាត្រូវហៅដោយផ្អែកលើវា ដូច្នេះសូមសរសេរឲ្យជាក់លាក់
parametersកម្រិតខាងលើបំផុតគឺ {"type": "object"}។ បើដកចេញ មានន័យថា «គ្មានអាគុយម៉ង់»
timeout_ms1,000 ដល់ 15,000 · លំនាំដើម 5,000។ ពេលអតិបរមាដែលម៉ូដែលរង់ចាំចម្លើយ

parameters ប្រើតែផ្នែកមួយនៃ JSON Schema ដែល engine ទាំងពីរទទួលបាន។

  • ពាក្យគន្លឹះមានតែដប់៖ type, description, enum, properties, required, items, minimum, maximum, minItems, maxItems។ type មានតែមួយ (string·number·integer·boolean·array·object)។
  • properties·required សម្រាប់ object, items·minItems·maxItems សម្រាប់ array (items ចាំបាច់), minimum·maximum សម្រាប់លេខ ហើយ enum សម្រាប់តែ string (1 ដល់ 32 តម្លៃ នីមួយៗ 64 បៃ)។
  • ឈ្មោះលក្ខណៈសម្បត្តិគឺ [A-Za-z_][A-Za-z0-9_]{0,63} · ឧបករណ៍មួយមានលក្ខណៈសម្បត្តិរហូតដល់ 24 · object រហូតដល់ 3 កម្រិត ហើយ object និង array រួមគ្នារហូតដល់ 5 កម្រិត។ ការពិពណ៌នាប៉ារ៉ាម៉ែត្ររហូតដល់ 512 បៃ។
  • ប៉ារ៉ាម៉ែត្រដែលសួររកសម្ងាត់ត្រូវបដិសេធ៖ បើឈ្មោះមានពាក្យដូចជា pin·cvv·password·otp·ssn·rrn·cardnumber ឬការពិពណ៌នានិយាយអំពីលេខកាត · ពាក្យសម្ងាត់ · លេខកូដផ្ទៀងផ្ទាត់ · លេខអត្តសញ្ញាណផ្ទាល់ខ្លួន គឺ asks_secrets។
  • កំហុសប្រាប់បញ្ហាដំបូងមួយ ជាមួយផ្លូវ៖ VOICE_TOOL_INVALID: tools[0].parameters.properties.tags: items_missing, VOICE_TOOL_INVALID: tools[0].name: reserved, VOICE_CONTENT_REFUSED: tools[0].description: impersonation។
  • ឧបករណ៍កំណត់បានតែតាម Bot API ប៉ុណ្ណោះ។ អេក្រង់ការហៅជាសំឡេងរបស់ @BotFather គ្រាន់តែបង្ហាញឈ្មោះឧបករណ៍ប៉ុណ្ណោះ។
  • នៅលើម៉ាស៊ីនមេដែលទទួលតែបូតដែលបានអនុញ្ញាត ពេលអ្នកបន្ថែម ឬផ្លាស់ប្តូរឧបករណ៍ បូតមិនទទួលការហៅទេ រហូតដល់ប្រតិបត្តិករអនុញ្ញាតម្តងទៀត (awaiting_review, ជំហានទី 4 នៃ ការបើក)។

ការទទួលសំណួរឧបករណ៍

{
  "update_id": 813,
  "voice_call_tool_query": {
    "id": "8190448532776044545",
    "voice_call_id": "4611686018427387905",
    "from": {"id": 100002, "is_bot": false, "first_name": "សុខា", "language_code": "ko"},
    "name": "check_order",
    "arguments": "{\"order_id\":\"A-1042\"}",
    "budget_ms": 4700
  }
}
  • arguments គឺជាអត្ថបទនៃ object JSON (រហូតដល់ 4,096 បៃ និងជម្រៅមិនលើស 8 ដែលម៉ាស៊ីនមេបានពិនិត្យរួចហើយ)។ ទោះយ៉ាងណា វាជាតម្លៃដែលម៉ូដែលបង្កើតពីសម្តីរបស់អ្នកហៅ ដូច្នេះបូតត្រូវពិនិត្យម្តងទៀត។ មិនត្រូវឲ្យនរណាម្នាក់គ្រាន់តែដឹងលេខបញ្ជាទិញ ក៏អាចស្តាប់ការបញ្ជាទិញរបស់អ្នកដទៃបានទេ — សូមប្រាប់តែរបស់ from.id (អ្នកហៅដែល Pabal បានផ្ទៀងផ្ទាត់) ប៉ុណ្ណោះ។
  • budget_ms គឺជាមីលីវិនាទីចាប់ពីពេលបូតទទួល រហូតដល់ពេលចម្លើយត្រូវទៅដល់ម៉ាស៊ីនមេ។ វាជា timeout_ms របស់ឧបករណ៍ ដកផ្លូវត្រឡប់ទៅម៉ូដែល (200 ms) និងផ្លូវមកបូត (100 ms) ដូច្នេះជាធម្មតាវាតិចជាង timeout_ms ប្រហែល 300 ms។ មិនប្រើនាឡិការបស់គ្នាទៅវិញទៅមកទេ។

ផ្លូវដែលសំណួរទៅដល់បូត ត្រូវបានកំណត់តាមលំដាប់នេះ (getVoiceCallSettings.tool_delivery)។

  1. បើមាន webhook វាទៅតាម webhook។ allowed_updates របស់ webhook ត្រូវមាន voice_call_tool_query ហើយបើគ្មាន វាមិនទៅផ្លូវផ្សេងទេ ហើយមិនទៅដល់ (tool_delivery_problem: "not_in_allowed_updates")។ សំណួរគឺជាPOST ដែលផ្ញើដាច់ដោយឡែក ដូច្នេះមិនជាប់គាំងក្នុងជួរលំដាប់ទេ ហើយមិនត្រូវផ្ញើម្តងទៀតទេ។
  2. បើគ្មាន webhook ហើយបានហៅ getUpdates ក្នុងរយៈ 15 វិនាទីចុងក្រោយ វានៅខាងមុខបង្អស់នៃ getUpdates បន្ទាប់។ ក៏ត្រូវមាននៅក្នុង allowed_updates ដែរ។ សំណួរដែលរង់ចាំមានរហូតដល់ 8 សម្រាប់បូតមួយ។
  3. ក្រៅពីនោះ បើជាបូតដែលភ្ជាប់តាម MTProto វាទៅតាម updateBotWebhookJSONQuery (មិនពាក់ព័ន្ធនឹង allowed_updates)។
  4. បើមិនមែនមួយណាទេ វាមិនទៅដល់ (tool_delivery_problem: "not_listening") ហើយម៉ូដែលឮ «The tool could not be reached.» (មិនអាចភ្ជាប់ទៅឧបករណ៍បានទេ)។

ការឆ្លើយ — answerVoiceCallToolQuery

ប៉ារ៉ាម៉ែត្រការពិពណ៌នា
tool_query_idvoice_call_tool_query.id នៃ update
resultលទ្ធផល។ អត្ថបទ ឬបើជាតួ JSON គឺ object · array (ទោះផ្ញើជាអត្ថបទ បើអានបានជា object · array JSON ក៏ត្រូវចាត់ទុកជា JSON)។ រហូតដល់ UTF-8 16,384 បៃ (ប្រតិបត្តិករអាចបន្ថយបាន)
errorសារបរាជ័យរបស់បូតខ្លួនឯង រហូតដល់ 512 បៃ។ ម៉ូដែលប្រាប់សារនេះទៅអ្នកហៅ
  • ត្រឹមតែមួយក្នុងចំណោម result និង error (បើគ្មានទាំងពីរ នឹងទទួល TOOL_RESULT_EMPTY · បើមានទាំងពីរ នឹងទទួល TOOL_RESULT_INVALID)។ តម្លៃត្រឡប់គឺ True។
  • ចម្លើយរបស់ឧបករណ៍ទៅម៉ូដែល (ក្នុងការហៅ managed គឺ Google) ហើយម៉ូដែលនិយាយខ្លឹមសារនោះទៅអ្នកហៅ — សូមដាក់តែអ្វីដែលអាចប្រាប់អ្នកហៅបាន។
  • ចម្លើយដំបូងគឺជាចម្លើយចុងក្រោយ។ សំណួរដែលយឺត ឬបានបញ្ចប់ ទទួល 400 TOOL_QUERY_EXPIRED: <មូលហេតុ> — answered (បានឆ្លើយរួច) · timeout · cancelled (អ្នកហៅកាត់សម្តី ដូច្នេះម៉ូដែលដកវិញ) · call_ended · unreachable។ ID ដែលមិនស្គាល់ ឬលើស 10 នាទី នឹងទទួល TOOL_QUERY_ID_INVALID។
  • ចម្លើយក៏ត្រូវពិនិត្យដែរ៖ តួអក្សរមើលមិនឃើញត្រូវដកចេញ ហើយអ្វីដែលមើលទៅដូចសម្ងាត់ (looks_like_secret) ពាក្យដែលធ្វើឲ្យបំពានច្បាប់ (overrides_rules·hides_ai·claims_human·asks_secrets) លេខកាត · លេខអត្តសញ្ញាណផ្ទាល់ខ្លួន (sensitive_data) ត្រូវបដិសេធដោយ TOOL_RESULT_REFUSED: <កូដ>។ ទិន្នន័យរបស់ម្ចាស់បូតដូចជាអាសយដ្ឋាន · លេខទូរស័ព្ទ · URL របស់ហាង អាចឆ្លងកាត់បាន។ បើលើសទំហំ នឹងទទួល TOOL_RESULT_TOO_LONG·TOOL_ERROR_TOO_LONG។
  • បើប្រើ webhook អ្នកអាចឆ្លើយក្នុងតួនៃការឆ្លើយតបបាន — គ្រាន់តែដាក់វាក្នុងការឆ្លើយតប 200 នៃ POST សំណួរឧបករណ៍ (method ផ្សេងទៀតមិនត្រូវដំណើរការទេ)។ មុនពេលឆ្លើយ ត្រូវពិនិត្យ header X-Telegram-Bot-Api-Secret-Token ជាដាច់ខាត។ បើដាក់ទិន្នន័យអតិថិជនក្នុងការឆ្លើយតបដោយមិនពិនិត្យ នរណាក៏ដោយដែលផ្ញើសំណួរក្លែងក្លាយទៅអាសយដ្ឋាននោះ អាចយកចម្លើយនោះបាន។
{"method": "answerVoiceCallToolQuery", "tool_query_id": "8190448532776044545",
 "result": {"order_id": "A-1042", "status": "កំពុងដឹកជញ្ជូន", "eta": "មកដល់រសៀលថ្ងៃស្អែក"}}

ឧទាហរណ៍ — python-telegram-bot

នេះជាបូតដែលឆ្លើយឧបករណ៍ check_order ខាងលើ។ វាទទួលតាម getUpdates ហើយដោះស្រាយសំណួរស្របពេលជាមួយ update ផ្សេងទៀត (concurrent_updates) — បើយឺតព្រោះកំពុងដោះស្រាយ update មុន budget_ms នឹងកន្លងផុតទៅ។ ការបញ្ជាទិញត្រូវរកតាម ID អ្នកប្រើ Pabal របស់អ្នកបញ្ជាទិញ ហើយប្រាប់តែពេលវាត្រូវនឹង from.id នៃសំណួរប៉ុណ្ណោះ។

# order_voice_bot.py — pip install "python-telegram-bot==22.*"
# ដំណើរការ៖ read -rs BOT_TOKEN && export BOT_TOKEN
#       CUSTOMER_ID=<id អ្នកប្រើ Pabal របស់អ្នកបញ្ជាទិញ> python3 order_voice_bot.py
# ពេលសាកល្បង ដាក់ id របស់អ្នកក្នុង CUSTOMER_ID — វាជា message.from.id នៃ getUpdates ក្រោយពេលអ្នកផ្ញើសារទៅបូត
import json
import os
import re

from telegram import Update
from telegram.error import TelegramError
from telegram.ext import Application, ContextTypes, TypeHandler

SERVER = "https://pabal.me"
CUSTOMER = int(os.environ.get("CUSTOMER_ID", "0"))
ORDERS = {                                    # តារាងតូចសម្រាប់ឧទាហរណ៍៖ តាមពិតគឺប្រព័ន្ធបញ្ជាទិញរបស់ហាង
    (CUSTOMER, "A-1042"): {"status": "កំពុងដឹកជញ្ជូន", "eta": "មកដល់រសៀលថ្ងៃស្អែក"},
}


def check_order(arguments, caller_id):
    """{"result": …} ឬ {"error": …} ដែលត្រូវបញ្ជូនដូចដើមទៅ answerVoiceCallToolQuery"""
    order_id = str(json.loads(arguments).get("order_id", "")).strip().upper()
    if not re.fullmatch(r"[A-Z]-\d{4}", order_id):     # អាគុយម៉ង់ដែលម៉ូដែលបង្កើត — ពិនិត្យម្តងទៀត
        return {"error": "ខ្ញុំស្តាប់លេខបញ្ជាទិញមិនច្បាស់ទេ។ ឧទាហរណ៍៖ A-1042"}
    found = ORDERS.get((caller_id, order_id))          # តែការបញ្ជាទិញរបស់អ្នកដែលហៅមកប៉ុណ្ណោះ
    if found is None:                                  # ការបញ្ជាទិញរបស់អ្នកដទៃ ក៏ឆ្លើយដូចការបញ្ជាទិញដែលមិនមាន
        return {"error": f"រកមិនឃើញការបញ្ជាទិញ {order_id} ទេ។"}
    return {"result": json.dumps({"order_id": order_id, **found}, ensure_ascii=False)}


async def on_update(update: Update, context: ContextTypes.DEFAULT_TYPE):
    q = update.api_kwargs.get("voice_call_tool_query")  # ប្រភេទដែល PTB មិនស្គាល់ នៅក្នុង api_kwargs
    if q is None:
        return
    if q["name"] == "check_order":
        answer = check_order(q["arguments"], q["from"]["id"])
    else:
        answer = {"error": "ឧបករណ៍មិនស្គាល់។"}
    try:
        await context.bot.do_api_request("answerVoiceCallToolQuery",
                                         api_kwargs={"tool_query_id": q["id"], **answer})
    except TelegramError as e:                         # TOOL_QUERY_EXPIRED: យឺត ឬការហៅបានបញ្ចប់
        print("ចម្លើយមិនត្រូវបានទទួល៖", e, flush=True)


app = (Application.builder().token(os.environ["BOT_TOKEN"])
       .base_url(f"{SERVER}/bot").base_file_url(f"{SERVER}/file/bot")
       .concurrent_updates(True).build())
app.add_handler(TypeHandler(Update, on_update))
app.run_polling(allowed_updates=["message", "voice_call", "voice_call_tool_query"], poll_interval=0, timeout=10)

aiogram រំលងប្រភេទ update ដែលវាមិនស្គាល់ ដូច្នេះត្រូវទទួល voice_call_tool_query ក្នុង update.model_extra មុនគេនៅ middleware ខាងក្រៅរបស់ dispatcher (dp.update.outer_middleware)។ ឃ្លាំងកូដ Pabal មានឧទាហរណ៍ (scripts/bots/voice_tools_aiogram.py)។ បើត្រូវការ សូមសុំពីប្រតិបត្តិករម៉ាស៊ីនមេ។

អ្វីដែលម៉ូដែល និងអ្នកហៅឮ

  • ជោគជ័យ៖ លទ្ធផលក្លាយជាការឆ្លើយតបអនុគមន៍របស់ម៉ូដែល (បើជា JSON គឺជាតម្លៃ JSON)។ អត្ថបទក្នុងលទ្ធផលត្រូវអានជាទិន្នន័យប៉ុណ្ណោះ ហើយមិនក្លាយជាបញ្ជាទេ។
  • បរាជ័យ៖ ម៉ូដែលឮប្រយោគខ្លីរបស់ Pabal ជាភាសានៃការហៅ (កូរ៉េ ឬអង់គ្លេស) រួចពន្យល់ស្ថានភាពដល់អ្នកហៅ — ហួសពេល៖ «The tool did not answer in time.» (ឧបករណ៍មិនបានឆ្លើយទាន់ពេល) · មិនទៅដល់៖ «The tool could not be reached.» (មិនអាចភ្ជាប់ទៅឧបករណ៍បាន) · អាគុយម៉ង់ដូចជាលេខកាត៖ «Pabal does not pass on card numbers or national ID numbers.» (Pabal មិនបញ្ជូនលេខកាត ឬលេខអត្តសញ្ញាណជាតិទេ) · ហើយ error របស់បូតត្រូវនិយាយដូចដើម។ ចំពោះអាគុយម៉ង់ខុស ម៉ូដែលទទួលបានគន្លឹះថាខុសត្រង់ណា ដូច្នេះអាចហៅម្តងទៀតបាន។
  • ក្នុងពេលរង់ចាំ gateway បំពេញភាពស្ងាត់៖ ពេលស្ងាត់ 1.5 វិនាទី វានិយាយ «One moment, let me check.» ម្តង (បើឧបករណ៍ឆ្លើយយឺតថ្មីៗនេះ វានិយាយភ្លាម) ហើយពេលលើស 5 វិនាទី វានិយាយ «Just a moment longer, please.» ម្តង។ ពាក្យទាំងពីរនេះចេញជាភាសារបស់បូត មិនមែនភាសារបស់អ្នកហៅទេ ហើយបើគ្មានការថតសំឡេងជាភាសានោះដែលបានពិនិត្យរួចទេ វាចេញជាភាសាអង់គ្លេស (បច្ចុប្បន្ន ភាសាដែលបានពិនិត្យរួច មានតែភាសាកូរ៉េ និងអង់គ្លេស)។
  • បើអ្នកហៅកាត់សម្តី gateway អាចដកសំណួរដែលកំពុងបើកវិញ ហើយចម្លើយក្រោយពីនោះគឺ TOOL_QUERY_EXPIRED: cancelled។

ដែនកំណត់ឧបករណ៍

សំណួរដែលបើកក្នុងពេលតែមួយ៖ 2 សម្រាប់ការហៅនីមួយៗ និង 8 សម្រាប់បូតនីមួយៗ។ ចំនួនដងហៅ៖ 30 ដងក្នុងមួយនាទីសម្រាប់ការហៅនីមួយៗ និង 120 ដងក្នុងមួយនាទីសម្រាប់បូតនីមួយៗ។ បើលើស វាមិនទៅបូតទេ ហើយម៉ូដែលឮ too_many_open·rate_limited ភ្លាម។

លក្ខខណ្ឌម្ចាស់បូត

កំណត់ត្រាសន្ទនា សោម៉ូដែលផ្ទាល់ខ្លួន របៀបសំឡេងដើម ម៉ាស៊ីនមេ MCP និងការហៅពីបូត អាចបើកបានតែក្រោយពេលយល់ព្រមលក្ខខណ្ឌម្ចាស់បូត (កំណែ 4)។ ការយល់ព្រមធ្វើដោយមនុស្សនៅលើអេក្រង់ការហៅជាសំឡេងនៃ @BotFather (នៅអេក្រង់ណាមួយក្នុងចំណោម កំណត់ត្រាសន្ទនា · សោផ្ទាល់ខ្លួន · របៀបសំឡេងដើម · ម៉ាស៊ីនមេ MCP · ការហៅពីបូត) — មិនអាចធ្វើដោយតូខឹនបានទេ។ ទោះបីបានយល់ព្រមកំណែមុនក៏ដោយ វានឹងសួរម្តងទៀត។ មុនពេលផ្នែកម្ចាស់បូតត្រូវបានផ្សាយក្នុងលក្ខខណ្ឌនៃសេវាកម្មរបស់ម៉ាស៊ីនមេ ប៊ូតុងយល់ព្រមមិនបង្ហាញទេ (បើហៅមុននោះ នឹងទទួល 403 VOICE_OWNER_TERMS_NOT_ACCEPTED)។

BotFather봇 주인 약관을 확인해 주세요. 대화 기록, 자기 모델 키, 원음 모드, MCP 서버, 봇이 거는 전화에 필요해요. 1. 대화 기록을 켜면, 통화가 끝날 때 AI가 적은 대화 글을 내가 받아요. 받은 글은 내가 처리하고 지켜요. 2. 대화 기록이 켜진 봇에 전화하면, 통화가 연결될 때 안내 음성이 대화 글이 봇 주인에게 간다고 먼저 알려요. 3. 받은 대화 글은 필요한 만큼만 두고, 발신자가 지워 달라고 하면 지워요. 모델 학습에 쓰지 않아요. 4. 자기 모델 키를 쓰면, 통화 소리와 글이 내 키의 제공자에게 내 계약으로 가요. 그 처리의 책임은 나에게 있고, 내 개인정보 안내에 그렇게 적어요. 5. 원음 모드에서는 전화 소리가 파발의 AI 모델이 아니라 내 서버로 가요. 그 소리를 받아 처리하는 건 나예요. 전화를 건 사람의 소리와 말한 내용을 법이 허락하는 범위에서만 쓰고, 필요 없으면 지워요. 6. 내 서버가 어디에 있는지, 무엇을 하는지 전화를 건 사람이 물으면 알려요. 봇 소개에 적어 두면 좋아요. 7. 봇은 언제나 AI 라고 밝혀요. 대답은 AI 가 만들어요. 사람이 직접 대답하거나, 사람의 녹음을 AI 대답처럼 틀지 않아요. 원음 모드에서는 파발이 통화 맨 앞에 "AI 음성 봇입니다. 통화 소리는 봇 개발자의 서버로 갑니다." 안내를 틀어요. 8. 카드 번호·주민등록번호·비밀번호·인증 번호를 묻지 않아요. 음성 봇 규칙도 그대로 지켜요. 9. 파발은 대화 글을 저장하지 않아요. 전해지면, 늦어도 24시간 뒤에는 서버에서 지워져요. 키, 원음 모드와 MCP 서버의 비밀은 암호화해 두고 어디에도 기록하지 않아요. 10. MCP 서버를 등록하면, 통화 중 모델이 그 서버의 도구를 부를 때 발신자가 말한 값이 그 서버로 가요. 그 서버와 그 서버가 넘기는 곳의 처리 책임은 나에게 있고, 받는 곳은 사실대로 신고해요. 11. 약관을 어기면 운영자가 음성 통화나 봇을 멈출 수 있어요. 봇이 거는 전화를 켜려면 아래도 지켜요. 12. 봇이 거는 전화는 선언하고 운영자가 허락한 목적(알림·깨우기·배달·예약)에만 써요. 광고·판매 권유·홍보를 하지 않아요. 배달·예약 안내 안에서도 마찬가지예요. 광고성 정보를 보내면 정보통신망법 제50조를 어긴 것이고 그 책임은 나에게 있어요. 파발은 그런 발신을 곧바로 멈추고 발신을 해지해요. 진료·채용·대출처럼 사람의 권리나 의무에 관한 판단을 이 전화로 알리지 않아요. 13. 전화를 건 봇은 첫 말에서 봇 이름과 AI 라는 것을 밝히고, 사람·기관·파발 직원을 사칭하지 않아요. 14. context 에 건강·금융(금액·계좌)·주소 같은 민감한 정보를 넣지 않고, 비밀번호·인증 번호·카드 번호를 묻거나 권하지 않아요. 15. 만 19세 미만인 사람에게 전화하려 하지 않아요. 16. 조용한 시간·쉬는 중·하루 한도를 피하려 하지 않아요(여러 봇·계정으로 나눠 걸기 포함). 사람이 그만 받겠다고 하면 다시 걸지 않아요. 17. 내 개인정보 처리방침을 두고, 통화 내용이 AI 제공자에게 간다는 것을 알려요. 봇이 거는 전화는 종단 간 암호화가 아니에요. 18. 사람에게 보이는 허락 창에 봇 주인인 내 이름이 나와요. 19. 어기면 그 봇의 발신이 멈추고, 음성 기능 전체가 멈출 수 있어요. 20. 발신으로 받는 사람 정보(파발 id·허락했는지·받았는지·통화 시각과 길이·누가 끊었는지)는 선언한 목적에만 쓰고, 남에게 주지 않고, 허락이 꺼지거나 그 사람이 지워 달라고 하면 지워요. 받은 시각으로 사람의 일과나 있는 곳을 짐작하지 않아요. 21. 허락을 서비스의 조건으로 걸거나 속여서 받지 않아요(허락 링크 메시지 포함). 22. 전화마다 적는 목적은 그 전화의 실제 목적이에요. 깨우기 창을 다른 용도로 쓰지 않아요(서버는 목적을 봇이 적은 대로 믿어요). 23. 봇 토큰을 지키고, 샌 것을 알면 곧바로 @BotFather 에서 재발급해요. 토큰이 곧 사람에게 전화할 권한이에요. 24. 봇이 건 전화에는 대화 기록(1항)이 오지 않아요. 봇에게 가는 것은 20항의 것이에요.
약관에 동의하기

BotFather ឆ្លើយជាភាសាកូរ៉េ។ ខ្លឹមសារនៃលក្ខខណ្ឌខាងលើមានដូចខាងក្រោម ហើយអ្នកយល់ព្រមដោយប៊ូតុង យល់ព្រមលក្ខខណ្ឌ (약관에 동의하기)៖

  1. បើបើកកំណត់ត្រាសន្ទនា ពេលការហៅបញ្ចប់ ខ្ញុំទទួលអត្ថបទសន្ទនាដែល AI បានសរសេរ។ ខ្ញុំជាអ្នកដោះស្រាយ និងការពារអត្ថបទដែលទទួលបាន។
  2. ពេលហៅទៅបូតដែលបើកកំណត់ត្រាសន្ទនា ពេលការហៅតភ្ជាប់ សំឡេងជូនដំណឹងប្រាប់មុនថា អត្ថបទសន្ទនានឹងទៅម្ចាស់បូត។
  3. ខ្ញុំរក្សាទុកអត្ថបទសន្ទនាដែលទទួលបានតែតាមដែលចាំបាច់ ហើយលុបវាពេលអ្នកហៅស្នើ។ ខ្ញុំមិនប្រើវាដើម្បីបង្ហាត់ម៉ូដែលទេ។
  4. បើប្រើសោម៉ូដែលផ្ទាល់ខ្លួន សំឡេង និងអត្ថបទនៃការហៅទៅអ្នកផ្តល់សេវានៃសោរបស់ខ្ញុំ តាមកិច្ចសន្យារបស់ខ្ញុំ។ ការទទួលខុសត្រូវចំពោះការដោះស្រាយនោះ ស្ថិតលើខ្ញុំ ហើយខ្ញុំសរសេរដូច្នោះក្នុងសេចក្តីជូនដំណឹងឯកជនភាពរបស់ខ្ញុំ។
  5. ក្នុងរបៀបសំឡេងដើម សំឡេងនៃការហៅទៅម៉ាស៊ីនមេរបស់ខ្ញុំ មិនមែនទៅម៉ូដែល AI របស់ Pabal ទេ។ ខ្ញុំជាអ្នកទទួល និងដោះស្រាយសំឡេងនោះ។ ខ្ញុំប្រើសំឡេង និងខ្លឹមសារនៃសម្តីរបស់អ្នកហៅ តែក្នុងវិសាលភាពដែលច្បាប់អនុញ្ញាត ហើយលុបវាពេលលែងត្រូវការ។
  6. បើអ្នកហៅសួរថាម៉ាស៊ីនមេរបស់ខ្ញុំនៅទីណា និងធ្វើអ្វី ខ្ញុំប្រាប់គេ។ គួរសរសេរវាក្នុងការណែនាំរបស់បូត។
  7. បូតតែងតែប្រាប់ថាខ្លួនជា AI។ ចម្លើយត្រូវបង្កើតដោយ AI។ គ្មានមនុស្សឆ្លើយដោយផ្ទាល់ ឬចាក់ការថតសំឡេងរបស់មនុស្សដូចជាចម្លើយរបស់ AI ទេ។ ក្នុងរបៀបសំឡេងដើម Pabal ចាក់សេចក្តីជូនដំណឹង «This is an AI voice bot. The call's audio goes to the bot developer's server.» នៅដើមការហៅ។
  8. ខ្ញុំមិនសួរលេខកាត លេខអត្តសញ្ញាណផ្ទាល់ខ្លួន ពាក្យសម្ងាត់ ឬលេខកូដផ្ទៀងផ្ទាត់ទេ ហើយខ្ញុំគោរពច្បាប់បូតសំឡេងដដែល។
  9. Pabal មិនរក្សាទុកអត្ថបទសន្ទនាទេ។ ពេលបញ្ជូនរួច វាត្រូវលុបចេញពីម៉ាស៊ីនមេយ៉ាងយូរ 24 ម៉ោងក្រោយ។ សោ និងសម្ងាត់នៃរបៀបសំឡេងដើម និងម៉ាស៊ីនមេ MCP ត្រូវបានអ៊ិនគ្រីប ហើយមិនកត់ត្រានៅកន្លែងណាទេ។
  10. បើចុះឈ្មោះម៉ាស៊ីនមេ MCP ពេលម៉ូដែលហៅឧបករណ៍របស់ម៉ាស៊ីនមេនោះក្នុងពេលការហៅ តម្លៃដែលអ្នកហៅនិយាយនឹងទៅម៉ាស៊ីនមេនោះ។ ការទទួលខុសត្រូវចំពោះការដោះស្រាយរបស់ម៉ាស៊ីនមេនោះ និងកន្លែងដែលវាបញ្ជូនបន្ត ស្ថិតលើខ្ញុំ ហើយខ្ញុំរាយការណ៍កន្លែងទទួលតាមការពិត។
  11. បើបំពានលក្ខខណ្ឌ ប្រតិបត្តិករអាចផ្អាកការហៅជាសំឡេង ឬបូតបាន។

ចំណុច 12–24 គឺជាអ្វីដែលអ្នកគោរព ពេលបើកការហៅពីបូត៖ ប្រើតែសម្រាប់គោលបំណងដែលបានប្រកាស និងប្រតិបត្តិករអនុញ្ញាត ដោយគ្មានការផ្សាយពាណិជ្ជកម្ម ប្រាប់ឈ្មោះបូត និងថាខ្លួនជា AI នៅពាក្យដំបូង មិនដាក់ព័ត៌មានរសើបក្នុង context មិនដែលព្យាយាមហៅមនុស្សអាយុក្រោម 19 ឆ្នាំ មិនគេចពីម៉ោងស្ងាត់ ការផ្អាក ឬដែនកំណត់ ប្រើព័ត៌មានអំពីអ្នកទទួលការហៅតែសម្រាប់គោលបំណងនោះ ហើយលុបវាពេលការអនុញ្ញាតត្រូវបានបិទ និងការពារតូខឹន។ ការហៅដែលបូតធ្វើ មិននាំមកនូវកំណត់ត្រាសន្ទនាទេ (ចំណុច 24)។ ពាក្យពេចន៍នៃលក្ខខណ្ឌអាចផ្លាស់ប្តូរក្រោយការពិនិត្យផ្នែកច្បាប់។

ម៉ាស៊ីនមេ MCP

ម៉ាស៊ីនមេ MCP បិទតាមលំនាំដើម ហើយក៏បិទនៅលើ pabal.me ដែរ

វាបើកតែពេលប្រតិបត្តិកររៀបចំសមាសភាគ MCP (pabal-mcp · កម្មវិធីចុះហត្ថលេខា · proxy ចេញក្រៅ) ហើយផ្សាយផ្នែក bot-calls-mcp នៃគោលការណ៍ឯកជនភាព និងផ្នែកម្ចាស់បូតនៃលក្ខខណ្ឌនៃសេវាកម្ម (ការរៀបចំអាសយដ្ឋានចេញក្រៅផ្តាច់មុខសម្រាប់សំណើ MCP ជាលក្ខខណ្ឌប្រតិបត្តិការ ហើយកូដមិនពិនិត្យទេ)។ ទោះបីបើករួចក៏ដោយ មុនពេលកម្មវិធីបង្ហាញកន្លែងទទួល MCP របស់បូតលើផ្ទាំងបញ្ជាក់ អាចចុះឈ្មោះបានតែប៉ុណ្ណោះ ហើយគ្មានការហៅណាផ្ទុកឧបករណ៍ MCP ទេ (mcp_unavailable_reason: "sheet")។ នៅលើម៉ាស៊ីនមេដែល MCP បិទ setVoiceCallMcpServer ទទួល 403 VOICE_NOT_AVAILABLE: MCP tools are not available on this server ហើយ @BotFather គ្មានប៊ូតុង «ម៉ាស៊ីនមេ MCP» (MCP 서버) ទេ។

ពេលអ្នកចុះឈ្មោះម៉ាស៊ីនមេ MCP ដែលម្ចាស់បូតដំណើរការ (ឬបានចុះកិច្ចសន្យា) ម៉ូដែលអាចហៅឧបករណ៍របស់ម៉ាស៊ីនមេនោះក្នុងពេលការហៅ។ អ្វីដែលហៅឧបករណ៍ទាំងនោះ មិនមែនជាកូដរបស់បូតទេ គឺ Pabal — client MCP របស់ Pabal ផ្ញើសំណើទៅម៉ាស៊ីនមេនោះតាម proxy ចេញក្រៅរបស់ Pabal ហើយគោរពកាលកំណត់ · ទំហំ · ការពិនិត្យ។ ដូច្នេះតម្លៃដែលអ្នកហៅនិយាយនឹងទៅម៉ាស៊ីនមេនោះ (លក្ខខណ្ឌម្ចាស់បូតទី 10)។

អ្វីដែលម៉ាស៊ីនមេ MCP ត្រូវមាន

  • Streamable HTTP, POST (កំណែពិធីការ 2024-11-05 ឡើងទៅ)។ https:// ជាមួយវិញ្ញាបនបត្រសាធារណៈ · គ្មានការបង្វែរទិស (redirect) · ច្រកតែច្រកដែលម៉ាស៊ីនមេអនុញ្ញាត (pabal.me គឺ 443)។
  • ម៉ាស៊ីនមេដែលប្រើព័ត៌មានផ្ទៀងផ្ទាត់ ត្រូវបដិសេធដោយស្មោះត្រង់ដោយ 401 ពេលគ្មានព័ត៌មានផ្ទៀងផ្ទាត់ ហើយមិនត្រូវទទួលព័ត៌មានផ្ទៀងផ្ទាត់ខុសទេ។ ព័ត៌មានផ្ទៀងផ្ទាត់មួយអាចប្រើបានតែដោយបូតមួយប៉ុណ្ណោះ។
  • ឯកសាររបស់ប្រតិបត្តិករ៖ ប្រតិបត្តិករម៉ាស៊ីនមេដាក់ឯកសារ JSON (មិនលើស 32KB · គ្មានការបង្វែរទិស) នៅ https://<host>/.well-known/pabal-voice-mcp — ស្ថាប័នដំណើរការ · ប្រទេស · ទំនាក់ទំនង · គោលបំណង · ប្រភេទទិន្នន័យ និងទីតាំង · កន្លែងទទួល និងអ្នកដោះស្រាយបន្ត · រយៈពេលរក្សាទុក។ វាជាព័ត៌មានកន្លែងទទួលដែលនឹងបង្ហាញលើផ្ទាំងបញ្ជាក់របស់អ្នកហៅ ហើយបើគ្មាន ម្ចាស់បូតរាយការណ៍វាពេលចុះឈ្មោះ (ខាងក្រោម)។ ម៉ាស៊ីនមេសាធារណៈដែលនរណាក៏អាចហៅបានដោយគ្មានព័ត៌មានផ្ទៀងផ្ទាត់ (auth.type: "none") ត្រូវសរសេរ "accepts": "any" ក្នុងធាតុ endpoint នៃឯកសារនេះ ដើម្បីប្រកាសថាទទួលការហៅពី Pabal។
  • អ្វីដែល Pabal ភ្ជាប់៖ _meta នៃ tools/call មានកាលកំណត់ដែលនៅសល់ me.pabal/budget_ms (មីលីវិនាទី) និងដែនកំណត់ទំហំលទ្ធផល me.pabal/result_budget_bytes ហើយអាចមានការអះអាងដែល Pabal ចុះហត្ថលេខា (me.pabal/assertion, JWT)។ អ្នកចេញ · sub (bot:<id បូត>) · សោផ្ទៀងផ្ទាត់ (JWKS) នៃការអះអាង ត្រូវបានប្រាប់ដោយ getVoiceCallMcpBinding។
  • tools/list មិនលើស 2MB និង 20 ទំព័រ។ មិនត្រូវមានជំហានដែលមនុស្សត្រូវធ្វើ (ដូចជាការចូលតាមកម្មវិធីរុករក) ទេ។
  • ឧបករណ៍នីមួយៗផ្តល់ការចាត់ថ្នាក់តាម _meta["me.pabal/voice"] — data (none·caller·third_party), content (system·third_party_text), effect (none·write·notify·financial), max_ms (មិនលើស 15,000), max_result_bytes (មិនលើស 65,536) និងជាជម្រើស p95_ms។ បើម៉ាស៊ីនមេមិនផ្តល់ ម្ចាស់បូតសរសេរជាន់ដោយ tools ពេលចុះឈ្មោះ។
  • លក្ខណៈបច្ចេកទេស 1.0 ផ្តល់តែ L1 ប៉ុណ្ណោះ៖ មានតែឧបករណ៍ដែលមាន data: "none" និង effect: "none" (ឧបករណ៍ដែលគ្រាន់តែអានព័ត៌មានសាធារណៈ) ទេដែលត្រូវខ្ទាស់ក្នុងការហៅ។ ឧបករណ៍ដែលដោះស្រាយទិន្នន័យរបស់អ្នកហៅ (L2) ឬដំណើរការអ្វីមួយ (L3) ត្រូវកត់ត្រាទុកតែប៉ុណ្ណោះ មិនត្រូវប្រើទេ។
  • ពេលចុះឈ្មោះ Pabal ដំណើរការការសាកល្បងអនុលោមភាព (អាសយដ្ឋាន · TLS · កំណែ · 401 · បញ្ជីឧបករណ៍ · រចនាសម្ព័ន្ធឧបករណ៍ · វិសាលភាពព័ត៌មានផ្ទៀងផ្ទាត់ · ជំហានមនុស្ស)។ បើធ្លាក់ ត្រូវបដិសេធដោយ MCP_CONFORMANCE_FAILED: CT-xx។

ការចុះឈ្មោះ

សម្ងាត់ផ្ញើតែក្នុងតួសំណើប៉ុណ្ណោះ (បើដាក់ក្នុង query string នឹងទទួល 400)។ សូមដាក់វាក្នុងឯកសារ រួចផ្ញើ ដើម្បីកុំឲ្យសម្ងាត់នៅសល់លើបន្ទាត់ពាក្យបញ្ជា។

umask 077
cat > mcp-shop.json <<'EOF'
{"label": "shop",
 "url": "https://mcp.example.com/mcp",
 "auth": {"type": "bearer", "token": "(តូខឹនដែលម៉ាស៊ីនមេ MCP ផ្តល់)"}}
EOF
curl -s "https://pabal.me/bot$BOT_TOKEN/setVoiceCallMcpServer" -H 'Content-Type: application/json' -d @mcp-shop.json
  • label៖ [a-z][a-z0-9]{0,11} មិនអាចចាប់ផ្តើមដោយ pabal។ បូតនីមួយៗមានម៉ាស៊ីនមេបានរហូតដល់ 2។ ឈ្មោះឧបករណ៍ដែលម៉ូដែលឃើញគឺ label__ឈ្មោះឧបករណ៍។
  • auth.type៖ none, bearer (token), headers (រហូតដល់ 3 header), client_credentials (token_url, client_id, client_secret ឬ private_key_jwt: true — ត្រូវហៅ createVoiceCallMcpClientKey ជាមុន)។ មិនទាន់មាន authorization_code ទេ។ none (ម៉ាស៊ីនមេសាធារណៈ) ចុះឈ្មោះបានតែពេលឯកសារសាធារណៈរបស់ប្រតិបត្តិករម៉ាស៊ីនមេនោះប្រកាសថាទទួលការហៅពី Pabal (បើមិនដូច្នោះ នឹងទទួល MCP_OPT_IN_REQUIRED)។
  • ការផ្លាស់ប្តូរដែលធ្វើឲ្យកន្លែងទទួលប្រែប្រួល (ម៉ាស៊ីនមេថ្មី អាសយដ្ឋាន ឬ host តូខឹនផ្សេង ការរាយការណ៍ថ្មី កម្រិតខ្ពស់ជាង) ទទួលចម្លើយ 400 MCP_CHANGE_NEEDS_CONFIRMATION ហើយត្រូវបានអនុវត្តតែពេលម្ចាស់បូតចុចប៊ូតុង បញ្ជាក់ (확인 — 이 변경을 적용) ដែលបង្ហាញនៅ @BotFather ក្នុងរយៈ 5 នាទីប៉ុណ្ណោះ។ គោលបំណងគឺ ទោះបីតូខឹនលេចធ្លាយក៏ដោយ សម្តីរបស់អ្នកហៅមិនទៅកន្លែងផ្សេងដោយស្ងាត់ៗទេ។ ការប្តូរវេន (rotation) ដែលប្តូរតែសម្ងាត់ មានប្រសិទ្ធភាពភ្លាម។
  • បើប្រតិបត្តិករម៉ាស៊ីនមេគ្មានឯកសារសាធារណៈ ម្ចាស់បូតរាយការណ៍កន្លែងទទួល (ស្ថាប័នដំណើរការ · ប្រទេស · ទំនាក់ទំនង · គោលបំណង · ប្រភេទទិន្នន័យ · ទីតាំង · អ្នកដោះស្រាយបន្ត · រយៈពេលរក្សាទុក) តាមការពិតដោយ declaration។ អ្នកហៅឃើញវាលើផ្ទាំងបញ្ជាក់ ហើយពេលវាផ្លាស់ប្តូរ អ្នកហៅត្រូវបានសួរម្តងទៀត។
  • ការចុះឈ្មោះ · ការពិនិត្យ៖ បូតនីមួយៗ 10 ដងក្នុងមួយម៉ោង ម្ចាស់នីមួយៗ 20 ដង។ method ផ្សេងទៀត៖ refreshVoiceCallMcpServer (ពិនិត្យម្តងទៀត) · deleteVoiceCallMcpServer (ធ្វើបានជានិច្ច) · getVoiceCallMcpBinding (អ្នកចេញ · sub · JWKS ដែលម៉ាស៊ីនមេរបស់អ្នកប្រើដើម្បីស្គាល់ការហៅរបស់ Pabal) · និង createVoiceCallMcpClientKey។
  • ស្ថានភាពម៉ាស៊ីនមេ និងឧបករណ៍ដែលបានចុះឈ្មោះ មាននៅក្នុង getVoiceCallSettings.mcp_servers (ផ្លូវ · query · សម្ងាត់ មិនបង្ហាញទេ)។ អត្ថបទពេញនៃលក្ខណៈបច្ចេកទេស (Pabal Voice MCP Profile 1.0) មាននៅ docs/app/voice-bot-mcp-profile.html ក្នុងឃ្លាំងកូដ Pabal។ បើត្រូវការ សូមសុំពីប្រតិបត្តិករម៉ាស៊ីនមេ។

សោម៉ូដែលផ្ទាល់ខ្លួន

សោផ្ទាល់ខ្លួនមិនទាន់អាចប្រើបាននៅលើម៉ាស៊ីនមេផលិតកម្មណាមួយនៅឡើយទេ

ការហៅដែលទទួលដោយសោផ្ទាល់ខ្លួន តម្រូវឲ្យអ្នកហៅឃើញផ្ទាំងបញ្ជាក់ (កំណែ 2) ដែលប្រាប់ថាសំឡេងទៅអ្នកផ្តល់សេវានៃសោនោះ ប៉ុន្តែមិនទាន់មានកម្មវិធីដែលបង្ហាញផ្ទាំងនោះនៅឡើយទេ។ ដូច្នេះម៉ាស៊ីនមេដែលមិនមែនជាម៉ាស៊ីនមេសាកល្បងមិនទទួលសោសោះ រហូតដល់ប្រតិបត្តិករបើកថាកម្មវិធីរួចរាល់ (403 VOICE_OWN_KEY_NOT_AVAILABLE)។ ម៉ាស៊ីនមេក៏ត្រូវមានសោមេដែរ។

ដំណើរការការហៅរបស់បូត ដោយគណនីម៉ូដែលរបស់ម្ចាស់បូតខ្លួនឯង។ ថ្លៃត្រូវគិតលើគណនីអ្នកផ្តល់សេវារបស់ម្ចាស់ ហើយការហៅដោយសោផ្ទាល់ខ្លួន មិនប្រើដែនកំណត់ប្រចាំថ្ងៃរបស់បូត · ម្ចាស់ · ម៉ាស៊ីនមេនៃវេទិកាទេ (ដែនកំណត់របស់អ្នកហៅនៅដដែល)។ លក្ខខណ្ឌម្ចាស់បូតត្រូវមានជាមុន។

curl -s "https://pabal.me/bot$BOT_TOKEN/setVoiceCallApiKey" -d provider=google \
  --data-urlencode "api_key@vertex-sa.json"
  • provider៖ google គឺសោ JSON របស់គណនីសេវា Vertex AI (រក្សាតែវាលដែលចាំបាច់) ហើយ openai គឺសោ API ដែលចាប់ផ្តើមដោយ sk-។ តម្លៃផ្សេងទៀតគឺ VOICE_PROVIDER_INVALID។ សោផ្ញើតែក្នុងតួសំណើប៉ុណ្ណោះ (ក្នុង query គឺ 400) — បើអានពីឯកសារដូចខាងលើ វាមិននៅសល់លើបន្ទាត់ពាក្យបញ្ជាទេ។ កុំបិទភ្ជាប់វាក្នុងការសន្ទនាជាមួយ @BotFather។
  • មុនពេលទទួលសោ ម៉ាស៊ីនមេពិនិត្យថាវាពិតជាបើកបាន តាមវគ្គសាកល្បងរបស់ gateway (រហូតដល់ 12 វិនាទី)។ បើឆ្លងកាត់ វារក្សាទុក ហើយឆ្លើយ True។ បើអ្នកផ្តល់សេវាបដិសេធ នឹងទទួល API_KEY_INVALID · បើចូលបាន ប៉ុន្តែគ្មានសិទ្ធិ API ពេលវេលាពិត នឹងទទួល API_KEY_NO_REALTIME_ACCESS · ហើយបើគ្មាន gateway ដើម្បីសាកល្បង ឬវារវល់ នឹងទទួល 503 API_KEY_CHECK_UNAVAILABLE: …: the key was not kept។
  • ការសាកល្បង៖ បូតនីមួយៗ 5 ដងក្នុងមួយម៉ោង ម្ចាស់នីមួយៗ (បូតទាំងអស់រួមគ្នា) 10 ដង។ រាប់តែការសាកល្បងដែលទៅដល់ gateway ប៉ុណ្ណោះ។
  • សោមិនបង្ហាញនៅកន្លែងណាទេ — ទាំងក្នុងចម្លើយ កំហុស log និងអេក្រង់។ getVoiceCallSettings.api_key មានតែអ្នកផ្តល់សេវា · ថ្ងៃដែលបានកំណត់ · ស្នាមម្រាមដៃ (8 ខ្ទង់) · អាចប្រើបានឬអត់។
  • បើសោដែលបានកំណត់មិនអាចប្រើបាន (លក្ខខណ្ឌផ្លាស់ប្តូរ ម៉ាស៊ីនមេមិនអាចបើកសោ ជាដើម) បូតមិនទទួលការហៅទេ — មិនប្តូរទៅសោរបស់វេទិកាដោយស្ងាត់ៗទេ។ ពេលលុបសោដោយ deleteVoiceCallApiKey (ធ្វើបានជានិច្ច) បូតទទួលដោយសោរបស់វេទិកា ហើយការហៅដែលកំពុងដំណើរការដោយសោនោះ នឹងបញ្ចប់។
  • ការហៅដោយសោផ្ទាល់ខ្លួនគ្មានដែនកំណត់ប្រចាំថ្ងៃរបស់ Pabal ទេ — មានតែដែនកំណត់រយៈពេលនៃការហៅមួយ · ការហៅក្នុងពេលតែមួយ · និងដែនកំណត់របស់អ្នកហៅប៉ុណ្ណោះដែលអនុវត្ត។ ថ្លៃត្រូវគិតលើគណនីរបស់អ្នក ដូច្នេះសូមកំណត់ការជូនដំណឹងថវិកានៅក្នុង console របស់អ្នកផ្តល់សេវា។
  • សោ OpenAI ប្រើបានតែពេលប្រតិបត្តិករ gateway បើកដាច់ដោយឡែក (លំនាំដើមរបស់ gateway គឺតែសោ Google)។ បើគ្មាន gateway ណាបើក ការសាកល្បងសោ OpenAI នឹងទទួល 503 … no_gateway។ ផ្លូវសោ OpenAI មិនទាន់ត្រូវបានសាកល្បងជាមួយ OpenAI ពិតប្រាកដនៅឡើយទេ (តែជាមួយម៉ាស៊ីនមេក្លែងក្លាយ) ហើយការហៅដែលទទួលដោយសោ OpenAI ប្រើសំឡេង OpenAI ដែល gateway កំណត់ (លំនាំដើម marin) ដោយមិនគិតពីការកំណត់សំឡេងរបស់បូត។ សោ Google ត្រូវប្រើនៅតំបន់ Vertex របស់ gateway (us-central1)។
  • ក្នុងរបៀបសំឡេងដើម សោត្រូវរក្សាទុកតែប៉ុណ្ណោះ មិនត្រូវប្រើទេ។

កំណត់ត្រាសន្ទនា

កំណត់ត្រាសន្ទនាមកតែពីម៉ាស៊ីនមេដែលប្រតិបត្តិករបានអនុញ្ញាតប៉ុណ្ណោះ

ប្រតិបត្តិករត្រូវបញ្ចប់ការពិនិត្យផ្នែកច្បាប់ ហើយអនុញ្ញាតនៅក្នុងទំព័រគ្រប់គ្រង (លំនាំដើមបិទ)។ នៅលើម៉ាស៊ីនមេដែលមិនទាន់អនុញ្ញាត ទោះអ្នកបើកកុងតាក់ក៏ដោយ វានៅតែ transcript_available: false, transcript_unavailable_reason: "not_allowed" ហើយអត្ថបទសន្ទនាមិនមកទេ។

ពេលបើក ម្ចាស់បូតទទួលអត្ថបទសន្ទនានៃការហៅដែល AI បានសរសេរ។ សូមយល់ព្រមលក្ខខណ្ឌម្ចាស់បូត រួចបើកកុងតាក់។

កំណត់ត្រាសន្ទនា និងការរក្សាទុកការសន្ទនា គឺខុសគ្នា

កំណត់ត្រាសន្ទនា (ផ្នែកនេះ) ម្ចាស់បូតជាអ្នកបើក ហើយម្ចាស់បូតជាអ្នកទទួល រីឯអ្នកហៅឮសំឡេងជូនដំណឹងពេលតភ្ជាប់។ ការរក្សាទុកការសន្ទនា គឺអ្នកហៅជាអ្នកជ្រើស តាមប្រអប់ធីកនៅលើផ្ទាំងបញ្ជាក់ ហើយបន្ទាប់ពីការហៅចប់ អត្ថបទនៅសល់តែក្នុងការសន្ទនារបស់អ្នកនោះប៉ុណ្ណោះ — មិនទៅដល់បូត ឬម្ចាស់បូតទេ ហើយក៏គ្មានសំឡេងជូនដំណឹងដែរ។ ការហៅមួយអាចមានទាំងពីរ។ ការរក្សាទុកការសន្ទនាគ្មានកុងតាក់ឲ្យម្ចាស់បូតបើកទេ វាបើកពេលគោលការណ៍ឯកជនភាពរបស់ម៉ាស៊ីនមេមានផ្នែក bot-calls-keep-text (កំពុងរៀបចំ — ការប្រើកម្មវិធី — បូតសំឡេង)។

curl -s "https://pabal.me/bot$BOT_TOKEN/setVoiceCallSettings" -d transcript=true
  • ការហៅដែលបូតធ្វើ គ្មានកំណត់ត្រាសន្ទនាទេ (ការហៅពីបូត) — ទោះបើកកុងតាក់ក៏ដោយ។
  • ពេលហៅទៅបូតដែលបើកកំណត់ត្រាសន្ទនា ភ្លាមៗក្រោយសេចក្តីជូនដំណឹង AI អ្នកហៅឮ «What is said on this call is written down and sent to the bot's owner.» (អ្វីដែលនិយាយក្នុងការហៅនេះ ត្រូវសរសេរជាអត្ថបទ ហើយផ្ញើទៅម្ចាស់បូត)។ មានតែសម្តីក្រោយពេលសេចក្តីជូនដំណឹងបញ្ចប់ទេដែលត្រូវសរសេរ។ ការហៅក្នុងរបៀបសំឡេងដើមគ្មានកំណត់ត្រាសន្ទនាទេ។
  • voice_call នៃការហៅដែលបានបញ្ចប់ (event: "ended") មកជាមួយ transcript។ វាជាច្បាប់ពេញលេញតែមួយគត់ ដូច្នេះសូមដាក់ voice_call ក្នុង allowed_updates។ បើចង់ទទួលម្តងមួយវេនក្នុងពេលការហៅ សូមដាក់ voice_call_transcript ផងដែរ (តែតាម HTTP Bot API មិនមកតាម MTProto ទេ)។
  • វេនដែលមានលេខកាត ឬលេខអត្តសញ្ញាណផ្ទាល់ខ្លួន ត្រូវបញ្ជូនដោយប្តូរលេខទាំងអស់ទៅជា *។ លេខដែលនិយាយបំបែកជាពីរវេន ឬអានជាពាក្យ មិនអាចចាប់បានទេ ដូច្នេះសូមប្រុងប្រយ័ត្នជាមួយអត្ថបទដែលទទួលបានផងដែរ។
  • វេនមួយរហូតដល់ 4,096 បៃ · ការហៅមួយរហូតដល់ 256KiB និង 4,000 វេន។ បើលើស ផ្នែកដែលនៅសល់ត្រូវបោះចោល ហើយ truncated: true។
  • Pabal មិនរក្សាទុកអត្ថបទសន្ទនាទេ៖ វានៅក្នុងអង្គចងចាំក្នុងពេលការហៅ បញ្ជូនទៅបូតម្តង ហើយអ្វីដែលមិនត្រូវបានយកទៅ ត្រូវលុបក្រោយ 24 ម៉ោង។ ពេលចាប់ផ្តើមម៉ាស៊ីនមេឡើងវិញ វាបាត់។ ការរក្សាទុក និងការដោះស្រាយក្រោយពេលទទួល ជាការទទួលខុសត្រូវរបស់ម្ចាស់បូត។
"transcript": {
  "turns": [
    {"role": "bot", "text": "Order Helper សូមស្តាប់។ តើខ្ញុំអាចជួយអ្វីបានខ្លះ?", "offset_ms": 5200},
    {"role": "caller", "text": "ការបញ្ជាទិញ A-1042 មកដល់ណាហើយ?", "offset_ms": 9800}
  ],
  "truncated": false
}
{"update_id": 21, "voice_call_transcript": {"voice_call_id": "4611686018427387905", "seq": 2,
 "role": "caller", "text": "ការបញ្ជាទិញ A-1042 មកដល់ណាហើយ?", "is_final": true, "offset_ms": 9800, "date": 1790380813}}

role គឺ caller (អ្នកហៅ) ឬ bot (ម៉ូដែល) ហើយ offset_ms គឺជាមីលីវិនាទីចាប់ពីពេលសំឡេងការហៅចាប់ផ្តើម។

របៀបសំឡេងដើម

របៀបសំឡេងដើមមិនទាន់អាចប្រើបាននៅឡើយទេ

អ្នកហៅអាចហៅទៅបូតសំឡេងដើមបាន តែពេលកម្មវិធីបង្ហាញផ្ទាំងបញ្ជាក់សំឡេងដើម ដែលប្រាប់ថា «សំឡេងនៃការហៅទៅម៉ាស៊ីនមេរបស់អ្នកអភិវឌ្ឍបូត» ប៉ុន្តែមិនទាន់មាន build កម្មវិធីណាដែលមានផ្ទាំងនោះនៅឡើយទេ។ ម៉ាស៊ីនមេក៏ត្រូវមានសោមេ ផ្នែក bot-calls-stream នៃគោលការណ៍ឯកជនភាព ផ្នែកម្ចាស់បូត និង gateway ដែលទទួលសំឡេងដើមដែរ។ បើខ្វះណាមួយ mode=stream នឹងទទួល 403 VOICE_STREAM_NOT_AVAILABLE។

ក្នុងរបៀបសំឡេងដើម សំឡេងនៃការហៅទៅម៉ាស៊ីនមេរបស់ម្ចាស់បូត មិនមែនទៅម៉ូដែល AI របស់ Pabal ទេ។ ម៉ាស៊ីនមេរបស់អ្នកស្តាប់សំឡេង ហើយផ្ញើចម្លើយជាសំឡេងត្រឡប់មកវិញ — ប្រើ AI អ្វីក៏ដោយ គឺអ្នកជាអ្នកសម្រេច (ម៉ូដែលពេលវេលាពិតរបស់អ្នកផ្តល់សេវាផ្សេង ឬការរួមបញ្ចូលការស្គាល់សំឡេង · ការសំយោគសំឡេងរបស់អ្នក)។ Pabal នៅតែចាក់សំឡេងជូនដំណឹង AI នៅដើម ហើយគោរពការបញ្ជាក់របស់អ្នកហៅ · ដែនកំណត់ · រយៈពេលការហៅ · និងដែនកំណត់ការហៅក្នុងពេលតែមួយដដែល។ មិនត្រូវការសេចក្តីណែនាំទេ ហើយឧបករណ៍ · សោផ្ទាល់ខ្លួន · កំណត់ត្រាសន្ទនា ត្រូវរក្សាទុកតែប៉ុណ្ណោះ មិនត្រូវប្រើទេ (stream_ignores)។

អ្នកហៅ Pabal (ម៉ាស៊ីនមេ · gateway) ម៉ាស៊ីនមេ wss ម្ចាស់បូត ① ផ្ទាំងបញ្ជាក់សំឡេងដើម · ហៅ ② upgrade + ហត្ថលេខា · pabal.voice.v1 ③ start {call_id, bot_id, format} ④ ready (ក្នុង 3 វិនាទី) សេចក្តីជូនដំណឹង AI · ក្នុងពេលនេះ សំឡេងអ្នកហៅ មិនទៅម៉ាស៊ីនមេបូតទេ ⑤ live សំឡេង (បញ្ជូនបន្ត) ⑥ PCM16 24 kHz · បំណែក 20 ms ⑦ clear · mark · hangup ⑧ stop {reason} → បិទ 1000
របៀបសំឡេងដើម៖ ម៉ាស៊ីនមេរបស់ម្ចាស់បូតនៅកន្លែងម៉ូដែល

ការពន្យល់ដ្យាក្រាម

  • ជួរឈរបី៖ ខាងឆ្វេងជាអ្នកហៅ កណ្តាលជា Pabal (ម៉ាស៊ីនមេ និង gateway សំឡេង) ខាងស្តាំជាម៉ាស៊ីនមេរបស់ម្ចាស់បូត។ ម៉ាស៊ីនមេបូតមិននិយាយជាមួយកម្មវិធី ឬម៉ាស៊ីនមេ Pabal ដោយផ្ទាល់ទេ តែនិយាយជាមួយ gateway ប៉ុណ្ណោះ តាម WebSocket។
  • ②–④ កើតឡើងក្នុងពេលទូរស័ព្ទកំពុងរោទ៍៖ gateway តភ្ជាប់ TLS ទៅអាសយដ្ឋានសាធារណៈដែលបានពិនិត្យ ធ្វើ upgrade ជាមួយ header ហត្ថលេខា ហើយផ្ញើ start។ ម៉ាស៊ីនមេបូតត្រូវផ្ញើ ready ក្នុង 3 វិនាទី ទើបការហៅត្រូវទទួល បើមិនដូច្នោះ អ្នកហៅឮសញ្ញារវល់។
  • ប្រអប់ប្រផេះជាទ្វារ៖ មុនពេលសំឡេងជូនដំណឹង AI («This is an AI voice bot. The call's audio goes to the bot developer's server.») ចាក់ចប់ សំឡេងអ្នកហៅមិនទៅម៉ាស៊ីនមេបូតទេ ហើយសំឡេងដែលបូតផ្ញើមុនក៏មិនត្រូវចាក់ដែរ។ ពេលវាចប់ភ្លាម ⑤ live ត្រូវផ្ញើ។
  • ⑥ សំឡេងទាំងពីរទិសជា PCM16 · 24 kHz · mono ហើយខាងអ្នកហៅតែងជាបំណែក 20 ms (960 បៃ)។ ព្រួញខៀវជាអ្វីដែល Pabal ផ្ញើ ហើយព្រួញប្រផេះជាអ្វីដែលម៉ាស៊ីនមេបូតផ្ញើ។
  • ⑦ និង ⑧៖ បូតអាចផ្ញើការកាត់សម្តី (clear) ការជូនដំណឹងទីតាំងចាក់ (mark) និងការផ្តាច់ (hangup) ហើយពេលការហៅបញ្ចប់ Pabal ផ្ញើ stop ដែលមានមូលហេតុ រួចបិទដោយ 1000។

ការកំណត់ និង probe

មុនគេ សូមដំណើរការម៉ាស៊ីនមេឧទាហរណ៍ខាងក្រោម នៅលើអាសយដ្ឋានសាធារណៈ (ឈ្មោះត្រូវនឹងវិញ្ញាបនបត្រ)។ probe តភ្ជាប់ទៅម៉ាស៊ីនមេនោះភ្លាមពេលអ្នកកំណត់ ហើយការបរាជ័យព្រោះទៅមិនដល់ក៏ត្រូវរាប់ក្នុងដែនកំណត់ 5 ដងក្នុងមួយម៉ោងដែរ។

ក្រោយពេលយល់ព្រមលក្ខខណ្ឌម្ចាស់បូត (@BotFather → ការហៅជាសំឡេង (음성 통화) → របៀបសំឡេងដើម (원음 모드) → យល់ព្រមលក្ខខណ្ឌម្ចាស់បូត (봇 주인 약관에 동의)) សូមប្រាប់អាសយដ្ឋានម៉ាស៊ីនមេ និងសម្ងាត់។ សម្ងាត់គឺ ASCII ដែលបោះពុម្ពបាន 32 ដល់ 128 តួ (គ្មានដកឃ្លា) ហើយអាសយដ្ឋានថ្មីត្រូវផ្ញើជាមួយសម្ងាត់ថ្មីជានិច្ច។

umask 077
openssl rand -hex 32 | tr -d '\n' > stream-secret.txt      # នៅចុងមិនត្រូវមានការចុះបន្ទាត់ទេ
curl -s "https://pabal.me/bot$BOT_TOKEN/setVoiceCallSettings" -d mode=stream \
  -d stream_url=wss://bot.example.com:8443/voice --data-urlencode "stream_secret@stream-secret.txt"
  1. ទម្រង់អាសយដ្ឋាន៖ តែ wss:// · គ្មានឈ្មោះអ្នកប្រើ # ឬដកឃ្លា · តែ ASCII (តួអក្សរផ្សេងទៀតត្រូវអ៊ិនកូដភាគរយ) · មិនលើស 2,048 តួ។ host ត្រូវជាឈ្មោះដែលមានចំណុច ឬ IP សាធារណៈ (localhost មិនបានទេ) ច្រកគឺ 443 ឬ 1024 ដល់ 65535។ បើមិនដូច្នោះ នឹងទទួល 400 STREAM_URL_INVALID: …។
  2. ដែនកំណត់ probe ត្រូវរាប់នៅពេលស្នើ៖ បូតនីមួយៗ 5 ដងក្នុងមួយម៉ោង ម្ចាស់នីមួយៗ 10 ដង ហើយក្នុងពេលតែមួយ បូតនីមួយៗ 1 · ម្ចាស់នីមួយៗ 2។ បើលើស នឹងទទួល 429។ probe ដែល gateway រវល់ ហើយមិនបានតភ្ជាប់ទៅកន្លែងណា មិនត្រូវរាប់ទេ។
  3. ការពិនិត្យអាសយដ្ឋាន៖ បើឈ្មោះចង្អុលទៅអាសយដ្ឋានឯកជន · បម្រុងទុក ឬអាសយដ្ឋានរបស់ Pabal ខ្លួនឯង សូម្បីតែមួយ នឹងទទួល 400 STREAM_URL_INVALID: the host must resolve only to public addresses។
  4. probe៖ gateway សាកតភ្ជាប់ម្តង ("probe": true ក្នុង start)។ បើ ready មកដល់ វាបើក ហើយសម្ងាត់ត្រូវអ៊ិនគ្រីបក្រោមសោមេរបស់ម៉ាស៊ីនមេ។ បើបរាជ័យ នឹងទទួល 400 STREAM_PROBE_FAILED: <កូដ> — unreachable (មួយក្នុងចំណោម ឈ្មោះ · ការតភ្ជាប់ · ពេលវេលា · TLS) · handshake_failed (ចម្លើយមិនមែន 101 — ជាធម្មតាបដិសេធហត្ថលេខា) · redirect · no_subprotocol · no_ready · bad_ready · address_refused · busy · url ជាដើម — កូដផ្សេងទៀតមកដូចដែល gateway ផ្តល់។ ម៉ាស៊ីនមេរង់ចាំរហូតដល់ 12 វិនាទី។
  5. ពេលរបៀបសំឡេងដើមត្រូវបើក ឬអាសយដ្ឋានត្រូវប្តូរតាម Bot API (តូខឹន) @BotFather ផ្ញើទៅម្ចាស់បូតនូវ «អាសយដ្ឋានសំឡេងដើមត្រូវបានប្តូរទៅ … (សម្ងាត់ …)» (원음 주소가 … 로 바뀌었어요 (비밀 …)) និងប៊ូតុង ត្រឡប់ទៅ managed (관리형으로 돌아가기) ហើយពេលត្រឡប់ទៅ managed វាផ្ញើការពិតនោះ និងប៊ូតុង ការហៅជាសំឡេង (음성 통화)។ គោលបំណងគឺការពារកុំឲ្យតូខឹនលេចធ្លាយ ធ្វើឲ្យសំឡេងទៅម៉ាស៊ីនមេផ្សេងដោយស្ងាត់ៗ។
  • បើដាក់ stream_secret ក្នុង query string នឹងទទួល 400 មុនការពិនិត្យផ្សេងទាំងអស់។ មិនអាចកំណត់របៀបសំឡេងដើមតាមការឆ្លើយតប webhook បានទេ។
  • ដើម្បីត្រឡប់ទៅ managed ប្រើ mode=managed (លុបអាសយដ្ឋាន និងសម្ងាត់)។ បើកំពុងបើក ហើយសេចក្តីណែនាំទទេ នឹងទទួល VOICE_INSTRUCTIONS_REQUIRED ដូច្នេះសូមផ្ញើសេចក្តីណែនាំជាមួយ។
  • នៅលើម៉ាស៊ីនមេដែលទទួលតែបូតដែលប្រតិបត្តិករអនុញ្ញាត ប្រតិបត្តិករត្រូវពិនិត្យអាសយដ្ឋានសំឡេងដើម ហើយអនុញ្ញាតម្តងទៀត ទើបបូតទទួលការហៅ។
  • getVoiceCallSettings បង្ហាញតែ stream_url និងស្នាមម្រាមដៃនៃសម្ងាត់។ ក្នុងការហៅសំឡេងដើម sendVoiceCallContext មិនដំណើរការទេ (VOICE_CONTEXT_NOT_SUPPORTED) ហើយ endVoiceCall ផ្តាច់ភ្លាមដោយគ្មានការលា។

លក្ខណៈបច្ចេកទេស

  • TLS 1.2 ឡើងទៅ វិញ្ញាបនបត្រគឺវិញ្ញាបនបត្រសាធារណៈដែលត្រូវនឹងឈ្មោះក្នុង URL។ gateway តភ្ជាប់ទៅ IP ដែលបានពិនិត្យ ប៉ុន្តែ SNI និងការពិនិត្យវិញ្ញាបនបត្រធ្វើដោយឈ្មោះ។ មិនធ្វើតាមការបង្វែរទិស (redirect, 3xx) ទេ។
  • ត្រូវជ្រើស subprotocol pabal.voice.v1 (Sec-WebSocket-Protocol)។ គ្មានការបង្ហាប់។ សារមួយរហូតដល់ 65,536 បៃ សារអត្ថបទរហូតដល់ 4,096 បៃ (UTF-8)។
  • gateway ផ្ញើ ping រៀងរាល់ 15 វិនាទី។ បើគ្មាន pong ក្នុង 15 វិនាទី វាផ្តាច់ (បណ្ណាល័យភាគច្រើនឆ្លើយដោយស្វ័យប្រវត្តិ)។
  • សារអត្ថបទជាព្រឹត្តិការណ៍ JSON សារប្រព័ន្ធគោលពីរជាសំឡេង។ ទម្រង់សំឡេងមានតែមួយ៖ PCM16 little-endian, mono, 24,000 Hz។ call_id·bot_id ជាខ្សែអក្សរលេខគោលដប់។
ទិសសារពេលណា · អត្ថន័យ
Pabal → បូត{"event":"start","protocol":1,"call_id":"…","bot_id":"…","probe":false,"caller":{"lang":"ko"},"format":{"encoding":"pcm_s16le","sample_rate":24000,"channels":1,"frame_ms":20},"max_seconds":300}ម្តងភ្លាមក្រោយ upgrade។ គ្មានឈ្មោះ · លេខ · ID របស់អ្នកហៅទេ (មានតែ caller.lang — ព័ត៌មានមនុស្សមកតាម update voice_call)
Pabal → បូត{"event":"live"}សេចក្តីជូនដំណឹង AI បានចប់។ ចាប់ពីពេលនេះ សំឡេងធ្វើដំណើរទៅមក
Pabal → បូតប្រព័ន្ធគោលពីរសំឡេងអ្នកហៅ តែង 960 បៃ (20 ms)។ តែក្រោយ live
Pabal → បូត{"event":"mark","name":"…"}សំឡេងនៅមុខ mark ដែលបូតបានផ្ញើ ត្រូវចាក់ចប់ហើយ
Pabal → បូត{"event":"cleared","played_ms":N,"dropped_ms":N,"marks":["…"]}ចម្លើយនៃ clear
Pabal → បូត{"event":"buffer_full","dropped_ms":N}សំឡេងបូតគរលើស 30 វិនាទី ផ្នែកដែលហៀរត្រូវបោះចោល
Pabal → បូត{"event":"stop","reason":"…","played_ms":N,"duration_ms":N}ការហៅបានបញ្ចប់។ នឹងបិទដោយ 1000 ឆាប់ៗ
បូត → Pabal{"event":"ready"}ក្រោយ start ក្នុង 3 វិនាទី មុនគេបង្អស់
បូត → Pabalប្រព័ន្ធគោលពីរសំឡេងបូត៖ ចំនួនបៃគូ · 2 ដល់ 65,536 បៃ។ អ្វីដែលផ្ញើមុន live ត្រូវបោះចោល
បូត → Pabal{"event":"clear"}ការកាត់សម្តី៖ បញ្ឈប់សំឡេងបូតដែលកំពុងតម្រង់ជួរឥឡូវនេះ
បូត → Pabal{"event":"mark","name":"[A-Za-z0-9_.:-]{1,64}"}«ប្រាប់ខ្ញុំពេលចាក់ដល់ទីនេះ»។ ការហៅនីមួយៗរង់ចាំបានរហូតដល់ 256
បូត → Pabal{"event":"hangup"}បញ្ចប់ការហៅ។ ចាក់សំឡេងដែលកំពុងតម្រង់ជួររហូតដល់ 5 វិនាទីមុន រួចផ្តាច់
  • event ដែលមិនស្គាល់ត្រូវមិនអើពើ។ អត្ថបទដែលមិនមែន JSON · អត្ថបទលើស 4KiB · សំឡេងដែលមានចំនួនបៃសេស ឬលើស 64KiB គឺជាការបំពានលក្ខណៈបច្ចេកទេស ហើយបញ្ចប់ការហៅ (អ្នកហៅឮសេចក្តីសុំទោស)។
  • ដែនកំណត់បរិមាណផ្ញើ៖ ព្រឹត្តិការណ៍អត្ថបទជាមធ្យម 50 ក្នុងមួយវិនាទី (អតិបរមាមួយភ្លែត 100) · សំឡេងជាមធ្យម 4 ដងនៃពេលវេលាពិត (អតិបរមាមួយភ្លែត 60 វិនាទី)។ បើ socket របស់បូតមិនអាន ធ្វើឲ្យសំឡេងអ្នកហៅគរលើស 30 វិនាទី (1,500) វាក៏បញ្ចប់ការហៅដែរ។

ហត្ថលេខា

gateway ភ្ជាប់ header នេះទៅសំណើ upgrade។

X-Pabal-Voice-Signature: t=<វិនាទី Unix>,nonce=<hex 16 បៃ>,call=<call_id>,v1=<hex>
v1 = HMAC-SHA256(stream_secret, "pabal-voice-stream/1\n<t>\n<nonce>\n<call>\n<host>\n<path?query>")
  • host គឺ host នៃ URL ដែលអ្នកបានប្រាប់ Pabal (អក្សរតូច គ្មានច្រក)។ មិនត្រូវគណនាដោយ header Host នៃសំណើទេ — តម្លៃនោះសរសេរដោយអ្នកផ្ញើ ដូច្នេះគ្មានប្រសិទ្ធភាពក្នុងការចងជាប់នឹង host ទេ។ path?query គឺផ្លូវ និង query នៃ URL ដូចដើម (បើគ្មាន គឺ /)។ ក្នុង probe call គឺជាលេខ probe។
  • ម៉ាស៊ីនមេបូតត្រូវតែពិនិត្យ៖ |ឥឡូវ − t| ≤ 300 វិនាទី · nonce ដដែលប្រើបានតែម្តង · ហើយប្រៀបធៀប HMAC ជាបៃ ដោយអនុគមន៍ពេលវេលាថេរ។ បើខុស ឆ្លើយដោយចម្លើយដែលមិនមែន 101 ដូចជា 401។
  • ហើយពិនិត្យថា start.call_id ដូច call នៃហត្ថលេខាឬអត់។ បើខុស បិទដោយ 1008 — ដើម្បីកុំឲ្យ upgrade ដែលបានចុះហត្ថលេខា ត្រូវប្រើឡើងវិញសម្រាប់ការហៅផ្សេង។ បើម៉ាស៊ីនមេបម្រើតែបូតមួយ សូមពិនិត្យថា start.bot_id ជាបូតរបស់អ្នកផងដែរ។
  • តម្លៃសាកល្បង៖ សម្ងាត់ example-stream-secret-of-the-bot-developer-0001, t=1790000000, nonce 00112233445566778899aabbccddeeff, call 4611686018427387905, host bot.example.com, ផ្លូវ /voice?bot=100042 → v1=807517ff96ac75223bde35b48c775f49a2eda2fb4832a02c0ea832b914d70d0c។

សំឡេង · ការកាត់សម្តី · mark · ការបញ្ចប់

  • buffer បូត → អ្នកហៅ៖ gateway បញ្ចេញតាមល្បឿនចាក់ ដូច្នេះអាចផ្ញើម្តងច្រើនបាន ប៉ុន្តែបើគរលើស 30 វិនាទី ផ្នែកដែលហៀរត្រូវបោះចោល ហើយវាផ្ញើ buffer_full។ បើសំឡេងបូតដាច់ 300 ms វាចាត់ទុកថា «ដុំ» មួយបានបញ្ចប់ (ឯកតានៃ mark·clear)។
  • clear៖ បោះចោលសំឡេងបូតដែលមិនទាន់ចេញទាំងអស់ ហើយស្ងាត់ចាប់ពី 10 ms បន្ទាប់ (វាស់បានតិចជាង 50 ms)។ ក្នុងចម្លើយ cleared played_ms គឺផលបូកសំឡេងបូតដែលបានចាក់ពិតប្រាកដក្នុងការហៅនេះរហូតមកដល់ពេលនេះ dropped_ms គឺបរិមាណដែលបោះចោលលើកនេះ ហើយ marks គឺឈ្មោះ mark ដែលជាប់នឹងដុំដែលត្រូវបោះចោល — ប្រើវាដើម្បីប្រាប់ម៉ូដែលថា «ត្រូវកាត់នៅត្រង់ណា»។
  • mark៖ ពេលសំឡេងនៅមុខវាត្រូវចាក់ចប់ វាត្រឡប់មកវិញដោយឈ្មោះដដែល។ សំឡេងនៅមុខ mark គួរបញ្ចប់នៅពហុគុណនៃ 480 បៃ (10 ms) (បំណែកដែលនៅសល់ត្រូវបំពេញដោយភាពស្ងាត់)។
  • ការបញ្ចប់៖ បូតផ្ញើ hangup ឬបិទស្អាតដោយ 1000·1001។ ការបិទផ្សេងទៀត ឬការដាច់ TCP ត្រូវបញ្ចប់ដូចការបំពានលក្ខណៈបច្ចេកទេស (អ្នកហៅឮសេចក្តីសុំទោស)។ ពេល Pabal បញ្ចប់ stop.reason ជាកូដខ្លី — hangup (អ្នកហៅផ្តាច់) max_length bot_ended disconnect drain kill_switch operator link_lost media_failed … តម្លៃដែលមិនស្គាល់ សូមចាត់ទុកជា «បានបញ្ចប់»។
  • start នៃ probe មាន "probe": true, caller ទទេ និង max_seconds: 0។ ពេលអ្នកផ្ញើ ready {"event":"stop","reason":"probe"} មកដល់ ហើយការតភ្ជាប់ត្រូវបិទ។ ក្នុង probe កុំបើកអ្វីដែលមានថ្លៃ ដូចជាវគ្គម៉ូដែល។

ឧទាហរណ៍ — ម៉ាស៊ីនមេសំឡេងដើមតូចបំផុត

នេះជាម៉ាស៊ីនមេដែលពិនិត្យលក្ខណៈបច្ចេកទេសទាំងមូលដោយគ្មាន AI៖ ចាក់សំឡេងកណ្តឹងពេល live បន្ទាប់មកបញ្ជូនសំឡេងអ្នកហៅត្រឡប់ដូចដើម (echo)។ វាពិនិត្យហត្ថលេខា · ពេលវេលា · nonce · ការហៅ · បូត ទាំងអស់។ មុនគេ សូមប្រើវាដើម្បីមើលថាការហៅដំណើរការរហូតដល់ចប់ រួចដាក់ AI របស់អ្នកនៅកន្លែង echo។ ឃ្លាំងកូដ Pabal ក៏មាន scripts/bots/stream_echo_bot.py (រួមទាំងការបង្ហាញការកាត់សម្តី) និង scripts/bots/stream_openai_relay.mjs (បញ្ជូនបន្តទៅ Realtime ដោយសោ OpenAI របស់អ្នក ជាឧទាហរណ៍ដែលមិនទាន់បានសាកដំណើរការ) ផងដែរ។ បើត្រូវការ សូមសុំពីប្រតិបត្តិករម៉ាស៊ីនមេ។

# stream_bot.py — pip install "websockets>=13"
# ដំណើរការ៖ STREAM_SECRET_FILE=stream-secret.txt TLS_CERT=fullchain.pem TLS_KEY=privkey.pem \
#       PUBLIC_HOST=bot.example.com BOT_ID=<id បូត — លេខនៅមុខ : នៃតូខឹន> python3 stream_bot.py
import asyncio
import hashlib
import hmac
import json
import math
import os
import ssl
import struct
import time

from websockets.asyncio.server import serve

SECRET = open(os.environ["STREAM_SECRET_FILE"], "rb").read().strip()
PUBLIC_HOST = os.environ["PUBLIC_HOST"].lower()   # host នៃ stream_url ដែលបានប្រាប់ Pabal (មិនមែន header Host ទេ)
BOT_ID = os.environ.get("BOT_ID", "")             # បើទុកទទេ ទទួលការហៅរបស់បូតណាក៏បាន
PATH = os.environ.get("STREAM_PATH", "/voice")
PORT = int(os.environ.get("PORT", "8443"))
CHIME = b"".join(struct.pack("<h", int(8000 * math.sin(2 * math.pi * 880 * i / 24000)))
                 for i in range(24000 * 6 // 10))  # 880 Hz រយៈ 0.6 វិនាទី PCM16 24 kHz
seen = {}                                         # nonce ដែលបានប្រើម្តងហើយ


def signed_call(header, target):
    """ពិនិត្យ X-Pabal-Voice-Signature ហើយត្រឡប់ call id ដែលបានចុះហត្ថលេខា។ បើខុស None។"""
    try:
        parts = dict(p.split("=", 1) for p in header.split(","))
        t, nonce, call, v1 = int(parts["t"]), parts["nonce"], parts["call"], parts["v1"]
    except (KeyError, ValueError):
        return None
    now = time.time()
    if abs(now - t) > 300 or nonce in seen:
        return None
    text = f"pabal-voice-stream/1\n{t}\n{nonce}\n{call}\n{PUBLIC_HOST}\n{target}"
    expected = hmac.new(SECRET, text.encode("utf-8", "surrogateescape"), hashlib.sha256).hexdigest()
    if not hmac.compare_digest(expected.encode(), v1.encode("utf-8", "surrogateescape")):  # ជាបៃ
        return None
    for old in [n for n, at in seen.items() if at < now - 600]:
        del seen[old]
    seen[nonce] = now
    return call


def check(connection, request):
    if request.path.split("?", 1)[0] != PATH:
        return connection.respond(404, "not here\n")
    call = signed_call(request.headers.get("X-Pabal-Voice-Signature", ""), request.path)
    if call is None:
        return connection.respond(401, "bad signature\n")
    connection.signed_call = call                 # start ត្រូវនិយាយអំពីការហៅនេះ
    return None


async def handle(ws):
    if ws.subprotocol != "pabal.voice.v1":
        await ws.close(1002, "pabal.voice.v1 only")
        return
    start = json.loads(await asyncio.wait_for(ws.recv(), 5))
    if (start.get("event") != "start" or start.get("call_id") != ws.signed_call
            or (BOT_ID and start.get("bot_id") != BOT_ID)):
        await ws.close(1008, "not this call")
        return
    await ws.send(json.dumps({"event": "ready"}))    # ក្នុង 3 វិនាទី មុនគេបង្អស់
    live = False
    async for message in ws:
        if isinstance(message, bytes):
            if live:
                await ws.send(message)            # បញ្ជូន 20 ms របស់អ្នកហៅត្រឡប់ដូចដើម (echo)
            continue
        event = json.loads(message)
        if event.get("event") == "live" and not start.get("probe"):   # សេចក្តីជូនដំណឹង AI បានចប់
            live = True
            await ws.send(CHIME)
            await ws.send(json.dumps({"event": "mark", "name": "chime"}))
        elif event.get("event") == "stop":
            print("ចប់៖", start["call_id"], event.get("reason"), flush=True)
            break


async def main():
    tls = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
    tls.minimum_version = ssl.TLSVersion.TLSv1_2
    tls.load_cert_chain(os.environ["TLS_CERT"], os.environ["TLS_KEY"])
    async with serve(handle, "0.0.0.0", PORT, ssl=tls, subprotocols=["pabal.voice.v1"],
                     process_request=check, max_size=65536, compression=None):
        print(f"កំពុងស្តាប់៖ wss://{PUBLIC_HOST}:{PORT}{PATH}", flush=True)
        await asyncio.get_running_loop().create_future()


asyncio.run(main())

អ្វីដែលអ្នកហៅឃើញ

  • ប៊ូតុងហៅ៖ ប៊ូតុងហៅបង្ហាញនៅខាងលើការសន្ទនា និងក្នុងប្រវត្តិរូបរបស់បូតសំឡេង។ វាបង្ហាញតែពេលម៉ាស៊ីនមេវិនិច្ឆ័យថាអាចទទួលការហៅរបស់មនុស្សនោះ · នៅលើឧបករណ៍នោះបាន (មុនបើកជាសាធារណៈ តែចំពោះអ្នកសាកល្បង)។ គ្មានការហៅជាវីដេអូទេ។
  • ផ្ទាំងបញ្ជាក់ (មុនសិទ្ធិមីក្រូហ្វូន)៖ ចំណងជើង «An AI answers this call» (AI នឹងឆ្លើយការហៅនេះ) · បូតមិនមែនជាមនុស្ស ហើយសំឡេងក៏ត្រូវបង្កើតដោយ AI · មិនអ៊ិនគ្រីបពីចុងដល់ចុង · កន្លែងទទួលសំឡេង (Google, Gemini Live API របស់ Vertex AI) និងប្រទេស/តំបន់ (United States (Iowa, Google Cloud us-central1)) · អ្វីដែលត្រូវផ្ញើ (សំឡេងក្នុងពេលការហៅ អត្ថបទសន្ទនា និងចម្លើយរបស់ AI កំណត់ចំណាំដែលបូតដាក់ក្នុងពេលការហៅ និងលទ្ធផលមុខងាររបស់បូត) · ការរក្សាទុក (Pabal មិនរក្សាទុកសំឡេងទេ រក្សាតែកំណត់ត្រាការហៅ 180 ថ្ងៃ ហើយ Google មិនរក្សាទុកក្រោយពេលបង្កើតចម្លើយទេ ប៉ុន្តែខ្លឹមសារដែលការត្រួតពិនិត្យស្វ័យប្រវត្តិសង្ស័យថាជាការរំលោភបំពាន អាចត្រូវកត់ត្រារហូតដល់ 90 ថ្ងៃ) · អ្វីដែលម្ចាស់បូតទទួល (ឈ្មោះ លេខគណនី និងភាសា ពេលវេលា និងរយៈពេលការហៅ តម្លៃដែលបានប្រើសម្រាប់ឧបករណ៍ — មិនមែនលេខទូរស័ព្ទ និងសំឡេងទេ) · និងអាយុចាប់ពី 19 ឆ្នាំ។ ប៊ូតុងគឺ «I'm 19 or older · Call» និងបោះបង់។ អាយុមិនមែនជាការផ្ទៀងផ្ទាត់អត្តសញ្ញាណទេ គឺជាការបញ្ជាក់ដោយខ្លួនឯង។ ប៊ូតុងហៅជាប៊ូតុងចម្បង (ពណ៌សង្កត់ធ្ងន់) ហើយបោះបង់ជាប៊ូតុងបន្ទាប់បន្សំ។ នៅលើម៉ាស៊ីនមេដែលបើករក្សាទុកការសន្ទនា ប្រអប់ធីក «Keep this call's conversation as text in my chat» (រក្សាទុកការសន្ទនានៃការហៅនេះជាអត្ថបទនៅក្នុងការសន្ទនារបស់ខ្ញុំ · លំនាំដើមបិទ) ត្រូវបានបន្ថែមនៅក្រោយការពន្យល់។
  • សួរញឹកញាប់ប៉ុណ្ណា៖ កុំព្យូទ័រ · Android សួរពេលហៅទៅបូតនោះជាលើកដំបូង (សួរម្តងទៀតពេលកន្លែងទទួល ឬកំណែផ្ទាំងផ្លាស់ប្តូរ) ហើយ iPhone និង Apple Watch សួររាល់ពេល។ នាឡិកាបង្ហាញផ្ទាំងទាំងមូលរាល់ពេល ហើយតម្លៃដំបូងនៃកុងតាក់រក្សាទុកការសន្ទនា គឺជាជម្រើសនៃការហៅចុងក្រោយទៅបូតនោះ។ កម្មវិធីផ្ញើការយល់ព្រមទៅម៉ាស៊ីនមេរាល់ការហៅ ហើយម៉ាស៊ីនមេប្រើការយល់ព្រមមួយពីឧបករណ៍ដដែល · បូតដដែល · ក្នុងរយៈ 2 នាទី សម្រាប់ការហៅនោះតែម្តងប៉ុណ្ណោះ។
  • ពេលតភ្ជាប់៖ សំឡេងជូនដំណឹង AI «You're now talking to an AI voice bot.» (បើជាបូតសំឡេងដើម «This is an AI voice bot. The call's audio goes to the bot developer's server.») → (បើជាបូតកំណត់ត្រាសន្ទនា) សេចក្តីជូនដំណឹងអំពីកំណត់ត្រាសន្ទនា → ពាក្យស្វាគមន៍របស់បូត។ ម្ចាស់បូតមិនអាចបិទសេចក្តីជូនដំណឹងបានទេ ហើយសម្តីរបស់អ្នកហៅមុនពេលសេចក្តីជូនដំណឹងចប់ មិនទៅម៉ូដែលទេ។ ការរក្សាទុកការសន្ទនាគ្មានសំឡេងជូនដំណឹងទេ — ព្រោះអ្នកហៅបានជ្រើសដោយខ្លួនឯងនៅលើអេក្រង់។
  • ភាសានៃសេចក្តីជូនដំណឹង៖ សំឡេងជូនដំណឹងមិនតាម language របស់បូតទេ តែតាមភាសានៃផ្ទាំងបញ្ជាក់ដែលអ្នកហៅបានអាន។ សេចក្តីជូនដំណឹងទាំងអស់ក្នុងការហៅមួយ ជាភាសាតែមួយ — សេចក្តីជូនដំណឹង AI សេចក្តីជូនដំណឹងអំពីកំណត់ត្រាសន្ទនា និងការសុំទោសពេលការតភ្ជាប់ដាច់ (បើជាបូតសំឡេងដើម គឺសេចក្តីជូនដំណឹងសំឡេងដើម និងការសុំទោស)។ បើមានសូម្បីតែមួយក្នុងចំណោមនោះ ដែលគ្មានការថតសំឡេងជាភាសានោះដែលបានពិនិត្យរួច ទាំងអស់នឹងចេញជាភាសាអង់គ្លេស។ បច្ចុប្បន្ន ភាសាដែលបានពិនិត្យរួចមានតែភាសាកូរ៉េ និងអង់គ្លេសប៉ុណ្ណោះ។ ផ្ទាំងបញ្ជាក់ និងសេចក្តីជូនដំណឹងនៃ 8 ភាសាផ្សេងទៀត (ជប៉ុន ចិន បារាំង អេស្ប៉ាញ ឥណ្ឌូណេស៊ី វៀតណាម ខ្មែរ អារ៉ាប់) ជាសេចក្តីព្រាងដែលកំពុងរង់ចាំការពិនិត្យផ្នែកច្បាប់ និងការពិនិត្យដោយអ្នកនិយាយភាសានោះពីកំណើត ដូច្នេះបច្ចុប្បន្ន សូម្បីតែអ្នកហៅដែលប្រើកម្មវិធីជាភាសាទាំងនោះ ក៏ឃើញផ្ទាំងបញ្ជាក់ជាភាសាអង់គ្លេស ហើយឮសេចក្តីជូនដំណឹងជាភាសាអង់គ្លេសដែរ។ ការថតសំឡេងជាភាសាខ្មែរ និងឃ្លា «Just a moment longer, please.» ជាភាសាជប៉ុន នៅតែរង់ចាំឲ្យមនុស្សស្តាប់ រួចជ្រើសរើស។ នៅពីមុខសេចក្តីជូនដំណឹងដំបូងនៃការហៅ និងសេចក្តីជូនដំណឹងអំពីកំណត់ត្រាសន្ទនា តែងតែមានភាពស្ងាត់យ៉ាងតិច 300 ms — ដើម្បីកុំឲ្យផ្លូវទូរស័ព្ទលេបពាក្យដំបូង។
  • អេក្រង់ការហៅ៖ ក្រោមឈ្មោះ «@{username} · AI · Bot» និង «AI-generated voice · Call audio is processed by Google»។ គ្មានសោ emoji និងអត្ថបទអំពីការអ៊ិនគ្រីបទេ។
  • បើការតភ្ជាប់មានបញ្ហា អ្នកហៅឮ «Sorry, we've lost the connection. Ending the call now.» រួចការហៅត្រូវផ្តាច់។ ការបដិសេធទាំងអស់បញ្ចប់ដោយសញ្ញារវល់។

ការពន្យល់សម្រាប់អ្នកប្រើកម្មវិធី មាននៅ ការប្រើកម្មវិធី — ការហៅទៅបូតសំឡេង។

ការហៅពីបូត

បិទនៅលើ pabal.me — កំពុងរង់ចាំការពិនិត្យផ្នែកច្បាប់

ម៉ាស៊ីនមេមានមុខងារនេះរួចហើយ ប៉ុន្តែគ្មានបូតណាអាចហៅទៅនរណាម្នាក់បានទេ រហូតដល់ផ្នែក bot-calls-outbound ក្នុងគោលការណ៍ឯកជនភាព និងផ្នែក voice-bot-owners-outbound ក្នុងលក្ខខណ្ឌនៃសេវាកម្ម ឆ្លងកាត់ការពិនិត្យផ្នែកច្បាប់ ហើយត្រូវបានផ្សាយ។ កំណែកម្មវិធីដែលមានផ្ទាំងអនុញ្ញាតក៏មិនទាន់ចេញដែរ (ស្ថានភាពបច្ចុប្បន្ន)។ ខាងក្រោមនេះពិពណ៌នាពីដំណើរការនៅលើម៉ាស៊ីនមេដែលបានបើកមុខងារនេះ។

បូតសំឡេងក៏អាចហៅទៅមនុស្សម្នាក់មុនបានដែរ៖ ដើម្បីបញ្ជាក់ការណាត់ ដាស់នៅម៉ោងដែលបានជ្រើស ឬជូនដំណឹងពីការដឹកជញ្ជូន។ កូដរបស់ម្ចាស់បូតស្នើដោយ startVoiceCall ម៉ាស៊ីនមេពិនិត្យសំណើ ហើយរោទ៍ឧបករណ៍របស់មនុស្សនោះ។ បើគេលើក សេចក្តីជូនដំណឹងរបស់ Pabal ចាក់មុន បន្ទាប់មកម៉ូដែលសំឡេង AI និយាយតាមសេចក្តីណែនាំរបស់បូត។ របៀបដែលការហៅបានបញ្ចប់ មកក្នុង update voice_call។

  • ហៅតែមនុស្សដែលបានអនុញ្ញាត។ មនុស្សនោះត្រូវអនុញ្ញាតឲ្យបូតនោះហៅខ្លួននៅក្នុងកម្មវិធី Pabal (ការអនុញ្ញាតរបស់អ្នកទទួលការហៅ) ហើយអាចបិទបានគ្រប់ពេល។
  • មិនមែនការហៅផ្សាយពាណិជ្ជកម្មទេ។ មានគោលបំណងបួន — ការរំលឹក ការដាស់ ការដឹកជញ្ជូន និងការណាត់ — ហើយមិនអនុញ្ញាតឲ្យផ្សាយពាណិជ្ជកម្ម ការលក់ ឬការផ្សព្វផ្សាយទេ (លក្ខខណ្ឌម្ចាស់បូត ចំណុច 12–24)។
  • ការហៅពីបូតមិនត្រូវបានអ៊ិនគ្រីបពីចុងម្ខាងទៅចុងម្ខាងទេ — សំឡេងឆ្លងកាត់ម៉ាស៊ីនមេ Pabal និងអ្នកផ្តល់ AI។ ពេលមនុស្សនោះលើក សំឡេងត្រូវផ្ញើទៅ Google ក្នុងពេលហៅ — Gemini Live API របស់ Vertex AI នៅរដ្ឋ Iowa សហរដ្ឋអាមេរិក (Google Cloud us-central1)។ Pabal មិនរក្សាទុកសំឡេងទេ។
  • អត្ថបទនៃការសន្ទនាមិនទៅដល់ម្ចាស់បូតទេ។ ការហៅដែលបូតធ្វើ គ្មានកំណត់ត្រាសន្ទនាទេ។ អ្វីដែលម្ចាស់បូតទទួលបាន គឺរឿងប្រាំនៅក្នុង អ្វីដែលអ្នកទទួលការហៅឃើញ និងឮ។

លំហូរ

កូដរបស់បូត ម៉ាស៊ីនមេ Pabal Gateway · ម៉ូដែល កម្មវិធីរបស់គេ ① startVoiceCall ការពិនិត្យ៖ បូត · ការអនុញ្ញាត · ដែនកំណត់ ម៉ោងស្ងាត់ · កំពុងផ្អាក ② 200 {voice_call_id} ③ dial ④ រោទ៍៖ ឈ្មោះ (AI) ⑤ លើក ⑥ សេចក្តីជូនដំណឹង Pabal ⑦ បូត៖ ឈ្មោះ · AI · គោលបំណង ការហៅ — សំឡេងឆ្លងកាត់ gateway និងម៉ូដែល AI ⑧ voice_call: started · ended មិនលើក · មិនរោទ៍៖ not_answered
ការហៅមួយពីបូត៖ សំណើ → ការពិនិត្យ → រោទ៍ → លើក → សេចក្តីជូនដំណឹង → ពាក្យដំបូង → បញ្ចប់

ការពន្យល់ដ្យាក្រាម

  • ផ្លូវបួន៖ ពីឆ្វេង គឺកូដរបស់ម្ចាស់បូត ម៉ាស៊ីនមេ Pabal gateway សំឡេងរួមជាមួយម៉ូដែល AI និងកម្មវិធីរបស់អ្នកទទួលការហៅ។ បន្ទាត់ចុចបញ្ឈរគឺពេលវេលា បន្ទាត់ពណ៌ខៀវគឺការហៅដែលកំពុងដំណើរការ ហើយបន្ទាត់ពណ៌ប្រផេះគឺចម្លើយទៅបូត។
  • ប្រអប់ប្រផេះនៅ ① — ការពិនិត្យបីដង៖ មុនពេលឆ្លើយ ពិនិត្យខាងបូត (បានបើកឬនៅ ការពិនិត្យរបស់ប្រតិបត្តិករ លក្ខខណ្ឌ ដែនកំណត់) និងថាមានការអនុញ្ញាតឬអត់ ក្រោយ 200 ពិនិត្យខាងមនុស្សនោះ (ម៉ោងស្ងាត់ កំពុងផ្អាក ដែនកំណត់ប្រចាំថ្ងៃ និងចន្លោះពេលរបស់មនុស្សនោះ ឧបករណ៍ដែលអាចរោទ៍) ហើយពិនិត្យម្តងទៀតមុនពេលរោទ៍។
  • 200 នៅ ② មានន័យត្រឹមតែ «បានទទួល»។ ថាតើបានរោទ៍ ឬមានគេលើកឬអត់ មានតែ update នៅ ⑧ ទេដែលប្រាប់។
  • ④–⑦ ខាងមនុស្សនោះ៖ ការរោទ៍បង្ហាញ "(AI)" បន្ទាប់ពីឈ្មោះបូត ហើយពេលលើក សេចក្តីជូនដំណឹងរបស់ Pabal (⑥) ចាក់មុនបូត។ នៅពាក្យដំបូង (⑦) បូតប្រាប់ឈ្មោះ ថាខ្លួនជា AI និងគោលបំណងនៃការហៅ។ ក្នុងរយៈប្រអប់បៃតង សំឡេងឆ្លងកាត់ gateway និងម៉ូដែល AI — មិនត្រូវបានអ៊ិនគ្រីបពីចុងម្ខាងទៅចុងម្ខាងទេ។
  • បន្ទាត់ចុចពណ៌ក្រហមគឺចំណុចសំខាន់៖ សំណើដែលមិនដែលរោទ៍ ដោយសារខាងមនុស្សនោះ និងសំណើដែលរោទ៍តែគ្មានអ្នកលើក បញ្ចប់ដូចគ្នា នៅពេលដូចគ្នា ដោយ not_answered។ បូតមិនអាចដឹងថាពេលនោះមនុស្សនោះកំពុងគេង ឬកំពុងហៅផ្សេងទេ។

បើក — @BotFather

ការហៅពីបូតត្រូវបានបើកដោយម្ចាស់បូតតែនៅក្នុង @BotFather ប៉ុណ្ណោះ មិនដែលដោយតូខឹនទេ (ការផ្ញើវាលនៃការហៅទៅ setVoiceCallSettings នឹងទទួល 400 VOICE_FIELD_NOT_AVAILABLE)។ ការហៅជាសំឡេង ត្រូវបើកជាមុនសិន។ /mybots → បូត → ការហៅជាសំឡេង (음성 통화) → ការហៅពីបូត (봇이 거는 전화) → បើក (켜기)។

켜기
BotFather@order_helper_bot 이 사람에게 전화를 걸 수 있게 할까요? • 이 봇에게 전화를 허락한 사람에게만 걸어요. 허락은 그 사람이 파발 앱에서 하고, 언제든 끌 수 있어요. • 그 사람의 조용한 시간과 쉬는 중에는 울리지 않아요. • 하루 상한(지금 50번)과 서버의 한도가 있어요. • 운영자가 이 봇의 이름·사진·지시문·목소리·목적을 검토하고 허락해야 걸려요. 무엇이든 바뀌면 다시 검토해요. • 봇이 거는 전화는 종단 간 암호화가 아니에요. 통화 소리는 파발 서버와 AI 제공자를 거쳐요.
켜기
BotFather봇이 거는 전화를 켰어요. 운영자가 이 봇을 검토하고 허락하면 Bot API 의 startVoiceCall 로 걸 수 있어요. 봇이 거는 전화 · @order_helper_bot 상태: 켜짐 운영자 허락: 대기 목적: 배달 하루 상한: 50번 오늘: 요청 0 · 받음 0 · 안 받음 0 이 봇에게 전화를 허락한 사람에게만, 그 사람의 조용한 시간과 쉬는 중을 피해 걸어요. 봇이 거는 전화는 종단 간 암호화가 아니에요 — 통화 소리는 파발 서버와 AI 제공자를 거쳐요.

BotFather ឆ្លើយជាភាសាកូរ៉េ។ សារទីមួយសួរថាតើអនុញ្ញាតឲ្យបូតហៅទៅមនុស្សឬទេ៖ ហៅតែមនុស្សដែលបានអនុញ្ញាត មិនដែលក្នុងម៉ោងស្ងាត់ ឬពេលកំពុងផ្អាករបស់គេ ក្នុងដែនកំណត់ប្រចាំថ្ងៃ (ឥឡូវ 50) និងដែនកំណត់របស់ម៉ាស៊ីនមេ ហើយតែក្រោយពេលប្រតិបត្តិករពិនិត្យ និងអនុញ្ញាតឈ្មោះ រូបថត សេចក្តីណែនាំ សំឡេង និងគោលបំណងរបស់បូត (ហើយពិនិត្យម្តងទៀតរាល់ពេលមានអ្វីផ្លាស់ប្តូរ)។ ការហៅពីបូតមិនត្រូវបានអ៊ិនគ្រីបពីចុងម្ខាងទៅចុងម្ខាងទេ។ សារទីពីរគឺអេក្រង់របស់បូតក្រោយពេលបើក៖ បានបើក កំពុងរង់ចាំប្រតិបត្តិករ គោលបំណងការដឹកជញ្ជូន ដែនកំណត់ 50 និងសំណើថ្ងៃនេះ។

  • លក្ខខណ្ឌកំណែ 4៖ បើអ្នកមិនទាន់យល់ព្រម លក្ខខណ្ឌម្ចាស់បូត នឹងបង្ហាញមុនពេលបើក។ ចំណុច 12–24 គឺជាការសន្យាសម្រាប់ការហៅពីបូត។
  • គោលបំណង៖ បើកបានតែពេលជ្រើសយ៉ាងហោចណាស់មួយក្នុងចំណោម reminder (ការរំលឹក) · wake_up (ការដាស់) · delivery (ការដឹកជញ្ជូន) · appointment (ការណាត់)។ សំណើនីមួយៗសរសេរមួយក្នុងចំណោមនោះ ហើយគោលបំណងដែលបូតមិនបានជ្រើស នឹងទទួល 400។ ការប្តូរគោលបំណង នឹងសួរមនុស្សដែលបានអនុញ្ញាតម្តងទៀត ហើយប្រតិបត្តិករពិនិត្យម្តងទៀត។
  • ដែនកំណត់ប្រចាំថ្ងៃ៖ ចំនួនសំណើដែលបូតអាចផ្ញើក្នុងមួយថ្ងៃ — 10 · 20 ឬ 50 (លំនាំដើម 50)។
  • ការពិនិត្យរបស់ប្រតិបត្តិករ៖ ប្រតិបត្តិករមើលឈ្មោះ @ឈ្មោះអ្នកប្រើ រូបថត សេចក្តីណែនាំ ពាក្យស្វាគមន៍ ឧបករណ៍ សំឡេង ភាសា របៀប គោលបំណង និងឈ្មោះម្ចាស់បូត នៅលើទំព័រគ្រប់គ្រង ហើយអនុញ្ញាត។ បើអ្វីមួយផ្លាស់ប្តូរ បូតមិនអាចហៅបានទេ រហូតដល់ត្រូវអនុញ្ញាតម្តងទៀត (403 VOICE_OUTBOUND_OFF: review)។
  • តូខឹន៖ ការប្តូរការកំណត់សំឡេងដោយតូខឹន (លើកលែងការបិទសំឡេង) នឹងបង្កកការហៅពីបូត 24 ម៉ោង (frozen)។ បើអ្នកជាអ្នកប្តូរ ចូរដោះដោយ ខ្ញុំជាអ្នកប្តូរ (내가 바꿨어요, vdk·vdK) នៅក្នុង @BotFather។ ការចេញតូខឹនថ្មីក៏បង្កក 24 ម៉ោងដែរ បញ្ចប់ការហៅដែលកំពុងដំណើរការ ហើយលុប webhook របស់បូតដែលបានបើកការហៅ។
  • មានតែបូតភាសាកូរ៉េ ឬអង់គ្លេស (ko-KR·en-US) ទេដែលអាចហៅបាន។ បូតក្នុងរបៀបសំឡេងដើម ប្រើសោផ្ទាល់ខ្លួន ឧបករណ៍ ឬម៉ាស៊ីនមេ MCP មិនអាចហៅបានទេ (mode)។

ការអនុញ្ញាតរបស់អ្នកទទួលការហៅ

បូតមិនអាចទទួលការអនុញ្ញាតដោយខ្លួនឯងបានទេ។ មនុស្សនោះបើកផ្ទាំងអនុញ្ញាតរបស់បូតនោះនៅក្នុងកម្មវិធី Pabal ហើយចុច "I am 19 or older · Allow" (ខ្ញុំមានអាយុ 19 ឆ្នាំឡើងទៅ · អនុញ្ញាត)។ ផ្ទាំងនោះប្រាប់ថា AI ជាអ្នកហៅ គោលបំណង ឈ្មោះម្ចាស់បូត កន្លែងដែលសំឡេងទៅ និងម៉ោងស្ងាត់ (ការប្រើកម្មវិធី — អនុញ្ញាតឲ្យបូតហៅមកអ្នក)។ មានបីកន្លែងសម្រាប់បើកផ្ទាំងនេះ។

  • ម៉ឺនុយរបស់បូត៖ "Allow calls…" (អនុញ្ញាតការហៅ…) ក្នុងការសន្ទនា ឬប្រវត្តិរូបរបស់បូត។
  • តំណក្នុងការសន្ទនា 1:1៖ បូតផ្ញើ https://pabal.me/<ឈ្មោះអ្នកប្រើរបស់បូត>?callme=1 ទៅការសន្ទនា 1:1 ជាមួយមនុស្សនោះ ជាតំណក្នុងអត្ថបទ ឬប៊ូតុង URL ក្នុងជួរ។ ផ្ទាំងបើកតែសម្រាប់សារដែលបូតនោះផ្ញើក្នុងការសន្ទនានោះប៉ុណ្ណោះ — តំណដែលបញ្ជូនបន្តទៅការសន្ទនាផ្សេង ការមើលជាមុន ឬគេហទំព័រ គ្រាន់តែបើកការសន្ទនាប៉ុណ្ណោះ។ មនុស្សម្នាក់អាចបើកផ្ទាំងពីតំណបានម្តងក្នុងមួយថ្ងៃ (គិតរួមបូតទាំងអស់) ហើយមិនបានទាល់តែសោះ បើមិនដែលសរសេរទៅបូត។
  • បញ្ជីក្នុងការកំណត់ "Bots allowed to call me" (បូតដែលអាចហៅមកខ្ញុំ)៖ មើលបូតដែលបានអនុញ្ញាត បិទ និងអនុញ្ញាតម្តងទៀត។
curl -s "https://pabal.me/bot$BOT_TOKEN/sendMessage" -d chat_id=$USER_ID \
  --data-urlencode "text=តើចង់ឲ្យយើងហៅទូរស័ព្ទមុនពេលការបញ្ជាទិញមកដល់ទេ?" \
  --data-urlencode 'reply_markup={"inline_keyboard": [[{"text": "អនុញ្ញាតការហៅ", "url": "https://pabal.me/order_helper_bot?callme=1"}]]}'
  • ម៉ាស៊ីនមេដែលដំណើរការដោយខ្លួនឯង៖ កម្មវិធីស្គាល់តែតំណ pabal.me ប៉ុណ្ណោះ។ សម្រាប់ម៉ាស៊ីនមេផ្សេង ត្រូវបន្ថែម host របស់វាទៅក្នុងច្បាប់តំណនៃកំណែកម្មវិធី ទើបតំណអាចបើកផ្ទាំងបាន (ម៉ឺនុយ និងបញ្ជីក្នុងការកំណត់នៅតែដំណើរការធម្មតា)។
  • សម្រាប់ពេលនេះ៖ មានតែគណនីលេខ +82 នៅលើឧបករណ៍ដែលតំបន់ម៉ោងជាកូរ៉េ (សេអ៊ូល) និងបានចូលយ៉ាងហោចណាស់ 24 ម៉ោង ទេដែលអាចបើកការអនុញ្ញាតបាន (ប្រតិបត្តិករកំណត់ប្រទេស)។ អ្នកដែលឆ្លើយថាមានអាយុក្រោម 19 ឆ្នាំ មិនអាចហៅជាមួយបូតបានរយៈពេលមួយឆ្នាំ។
  • ពេលឈ្មោះ ម្ចាស់ ឬគោលបំណងរបស់បូតផ្លាស់ប្តូរ ឬមួយឆ្នាំក្រោយការអនុញ្ញាត មនុស្សនោះនឹងត្រូវសួរម្តងទៀត។ ក្នុងរយៈនោះ បូតមិនអាចហៅបានទេ។

ហៅ — startVoiceCall

curl -s "https://pabal.me/bot$BOT_TOKEN/startVoiceCall" -d user_id=$USER_ID -d purpose=delivery \
  --data-urlencode "context=ការបញ្ជាទិញ A-1042 មកដល់ថ្ងៃនេះ ប្រហែលម៉ោង 3 រសៀល។ សូមសួរថាតើគាត់អាចទទួលបាននៅពេលនោះទេ។" \
  -d max_duration=180 -d ring_timeout=30
{"ok": true, "result": {"voice_call_id": "8812345678901234"}}
ប៉ារ៉ាម៉ែត្រអត្ថន័យ
user_idid របស់មនុស្សដែលត្រូវហៅ ដែលត្រូវតែបានអនុញ្ញាតបូតនេះ
purposeគោលបំណងមួយដែលបូតនេះបានជ្រើស៖ reminder · wake_up · delivery · appointment
contextព័ត៌មានអំពីការហៅនេះ សម្រាប់តែម៉ូដែល៖ 1–1,000 តួ និង 3,072 បៃ។ ត្រូវពិនិត្យតាមច្បាប់ខ្លឹមសារ (ការក្លែងបន្លំ ការលាក់ថាជា AI ការសុំព័ត៌មានសម្ងាត់ ការផ្សាយពាណិជ្ជកម្ម)។ ម៉ូដែលប្រើវាក្រោយពាក្យដំបូង (ឈ្មោះ AI គោលបំណង) ពេលមនុស្សនោះបានឆ្លើយហើយ
max_durationរយៈពេលអតិបរមាក្រោយពេលលើក (វិនាទី)៖ ពី 30 ដល់តម្លៃតូចជាងរវាង 300 និងដែនកំណត់របស់បូត។ លំនាំដើម 180
ring_timeoutរយៈពេលរោទ៍ (វិនាទី) 30–45។ លំនាំដើម 40
ចម្លើយអត្ថន័យអ្វីដែលត្រូវធ្វើ
200 {"voice_call_id": "…"}បានទទួល។ ថាតើបានរោទ៍ និងមានគេលើកឬអត់ មកតាម update—
400 Bad Request: <អ្វី>ប៉ារ៉ាម៉ែត្រខុស គោលបំណងដែលបូតមិនបានជ្រើស (purpose is not declared) ភាសារបស់បូតមិនមែនកូរ៉េ ឬអង់គ្លេសកែ
400 VOICE_CONTEXT_REFUSED: <កូដ>context រំលោភច្បាប់ខ្លឹមសារកែ
403 VOICE_OUTBOUND_OFF: <មូលហេតុ>ខាងបូត៖ owner_off (មិនទាន់បើក) · terms (លក្ខខណ្ឌកំណែ 4) · review (រង់ចាំការពិនិត្យរបស់ប្រតិបត្តិករ) · suspended (ការផ្អាកស្វ័យប្រវត្តិ) · frozen (បង្កកដោយសារតូខឹន) · owner_name (ឈ្មោះម្ចាស់មិនឆ្លងការពិនិត្យការក្លែងបន្លំ) · mode ឬមូលហេតុខាងបូតពីការកំណត់សំឡេង (unavailable_reason)៖ bot_voice_off · not_allowed · suspended · name_refused · text_refused · awaiting_review · stream_unavailable · own_key_unavailable · no_gateway · no_gateway_with_tools · no_gateway_with_language · no_own_key_gateway។ មូលហេតុខាងម៉ាស៊ីនមេ voice_off · kill_switch · no_relay · outbound_off មកជា 503 មិនមែន 403 ទេ@BotFather · ប្រតិបត្តិករ
403 USER_UNAVAILABLEមិនអាចហៅមនុស្សនេះបាន៖ គ្មានការអនុញ្ញាត បានបិទ ឬត្រូវសួរម្តងទៀត បានទប់ស្កាត់ មិនមែនមនុស្ស នៅក្រៅវិសាលភាព អាយុក្រោម 19 ឆ្នាំ មិនមែនអ្នកសាកល្បង។ ខ្លឹមសារចម្លើយដូចគ្នាជានិច្ច មិនថាមូលហេតុអ្វីទេសុំការអនុញ្ញាត
429 retry after Nដែនកំណត់ខាងបូត ឬម្ចាស់៖ ល្បឿនសំណើ សំណើប្រចាំថ្ងៃរបស់បូត ឬម្ចាស់ ការហៅក្នុងពេលតែមួយរបស់បូត នាទីហៅចេញរបស់ម្ចាស់ ពេលហៅប្រចាំថ្ងៃរបស់បូត ឬម្ចាស់ (ប្រើរួមជាមួយការហៅទៅបូត)ក្រោយ N វិនាទី
503 VOICE_UNAVAILABLEខាងម៉ាស៊ីនមេ៖ កុងតាក់ការហៅចេញបិទ សំឡេងបិទនៅលើម៉ាស៊ីនមេ (រួមទាំងពេលគោលការណ៍ឯកជនភាពមិនទាន់មានផ្នែកការហៅបូត) កុងតាក់បិទបន្ទាន់ គ្មានការបញ្ជូនបន្តការហៅ ដែនកំណត់ និងចំណែកការហៅចេញរបស់ម៉ាស៊ីនមេ គ្មាន gateway ដែលអាចហៅបាន (ឬពេញទាំងអស់) មិនអាចកត់ត្រាសំណើបានពេលក្រោយ
{"ok": false, "error_code": 403, "description": "Forbidden: USER_UNAVAILABLE"}

ខាងមនុស្សនោះត្រូវពិនិត្យក្រោយ 200។ ទោះមានការអនុញ្ញាតក៏ដោយ បើស្ថិតក្នុងម៉ោងស្ងាត់របស់មនុស្សនោះ កំពុងផ្អាក លើសដែនកំណត់ប្រចាំថ្ងៃជាមួយមនុស្សនោះ ឬដែនកំណត់ប្រចាំថ្ងៃ និងចន្លោះពេលរបស់គេផ្ទាល់ គ្មានឧបករណ៍ដែលអាចរោទ៍ ឬគេកំពុងហៅផ្សេង នោះគ្មានអ្វីរោទ៍ទេ ហើយ not_answered មកដល់ប្រហែល ring_timeout + 12 វិនាទីក្រោយសំណើ — ដូចគ្នានឹងការរោទ៍ដែលគ្មានអ្នកលើក។ ការអនុញ្ញាតមិនផ្លាស់ប្តូរខាងបូតទេ (403 · 429 · 503)។

ការកំណត់ និងការប្រើប្រាស់

"outbound": {
  "enabled": true,
  "purposes": ["delivery"],
  "daily_cap": 50,
  "reviewed": true,
  "frozen_until": 0,
  "suspended": false,
  "available": true
}
"outbound": {
  "today": {"requests": 4, "answered": 2, "not_answered": 2, "minutes": 3},
  "limits": {"daily": 50, "owner_daily": 100, "owner_minutes": 30}
}
  • outbound ក្នុង getVoiceCallSettings មានជានិច្ច៖ អ្វីដែលបានកំណត់ក្នុង @BotFather (enabled·purposes·daily_cap) ការពិនិត្យរបស់ប្រតិបត្តិករ (reviewed) ពេលដែលការបង្កកដោយតូខឹនបញ្ចប់ (frozen_until គឺ 0 បើមិនបង្កក) ការផ្អាកស្វ័យប្រវត្តិ (suspended) និងថាតើបូតអាចហៅបានឥឡូវឬទេ (available)។ unavailable_reason មានតែពេល available ជា false (ខាងបូត តម្លៃដូចមូលហេតុនៃ 403 VOICE_OUTBOUND_OFF ខាងម៉ាស៊ីនមេ គឺ voice_off · kill_switch · no_relay · outbound_off — តម្លៃទាំងបួននេះត្រូវនឹង 503 VOICE_UNAVAILABLE)។
  • outbound ក្នុង getVoiceCallUsage មានតែសម្រាប់បូតដែលធ្លាប់បើកការហៅប៉ុណ្ណោះ៖ សំណើ ការលើក ការមិនលើក និងនាទីថ្ងៃនេះ ព្រមទាំងដែនកំណត់ប្រចាំថ្ងៃដែលអនុវត្តចំពោះបូតនេះ។ មិនផ្តល់ចំនួនដងដែលបានរោទ៍ទេ។ calls·seconds·missed·refused មិនដែលរាប់ការហៅដែលបូតធ្វើទេ។ ប៉ុន្តែការហៅដែលបូតធ្វើ ប្រើពេលហៅប្រចាំថ្ងៃរបស់បូត និងម្ចាស់ដូចគ្នានឹងការហៅទៅបូត៖ វិនាទីនៃការហៅដែលបានលើកត្រូវបានគិត ដូច្នេះ bot និង owner ក្នុង remaining_seconds_today ថយចុះ — ពេលកំពុងរោទ៍ក៏ថយចុះតាមចំនួនដែលការហៅកក់ទុកដែរ ហើយត្រឡប់មកវិញបើគ្មាននរណាលើក។
  • setVoiceCallSettings មិនអាចប្តូរវាបានទេ (400 VOICE_FIELD_NOT_AVAILABLE)។

Update

មកជា update voice_call ដូចគ្នានឹងការហៅទៅបូត (សរសេរ voice_call ក្នុង allowed_updates)។ direction គឺ "outgoing" ហើយមនុស្សនោះបង្ហាញតែជា id ក្នុង to ប៉ុណ្ណោះ (គ្មានឈ្មោះ ឈ្មោះអ្នកប្រើ ឬលេខទូរស័ព្ទ)។

{
  "update_id": 83,
  "voice_call": {
    "id": "8812345678901234",
    "direction": "outgoing",
    "event": "not_answered",
    "to": {"id": 100005},
    "purpose": "delivery",
    "date": 1790000123
  }
}
{
  "update_id": 81,
  "voice_call": {
    "id": "8812345678901234",
    "direction": "outgoing",
    "event": "started",
    "to": {"id": 100005},
    "purpose": "delivery",
    "date": 1790000130,
    "max_duration": 180
  }
}
{
  "update_id": 82,
  "voice_call": {
    "id": "8812345678901234",
    "direction": "outgoing",
    "event": "ended",
    "to": {"id": 100005},
    "purpose": "delivery",
    "date": 1790000250,
    "start_date": 1790000130,
    "duration": 120,
    "max_duration": 180,
    "end_reason": "callee"
  }
}
{
  "update_id": 84,
  "voice_call": {
    "id": "8812345678901234",
    "direction": "outgoing",
    "event": "failed",
    "to": {"id": 100005},
    "purpose": "delivery",
    "date": 1790000110
  }
}
eventពេលណាវាលបន្ថែម
startedមនុស្សនោះលើក ហើយការហៅត្រូវបានភ្ជាប់។ នៅលើ Apple Watch គឺពេលសំឡេងរបស់នាឡិកាភ្ជាប់ (បើមិនភ្ជាប់ទាល់តែសោះ គឺ ended 0 វិនាទីជាមួយ failed)max_duration
endedការហៅដែលបានលើក បានបញ្ចប់។ មកយឺតរហូតដល់ 10 វិនាទី ទោះការកំណត់ម៉ាស៊ីនមេយ៉ាងណាក៏ដោយ ព្រោះម៉ាស៊ីនមេរង់ចាំការប្រើប្រាស់ពី gatewaystart_date, duration, max_duration, end_reason
not_answeredសំណើដែលគ្មានអ្នកលើក — មិនបែងចែករវាងការរោទ៍ដែលគ្មានអ្នកលើក ការបដិសេធ ឬការមិនដែលរោទ៍ដោយសារខាងមនុស្សនោះ។ ប្រហែល ring_timeout + 12 វិនាទីក្រោយសំណើគ្មាន
failedការតភ្ជាប់ទៅ gateway ដែលកាន់សំណើបានដាច់ មុនពេលមានគេលើកគ្មាន

end_reason៖ callee (អ្នកទទួលផ្តាច់) · bot (បូតផ្តាច់ ឬតូខឹនត្រូវបានចេញថ្មី) · max_length (រយៈពេលអតិបរមា) · failed (ការតភ្ជាប់បរាជ័យក្រោយលើក) · operator (ប្រតិបត្តិករ ឬកុងតាក់បិទបន្ទាន់) · suspended (បូត ឬម្ចាស់ត្រូវបានផ្អាក)។ ការហៅដែលបូតធ្វើ គ្មាន missed refused ឬ ringing ទេ — ល្បឿននៃការលើកនឹងបង្ហាញថាមនុស្សនោះនៅក្បែរទូរស័ព្ទឬអត់ — ហើយគ្មាន transcript ដែរ (បិទតាមការរចនា)។

ក្នុងពេលហៅ

  • endVoiceCall៖ មុនពេលបូតត្រូវបានប្រាប់លទ្ធផល វាដកសំណើវិញ ទោះកំពុងរោទ៍ ឬមិនទាន់រោទ៍ (true បន្ទាប់មក not_answered)។ វាបញ្ចប់ការហៅដែលបានលើក (end_reason bot)។ ការដកវិញក្នុងរយៈ 15 វិនាទីក្រោយសំណើ ធ្វើឲ្យគូនោះផ្អាកមួយម៉ោង។
  • sendVoiceCallContext៖ ប្រើបានតែក្រោយមនុស្សនោះលើក (មុននោះ VOICE_CALL_NOT_FOUND)។ បីដងក្នុងមួយការហៅ 1,000 តួ និង 3,072 បៃ ច្បាប់ខ្លឹមសារដូច context។ បើ gateway មិនទទួលកំណត់ចំណាំ គឺ VOICE_CONTEXT_NOT_SUPPORTED។

អ្វីដែលអ្នកទទួលការហៅឃើញ និងឮ

  • ការរោទ៍៖ "(AI)" បន្ទាប់ពីឈ្មោះបូត និង "AI voice bot · Pabal never asks for codes" (បូតសំឡេង AI · Pabal មិនដែលសុំលេខកូដទេ)។
  • ពេលលើក មានសេចក្តីជូនដំណឹងចាក់មុនបូត៖ "This is a Pabal AI voice call. We never ask for passwords, codes or money transfers. To stop these calls, turn off call permission in the bot's chat." (នេះជាការហៅជាសំឡេង AI របស់ Pabal។ យើងមិនដែលសុំពាក្យសម្ងាត់ លេខកូដ ឬការផ្ទេរប្រាក់ទេ។ ដើម្បីបញ្ឈប់ការហៅទាំងនេះ សូមបិទការអនុញ្ញាតការហៅក្នុងការសន្ទនារបស់បូត។) — ជាភាសានៃផ្ទាំងអនុញ្ញាតដែលមនុស្សនោះបានអាន (កូរ៉េ ឬអង់គ្លេស) ហើយពីកម្មវិធីភាសាផ្សេង គឺជាភាសាអង់គ្លេស។ ម្ចាស់បូតមិនអាចបិទវាបានទេ។
  • ពាក្យដំបូងរបស់បូត៖ ឈ្មោះបូត ថាខ្លួនជា AI និងគោលបំណងនៃការហៅ។ context ប្រើបន្ទាប់ពីនោះ។
  • វិធីបិទ៖ "Stop calls from this bot" (បញ្ឈប់ការហៅពីបូតនេះ) ក្នុងម៉ឺនុយ ការទប់ស្កាត់បូត និងការរាយការណ៍ តែងតែបិទបាន។ ការនិយាយច្បាស់ៗក្នុងពេលហៅ ដូចជា "កុំហៅមកខ្ញុំទៀត" នឹងបិទភ្លាមៗ (គ្រាន់តែ "ឈប់" អាស្រ័យលើការវិនិច្ឆ័យរបស់ម៉ូដែល)។
  • កំពុងផ្អាក៖ ក្រោយការបដិសេធ ការរោទ៍ដែលគ្មានអ្នកលើក ឬការផ្តាច់ក្នុងរយៈ 10 វិនាទីក្រោយលើក បូតមិនអាចហៅមនុស្សនោះបាន 24 ម៉ោង។
  • កំណត់ត្រាការហៅដែលខកខាន៖ ពេលឧបករណ៍ពិតជាបានរោទ៍ មនុស្សនោះមិនបានទប់ស្កាត់បូត ហើយការសន្ទនារបស់បូតគ្មានសារមិនទាន់អាន នោះនៅសល់ "Missed AI bot call" (ការហៅពីបូត AI ដែលខកខាន — បានអាន គ្មានការជូនដំណឹង)។ បើមានសារមិនទាន់អាន ឬមិនបានរោទ៍ដោយសារម៉ោងស្ងាត់ ឬការផ្អាក គ្មានកំណត់ត្រាទេ។ សំណើទាំងអស់របស់បូតត្រូវរក្សាទុកដោយគ្មានការលើកលែងក្នុងភស្តុតាងនៃការរាយការណ៍ (30 ថ្ងៃ)។
  • អ្វីដែលម្ចាស់បូតទទួលបាន (តាមលំដាប់នៃផ្ទាំងអនុញ្ញាត)៖
    1. id Pabal របស់មនុស្សនោះ
    2. ថាតើការអនុញ្ញាតកំពុងបើកឬអត់ (ដឹងតាមចម្លើយចំពោះសំណើហៅ)
    3. ថាតើមនុស្សនោះបានលើកឬអត់
    4. ពេលចាប់ផ្តើមការហៅ និងរយៈពេល
    5. អ្នកណាជាអ្នកផ្តាច់
    ការហៅដែលខកខាន និងការហៅដែលត្រូវបានបដិសេធ មើលទៅដូចគ្នា។ ខ្លឹមសារនៃការសន្ទនាមិនត្រូវបានផ្ញើទេ។
  • ឧបករណ៍ប្រើរួមគ្នា៖ ឧបករណ៍ណាដែលកំពុងចូលអាចលើកបាន ហើយបូតប្រាប់គោលបំណង និងខ្លឹមសារដែលបានផ្តល់ទៅអ្នកណាក៏ដោយដែលលើក។ សម្រាប់កុំព្យូទ័រប្រើរួមគ្នា សូមរំលឹកឲ្យចាកចេញ។
  • អេក្រង់ចាក់សោ៖ នៅលើ Android 14 ឡើងទៅ បើមនុស្សនោះមិនអនុញ្ញាតការជូនដំណឹងពេញអេក្រង់ ការហៅមកជាការជូនដំណឹង ជំនួសឲ្យអេក្រង់ការហៅលើអេក្រង់ចាក់សោ។ iPhone និង Apple Watch រោទ៍ដូចការហៅទូរស័ព្ទ។
  • រក្សាទុកការសន្ទនា រក្សាទុកតែក្នុងការសន្ទនារបស់មនុស្សនោះផ្ទាល់ បើគេជ្រើសនៅលើផ្ទាំងអនុញ្ញាត។ ពេលបើក ទទួលលើនាឡិកា ក្នុងកម្មវិធីនាឡិកា Pabal នោះ Apple Watch ក៏រោទ៍ដែរ។
  • ការហៅពីបូតមិនត្រូវបានអ៊ិនគ្រីបពីចុងម្ខាងទៅចុងម្ខាងទេ — សំឡេងឆ្លងកាត់ម៉ាស៊ីនមេ Pabal និងអ្នកផ្តល់ AI។

ដែនកំណត់ · ម៉ោងស្ងាត់ · ការផ្អាក · ការផ្អាកស្វ័យប្រវត្តិ

ដែនកំណត់លំនាំដើមនៅលើម៉ាស៊ីនមេផលិតកម្ម
បូតមួយទៅមនុស្សម្នាក់ (ក្នុងមួយថ្ងៃ)3 ដងប្រតិបត្តិករអាចបន្ថយបានតែប៉ុណ្ណោះ
ទៅមនុស្សម្នាក់ (ក្នុងមួយថ្ងៃ បូតទាំងអស់)6 ដងអាចបន្ថយបានតែប៉ុណ្ណោះ
ចន្លោះពេលរវាងការហៅទៅមនុស្សម្នាក់10 នាទីអាចបង្កើនបានតែប៉ុណ្ណោះ
សំណើរបស់បូតមួយ (ក្នុងមួយថ្ងៃ)50 ដងម្ចាស់ជ្រើស 10 · 20 ឬ 50 ក្នុង @BotFather
ម្ចាស់បូតម្នាក់ (ក្នុងមួយថ្ងៃ បូតទាំងអស់)100 ដង · 30 នាទីចំនួនដងអាចបន្ថយបានតែប៉ុណ្ណោះ
រហូតដល់បូតអាចផ្ញើសំណើបន្ទាប់10 វិនាទីអាចបង្កើនបានតែប៉ុណ្ណោះ
នាទីហៅចេញរបស់ម៉ាស៊ីនមេ30% នៃនាទីប្រចាំថ្ងៃរបស់ម៉ាស៊ីនមេអាចបន្ថយបានតែប៉ុណ្ណោះ
ម៉ោងស្ងាត់21:00–08:00ប្រតិបត្តិករ និងមនុស្សនោះអាចពង្រីកបានតែប៉ុណ្ណោះ។ តាមតំបន់ម៉ោងរបស់ឧបករណ៍
ចន្លោះម៉ោងដាស់ (តែ wake_up)យូរបំផុត 120 នាទីមនុស្សនោះជ្រើសក្នុងម៉ោងស្ងាត់របស់ខ្លួន
ការរោទ៍ (ring_timeout)30–45 វិនាទី40 វិនាទី បើសំណើមិនបានបញ្ជាក់
ការផ្អាក — ការបដិសេធ ការរោទ៍ដែលគ្មានអ្នកលើក ការផ្តាច់ក្នុងរយៈ 10 វិនាទីក្រោយលើក24 ម៉ោងអាចបង្កើនបានតែប៉ុណ្ណោះ
ការផ្អាក — បូតដកសំណើវិញក្នុងរយៈ 15 វិនាទី1 ម៉ោងអាចបង្កើនបានតែប៉ុណ្ណោះ
  • "ក្នុងមួយថ្ងៃ" គឺមួយថ្ងៃតាមតំបន់ម៉ោងរបស់ម៉ាស៊ីនមេ (TELEGRAM_VOICE_TIME_ZONE)។ ការហៅមួយមិនដែលលើស 300 វិនាទីទេ។
  • ការហៅពីបូតក៏ប្រើពេលហៅប្រចាំថ្ងៃដូចគ្នានឹងការហៅទៅបូតដែរ (បូត 60 នាទី · ម្ចាស់ 120 នាទី)។ ពេលប្រើអស់ startVoiceCall ទទួល 429 ហើយការហៅទៅបូតនោះក៏ត្រូវបដិសេធដែរ (refused, budget)។
  • ការផ្អាកបញ្ចប់ ពេលអស់ពេល ពេលមនុស្សនោះហៅទៅបូត ចុច "I can take calls now" (ឥឡូវខ្ញុំអាចទទួលការហៅបាន) ឬអនុញ្ញាតម្តងទៀត។ សារ ឬប៊ូតុងរបស់បូតមិនអាចបញ្ចប់វាបានទេ។
  • ការផ្អាកស្វ័យប្រវត្តិ បញ្ឈប់តែការហៅរបស់បូតទៅមនុស្សប៉ុណ្ណោះ (403 VOICE_OUTBOUND_OFF: suspended) ហើយបន្តរហូតដល់ប្រតិបត្តិករពិនិត្យ និងដោះ៖ អត្រាលើកទាបជាង 20% ក្នុង 20 ការហៅចុងក្រោយ ការរាយការណ៍ 3 ក្នុងរយៈ 7 ថ្ងៃពីមនុស្សដែលវាបានរោទ៍ មនុស្សចាប់ពី 30% ឡើងទៅបិទការអនុញ្ញាត (ពេលមានយ៉ាងហោចណាស់ 10 នាក់) ការហៅ 2 ដងត្រូវច្បាប់ក្នុងពេលហៅ ការដកវិញ 5 ដងក្នុងរយៈ 15 វិនាទី ឬមនុស្ស 2 នាក់ ឬតិចជាងនេះលើក ប៉ុន្តែនាទីដែលបានលើកចាប់ពី 60 នាទីឡើងទៅ។

ដែនកំណត់

ដែនកំណត់លំនាំដើមអ្នកកំណត់
រយៈពេលអតិបរមានៃការហៅមួយបូត 300 វិនាទី (ចន្លោះដែលអាចកំណត់ពី 60 ដល់ពិដានរបស់ប្រតិបត្តិករ/ម៉ាស៊ីនមេ ដែលលំនាំដើម 600)ម្ចាស់បូត ក្នុងពិដានរបស់ប្រតិបត្តិករ/ម៉ាស៊ីនមេ។ ប៊ូតុង @BotFather គឺ 1 · 3 · 5 · 10 នាទី
ការហៅក្នុងពេលតែមួយរបស់បូត2 (ពី 1 ដល់ពិដានរបស់ប្រតិបត្តិករ/ម៉ាស៊ីនមេ ដែលលំនាំដើម 2)ម្ចាស់បូត ក្នុងពិដានរបស់ប្រតិបត្តិករ/ម៉ាស៊ីនមេ
ពេលហៅប្រចាំថ្ងៃរបស់បូតមួយ60 នាទីប្រតិបត្តិករ
ពេលហៅប្រចាំថ្ងៃរបស់ម្ចាស់បូតម្នាក់ (បូតទាំងអស់រួមគ្នា)120 នាទីប្រតិបត្តិករ
ពេលហៅប្រចាំថ្ងៃរបស់ម៉ាស៊ីនមេទាំងមូល300 នាទីប្រតិបត្តិករ
អ្នកហៅម្នាក់60 នាទីក្នុងមួយថ្ងៃ · 20 ការហៅក្នុងមួយម៉ោងប្រតិបត្តិករ
ការហៅខ្លីបំផុតដែលទទួល60 វិនាទី — បើពេលនៅសល់តិចជាងនេះ មិនទទួលប្រតិបត្តិករ
គណនីថ្មីអ្នកដែលចុះឈ្មោះមិនទាន់ដល់ 7 ថ្ងៃ មិនអាចហៅបានទេ — លើកលែងអ្នកសាកល្បង និងអ្នកដែលបូតធ្លាប់ផ្ញើសារទៅតាំងពីជាងមួយថ្ងៃមុនប្រតិបត្តិករ
ការផ្លាស់ប្តូរការកំណត់បូតនីមួយៗ 30 ដងក្នុងមួយម៉ោង—
កំណត់ចំណាំក្នុងពេលការហៅការហៅនីមួយៗ 10 ក្នុងមួយនាទី—
ឧបករណ៍16 និង 8KB · សំណួរដែលបើក៖ 2 ក្នុងមួយការហៅ និង 8 ក្នុងមួយបូត · ក្នុងមួយនាទី៖ 30 ក្នុងមួយការហៅ និង 120 ក្នុងមួយបូត—
ការសាកល្បងសោផ្ទាល់ខ្លួន · probe សំឡេងដើមបូតនីមួយៗ 5 ដងក្នុងមួយម៉ោង · ម្ចាស់នីមួយៗ 10 ដង—
ការចុះឈ្មោះ · ការពិនិត្យ MCPបូតនីមួយៗ 10 ដងក្នុងមួយម៉ោង · ម្ចាស់នីមួយៗ 20 ដង · ម៉ាស៊ីនមេ 2 ក្នុងមួយបូត—

ពី Apple Watch មិនអាចហៅទៅបូតដែលប្រើឧបករណ៍ · ម៉ាស៊ីនមេ MCP · សោផ្ទាល់ខ្លួន · របៀបសំឡេងដើម · កំណត់ត្រាសន្ទនារបស់ម្ចាស់បូតបានទេ។ ការបដិសេធនេះទៅដល់តែអ្នកហៅប៉ុណ្ណោះ (403 WATCH_NOT_YET របស់កម្មវិធីនាឡិកា) ហើយបូតមិនទទួល update refused ទេ។

រយៈពេលនៃការហៅមួយ គឺតម្លៃតូចបំផុតក្នុងចំណោមពេលនៅសល់ថ្ងៃនេះរបស់អ្នកហៅ · បូត · ម្ចាស់ · ម៉ាស៊ីនមេ និងពិដាននៃការហៅ។ ពេលទទួល បរិមាណនោះត្រូវបម្រុងទុកក្នុងដែនកំណត់ទាំងបួន ហើយពេលបញ្ចប់ គិតតែវិនាទីពិតប្រាកដតាមនាឡិកាម៉ាស៊ីនមេប៉ុណ្ណោះ។ ការហៅដោយសោផ្ទាល់ខ្លួន មិនប្រើដែនកំណត់បូត · ម្ចាស់ · ម៉ាស៊ីនមេទេ (ដែនកំណត់អ្នកហៅនៅដដែល)។

កំហុស

កំហុសមានទម្រង់ដូច method ផ្សេងទៀត៖ {"ok": false, "error_code": 400, "description": "Bad Request: VOICE_…"}។ 403 គឺ Forbidden: <កូដ>: <ការពិពណ៌នា> (លើកលែងតែ USER_UNAVAILABLE ដែលតែងតែជា Forbidden: USER_UNAVAILABLE ពិតប្រាកដ គ្មានការពិពណ៌នា) ហើយ 429 មាន parameters.retry_after ភ្ជាប់មកជាមួយ។

កូដអត្ថន័យ
403 VOICE_RULES_NOT_ACCEPTEDត្រូវយល់ព្រមច្បាប់បូតសំឡេងនៅ @BotFather ជាមុន
403 VOICE_NOT_AVAILABLEនៅលើម៉ាស៊ីនមេនេះ បូតនេះមិនអាចប្រើសំឡេងបាន (សំឡេងបិទ · ប្រតិបត្តិករមិនអនុញ្ញាត) — មិនអាចផ្លាស់ប្តូរការកំណត់បានទេ មានតែការបិទ និងការលុបប៉ុណ្ណោះ
403 VOICE_SUSPENDEDប្រតិបត្តិករបានផ្អាកសំឡេងរបស់បូតនេះ។ មានតែការបិទប៉ុណ្ណោះ
403 VOICE_OWNER_TERMS_NOT_ACCEPTEDត្រូវយល់ព្រមលក្ខខណ្ឌម្ចាស់បូត (កំណែ 4) ជាមុន
403 VOICE_OWN_KEY_NOT_AVAILABLEម៉ាស៊ីនមេនេះមិនទទួលសោផ្ទាល់ខ្លួនទេ
403 VOICE_STREAM_NOT_AVAILABLEនៅលើម៉ាស៊ីនមេនេះ មិនអាចប្រើរបៀបសំឡេងដើមឥឡូវនេះទេ
403 VOICE_OUTBOUND_OFF: <មូលហេតុ>បូតនេះមិនអាចហៅទៅមនុស្សបានឥឡូវទេ៖ owner_off · terms · review · suspended · frozen · owner_name · mode ឬមូលហេតុខាងបូតពីការកំណត់សំឡេង (ហៅ)។ voice_off · kill_switch · no_relay · outbound_off មកជា 503
403 USER_UNAVAILABLEមិនអាចហៅមនុស្សនេះបាន — ខ្លឹមសារដូចគ្នាជានិច្ច មិនថាមូលហេតុអ្វី រួមទាំងការគ្មានការអនុញ្ញាត
503 VOICE_UNAVAILABLEម៉ាស៊ីនមេមិនអាចហៅទៅមនុស្សបានឥឡូវទេ (កុងតាក់ការហៅចេញ សំឡេងម៉ាស៊ីនមេបិទ កុងតាក់បិទបន្ទាន់ គ្មានការបញ្ជូនបន្តការហៅ ដែនកំណត់ម៉ាស៊ីនមេ gateway កត់ត្រាសំណើមិនបាន) — សូមសាកម្តងទៀតពេលក្រោយ
Bad Request: purpose is not declared, Bad Request: the bot's voice language must be ko or en for outbound callsstartVoiceCall៖ គោលបំណងដែលបូតមិនបានជ្រើស ភាសាបូតមិនមែនកូរ៉េ ឬអង់គ្លេស
VOICE_INSTRUCTIONS_REQUIRED, VOICE_INSTRUCTIONS_TOO_LONG, VOICE_GREETING_TOO_LONGត្រូវការសេចក្តីណែនាំ · សេចក្តីណែនាំលើស 8,192 បៃ · ពាក្យស្វាគមន៍លើស 512 បៃ
VOICE_INVALID, VOICE_LANGUAGE_INVALID, VOICE_LIMIT_INVALID, VOICE_MODE_INVALIDសំឡេង ឬភាសាដែលមិនមាន · ដែនកំណត់ក្រៅចន្លោះ · របៀបដែលមិនមែន managed/stream
VOICE_CONTENT_REFUSED: <វាល>: <កូដ>, VOICE_CONTEXT_REFUSED: <កូដ>ច្បាប់ខ្លឹមសារ (ការកំណត់ និង context របស់ startVoiceCall)
VOICE_TOOL_INVALID: <ផ្លូវ>: <មូលហេតុ>និយមន័យឧបករណ៍ (ការកំណត់ឧបករណ៍)
VOICE_FIELD_NOT_AVAILABLE: …វាលដែលមិនទទួល (model, api_key) វាលសំឡេងដើមលើបូត managed និងវាលនៃការហៅពីបូត (outbound·purposes·daily_cap — តែក្នុង @BotFather)
VOICE_CALL_NOT_FOUND, VOICE_CALL_NOT_ACTIVE, VOICE_CONTEXT_NOT_SUPPORTED, VOICE_CONTEXT_TOO_LONGmethod ក្នុងពេលការហៅ (ក្នុងពេលការហៅ)
VOICE_USAGE_PERIOD_INVALIDរយៈពេលនៃ getVoiceCallUsage
TOOL_QUERY_ID_INVALID, TOOL_QUERY_EXPIRED: …, TOOL_RESULT_…, TOOL_ERROR_TOO_LONGចម្លើយរបស់ឧបករណ៍ (ការឆ្លើយ)
API_KEY_INVALID, API_KEY_NO_REALTIME_ACCESS, 503 API_KEY_CHECK_UNAVAILABLE, VOICE_PROVIDER_INVALIDសោផ្ទាល់ខ្លួន (សោម៉ូដែលផ្ទាល់ខ្លួន)
STREAM_URL_INVALID, STREAM_SECRET_REQUIRED, STREAM_SECRET_INVALID, STREAM_PROBE_FAILED: …របៀបសំឡេងដើម (ការកំណត់ និង probe)
MCP_…, MCP_OPT_IN_REQUIREDម៉ាស៊ីនមេ MCP (ការចុះឈ្មោះ)។ 503 VOICE_NOT_AVAILABLE: mcp: … សូមព្យាយាមម្តងទៀតបន្តិចក្រោយ ហើយ 409 MCP_CHECK_IN_PROGRESS សូមព្យាយាមម្តងទៀតក្រោយពេលការពិនិត្យចប់
429 Too Many Requests: retry after Nដែនកំណត់ប្រចាំម៉ោង (ការកំណត់ · ការសាកល្បងសោ · probe · MCP) ដែនកំណត់កំណត់ចំណាំ ឬដែនកំណត់នៃការហៅពីបូត (ដែនកំណត់)

បូតដែលភ្ជាប់តាម MTProto

  • បូតដែលចូលតែតាម MTProto ហៅ method សំឡេងតាម bots.sendCustomRequest (JSON ដូចឈ្មោះ method)។ អ្វីដែលធ្វើបាន៖ setVoiceCallSettings, getVoiceCallSettings, answerVoiceCallToolQuery, endVoiceCall, sendVoiceCallContext, getVoiceCallUsage, startVoiceCall និង method MCP ប្រាំ។ ផ្សេងពីនេះ នឹងទទួល METHOD_INVALID។ ចម្លើយរបស់ startVoiceCall គឺ {"voice_call_id": "…"} ហើយការបដិសេធមកជាកំហុស RPC (USER_UNAVAILABLE, VOICE_OUTBOUND_OFF: review, FLOOD_WAIT_n, VOICE_UNAVAILABLE)។
  • method ដែលមិនអាចហៅពីចម្លើយ webhook៖ setVoiceCallApiKey, startVoiceCall និង method ចុះឈ្មោះ និងសោរបស់ MCP។ បើដាក់ក្នុងខ្លឹមសារនៃចម្លើយចំពោះ POST របស់ webhook វាមិនត្រូវបានដំណើរការទេ — ដើម្បីកុំឲ្យសារមួយដែលមនុស្សផ្ញើ ក្លាយជាការហៅទូរស័ព្ទភ្លាមៗតាមចម្លើយ webhook។ សូមហៅវាដោយសំណើដាច់ដោយឡែក។
  • សោផ្ទាល់ខ្លួនតែតាម HTTPS ប៉ុណ្ណោះ៖ setVoiceCallApiKey·deleteVoiceCallApiKey មិនអាចហៅតាម sendCustomRequest បានទេ។ ដើម្បីលុបសោ សូមប្រើ HTTP Bot API ឬ @BotFather។
  • ចំពោះបូតដែលគ្មាន webhook ហើយមិនបានហៅ getUpdates ក្នុងរយៈ 15 វិនាទីចុងក្រោយ voice_call (រួមទាំងរបស់ការហៅដែលបូតធ្វើ) ត្រូវរុញម្តងតាម updateBotWebhookJSON (មិនពាក់ព័ន្ធនឹង allowed_updates ហើយមិនផ្ញើម្តងទៀតទេ)។ សំណួរឧបករណ៍មកតាម updateBotWebhookJSONQuery ហើយឆ្លើយ {"result": …} ឬ {"error": "…"} ដោយ bots.answerWebhookJSONQuery។ voice_call_transcript មិនមកតាម MTProto ទេ (ប៉ុន្តែ transcript ក្នុង update នៃការហៅដែលបានបញ្ចប់ នៅតែមក)។
  • កំហុស RPC៖ 429 គឺ FLOOD_WAIT_n ហើយផ្សេងទៀតគឺកូដអក្សរធំដូចដើម។