ការអភិវឌ្ឍបូត
បូតសំឡេង
ពេលមនុស្សហៅទៅបូតពីកម្មវិធី ម៉ូដែលសំឡេង AI ជាអ្នកឆ្លើយ។ របៀបបើក សេចក្តីណែនាំ និងសំឡេង ការជូនដំណឹងអំពីការហៅ ឧបករណ៍ ម៉ាស៊ីនមេ MCP សោផ្ទាល់ខ្លួន កំណត់ត្រាសន្ទនា របៀបសំឡេងដើម Apple Watch និងការរក្សាទុកការសន្ទនា — ការណែនាំសម្រាប់ម្ចាស់បូត។
បូតសំឡេង គឺជាបូតដែលមនុស្សអាចហៅទូរស័ព្ទមកពីកម្មវិធីបាន។ អ្នកទទួលការហៅមិនមែនជាកូដរបស់ម្ចាស់បូតទេ គឺជាម៉ូដែលសំឡេង AI របស់ Pabal ហើយម្ចាស់បូតប្រើ Bot API ដើម្បីកំណត់សេចក្តីណែនាំ ពាក្យស្វាគមន៍ សំឡេង ភាសា និងដែនកំណត់ ដែលម៉ូដែលនោះត្រូវអនុវត្តតាម។ រាល់ពេលការហៅចាប់ផ្តើម និងបញ្ចប់ អ្នកទទួល update voice_call ហើយក្នុងពេលការហៅ ម៉ូដែលអាចហៅកូដរបស់បូត (ឧបករណ៍) ដើម្បីរកការបញ្ជាទិញ ឬពិនិត្យការកក់បាន។ ក៏មានរបៀបសំឡេងដើមដែរ ដែលម៉ាស៊ីនមេរបស់អ្នកទទួលសំឡេងដោយផ្ទាល់ ជំនួសម៉ូដែល AI។ បើអ្នកទើបបង្កើតបូតលើកដំបូង សូមមើល ការបង្កើតបូត ជាមុនសិន។
ស្ថានភាពបច្ចុប្បន្ន
អាចហៅទៅបូតសំឡេងបានតែនៅលើម៉ាស៊ីនមេដែលបំពេញលក្ខខណ្ឌខាងក្រោមទាំងអស់ប៉ុណ្ណោះ។ 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, 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។
- សុំប្រតិបត្តិករឲ្យអនុញ្ញាតបូត។ នៅលើម៉ាស៊ីនមេដែលទទួលតែបូតដែលបានអនុញ្ញាត (លំនាំដើម) រហូតដល់ប្រតិបត្តិករអនុញ្ញាតតាម ID បូត (លេខនៅមុខ
:នៃតូខឹន) នៅក្នុងផ្ទាំងសំឡេងនៃទំព័រគ្រប់គ្រង នោះ @BotFather មិនមានប៊ូតុងការហៅជាសំឡេងទេ ហើយការផ្លាស់ប្តូរការកំណត់នឹងទទួល403 VOICE_NOT_AVAILABLE។ បើមិនទាន់បើកជាសាធារណៈ សូមសុំឲ្យដាក់គណនីរបស់អ្នកដែលនឹងសាកហៅ ជាអ្នកសាកល្បងផងដែរ (id អ្នកប្រើរបស់អ្នក គឺmessage.from.idនៃgetUpdatesក្រោយពេលអ្នកផ្ញើសារទៅបូត)។ - កំណត់សេចក្តីណែនាំ។ វាជាអត្ថបទដែលសរសេរថាបូតធ្វើអ្វីក្នុងការហៅ។ កំណត់វាដោយ
setVoiceCallSettingsខាងក្រោម ឬផ្ញើតាមប៊ូតុង សេចក្តីណែនាំ (지시문) នៅលើអេក្រង់ការហៅជាសំឡេងនៃ @BotFather។ បើគ្មានសេចក្តីណែនាំ មិនអាចបើកបានទេ (លើកលែងរបៀបសំឡេងដើម)។ - នៅ @BotFather៖
/mybots→ បូត → ការហៅជាសំឡេង (음성 통화) → បើក (켜기)។ លើកដំបូង ច្បាប់បូតសំឡេងនឹងបង្ហាញ ហើយពេលចុច យល់ព្រមច្បាប់ ហើយបើក (규칙에 동의하고 켜기) វាបើក។ ពីលើកក្រោយ វាគ្រាន់តែសួរថា «បើកឬ?» (켤까요?)។ - រង់ចាំការអនុញ្ញាតម្តងទៀត។ នៅលើម៉ាស៊ីនមេដែលទទួលតែបូតដែលបានអនុញ្ញាត ការអនុញ្ញាត គឺអនុញ្ញាតសេចក្តីណែនាំ ពាក្យស្វាគមន៍ និងឧបករណ៍នៅពេលនោះ ដូច្នេះបើអ្នកសរសេរសេចក្តីណែនាំក្រោយពេលត្រូវបានអនុញ្ញាត វានឹងក្លាយជា
unavailable_reason: "awaiting_review"។ ប្រតិបត្តិករត្រូវពិនិត្យ ហើយអនុញ្ញាតម្តងទៀត ទើបវាទទួលការហៅ។ វាដូចគ្នារាល់ពេលដែលអ្នកផ្លាស់ប្តូរមួយក្នុងចំណោមបីនេះ (ក្នុងរបៀបសំឡេងដើម គឺអាសយដ្ឋានសំឡេងដើម)។ បើភាសាបូតមិនមែនជាភាសាកូរ៉េ ឬអង់គ្លេសទេ សូម្បីតែនៅលើម៉ាស៊ីនមេដែលទទួលបូតទាំងអស់ ប្រតិបត្តិករក៏ត្រូវអានសេចក្តីណែនាំ និងពាក្យស្វាគមន៍ ហើយអនុញ្ញាតជាមុនសិន ទើបវាទទួលការហៅ (សំឡេង និងភាសា)។ - មើលថា
availableនៃgetVoiceCallSettingsជាtrueឬអត់ រួចសាកហៅដោយប៊ូតុងហៅនៅក្នុងប្រវត្តិរូបបូត ពីbuild កម្មវិធីដែលមានផ្ទាំងបញ្ជាក់។
បច្ចុប្បន្ន BotFather ឆ្លើយជាភាសាកូរ៉េ។ ក្នុងការសន្ទនាខាងលើ ក្រោយពេលអ្នកចុច បើក BotFather បង្ហាញច្បាប់បូតសំឡេង៖
- បូតតែងតែប្រាប់ថាខ្លួនជា AI។ មិនអាចឲ្យវាធ្វើពុតជាមនុស្សបានទេ។
- មិនអាចក្លែងបន្លំជាស្ថាប័ន ក្រុមហ៊ុន ឬមនុស្សពិតប្រាកដបានទេ។
- មិនអាចឲ្យវាសួរលេខកាត លេខអត្តសញ្ញាណផ្ទាល់ខ្លួន ពាក្យសម្ងាត់ ឬលេខកូដផ្ទៀងផ្ទាត់បានទេ។
- Pabal មិនរក្សាទុកសំឡេងនៃការហៅទេ ហើយសំឡេងត្រូវបានផ្ញើទៅ Google (Vertex AI) ដើម្បីបង្កើតចម្លើយ។
- មានតែអ្នកដែលមានអាយុចាប់ពី 19 ឆ្នាំឡើងទៅទេ ដែលអាចហៅជាសំឡេងជាមួយបូតបាន។
- បើបំពានច្បាប់ ប្រតិបត្តិករអាចផ្អាកការហៅជាសំឡេង ឬបូតបាន។
ក្រោយពេលអ្នកចុច យល់ព្រមច្បាប់ ហើយបើក 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}
| ប៉ារ៉ាម៉ែត្រ | ប្រភេទ | ការពិពណ៌នា |
|---|---|---|
enabled | Boolean | បើក · បិទ។ ដើម្បីបើក ត្រូវបានយល់ព្រមច្បាប់នៅ @BotFather រួចហើយ (បើមិនទាន់ទេ នឹងទទួល 403 VOICE_RULES_NOT_ACCEPTED) ហើយបើជា managed ត្រូវមានសេចក្តីណែនាំ។ ការបិទធ្វើបានជានិច្ច — ការហៅដែលកំពុងដំណើរការ នៅបន្តរហូតដល់ចប់ មានតែការហៅថ្មីទេដែលមិនត្រូវទទួល |
instructions | String | សេចក្តីណែនាំដែលម៉ូដែលអនុវត្តតាម។ រហូតដល់ UTF-8 8,192 បៃ (ប្រហែល 2,700 តួអក្សរខ្មែរ ឬកូរ៉េ)។ "" មានន័យថាលុប — បូត managed ដែលកំពុងបើក មិនអាចទុកទទេបានទេ។ កាន់តែវែង ថ្លៃការហៅកាន់តែកើន ហើយអ្នកហៅអាចលួងសួររកខ្លឹមសាររបស់វាបាន ដូច្នេះកុំដាក់ពាក្យសម្ងាត់ ឬសោ |
greeting | String | ពាក្យដំបូងដែលបូតនិយាយក្រោយសេចក្តីជូនដំណឹង AI។ រហូតដល់ 512 បៃ (ប្រហែល 170 តួអក្សរខ្មែរ ឬកូរ៉េ)។ បើ "" ម៉ូដែលស្វាគមន៍ខ្លីៗដោយខ្លួនឯង |
voice | String | id សំឡេង (បញ្ជី) · លំនាំដើម kore |
language | String | ភាសាដែលបូតនិយាយ និងស្តាប់យល់។ ជា id មួយក្នុងចំណោម id ទាំង 9 (លំនាំដើម ko-KR · បញ្ជី)។ zh-CN ត្រូវរក្សាទុកជា cmn-CN ហើយ id ដែលខុសគ្នាតែអក្សរធំតូច (ja-jp) ត្រូវរក្សាទុកតាមទម្រង់ក្នុងបញ្ជី។ បើមិនមែនជាភាសាកូរ៉េ ឬអង់គ្លេសទេ បូតទទួលការហៅតែបន្ទាប់ពីប្រតិបត្តិករអានសេចក្តីណែនាំ និងពាក្យស្វាគមន៍ ហើយអនុញ្ញាតប៉ុណ្ណោះ។ សំឡេងជូនដំណឹង AI នៅដើមការហៅ មិនតាមតម្លៃនេះទេ តែតាមភាសានៃផ្ទាំងបញ្ជាក់ដែលអ្នកហៅបានឃើញ |
max_call_duration | Integer | រយៈពេលអតិបរមានៃការហៅមួយ (វិនាទី)។ ចាប់ពី 60 ហើយមិនលើស limits.max_call_duration (តម្លៃតូចជាងរវាងពិដានរបស់ប្រតិបត្តិករ និងម៉ាស៊ីនមេ · លំនាំដើម 600)។ លំនាំដើមរបស់បូតគឺ 300 |
max_concurrent_calls | Integer | ចំនួនការហៅដែលទទួលក្នុងពេលតែមួយ។ ចាប់ពី 1 ហើយមិនលើស limits.max_concurrent_calls (លំនាំដើម 2)។ លំនាំដើមរបស់បូតគឺ 2 |
tools | Array | ឧបករណ៍របស់បូតដែលម៉ូដែលអាចហៅក្នុងពេលការហៅ (ឧបករណ៍)។ [] មានន័យថាលុបទាំងអស់ |
transcript | Boolean | កុងតាក់កំណត់ត្រាសន្ទនា (កំណត់ត្រាសន្ទនា) |
mode, stream_url, stream_secret | String | របៀបសំឡេងដើម (ការកំណត់របៀបសំឡេងដើម) |
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_only | true បើមិនទាន់បើកជាសាធារណៈ ដូច្នេះមានតែអ្នកសាកល្បងដែលប្រតិបត្តិករកំណត់ទេដែលហៅបាន |
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_after60)។
ការប្រើប្រាស់ — 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 ខាងស្តាំជាកូដរបស់ម្ចាស់បូត។ បន្ទាត់ចុចបញ្ឈរគឺពេលវេលា។ ម៉ូដែលមិននិយាយជាមួយបូតដោយផ្ទាល់ទេ សំណួរ និងចម្លើយទាំងអស់ឆ្លងកាត់ម៉ាស៊ីនមេ។
- ប្រអប់ប្រផេះនៃ ① — ម៉ាស៊ីនមេពិនិត្យអាគុយម៉ង់មុនគេ៖ ថាត្រូវនឹង
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_ms | 1,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)។
- បើមាន webhook វាទៅតាម webhook។
allowed_updatesរបស់ webhook ត្រូវមានvoice_call_tool_queryហើយបើគ្មាន វាមិនទៅផ្លូវផ្សេងទេ ហើយមិនទៅដល់ (tool_delivery_problem: "not_in_allowed_updates")។ សំណួរគឺជាPOST ដែលផ្ញើដាច់ដោយឡែក ដូច្នេះមិនជាប់គាំងក្នុងជួរលំដាប់ទេ ហើយមិនត្រូវផ្ញើម្តងទៀតទេ។ - បើគ្មាន webhook ហើយបានហៅ getUpdates ក្នុងរយៈ 15 វិនាទីចុងក្រោយ វានៅខាងមុខបង្អស់នៃ getUpdates បន្ទាប់។ ក៏ត្រូវមាននៅក្នុង
allowed_updatesដែរ។ សំណួរដែលរង់ចាំមានរហូតដល់ 8 សម្រាប់បូតមួយ។ - ក្រៅពីនោះ បើជាបូតដែលភ្ជាប់តាម MTProto វាទៅតាម
updateBotWebhookJSONQuery(មិនពាក់ព័ន្ធនឹងallowed_updates)។ - បើមិនមែនមួយណាទេ វាមិនទៅដល់ (
tool_delivery_problem: "not_listening") ហើយម៉ូដែលឮ «The tool could not be reached.» (មិនអាចភ្ជាប់ទៅឧបករណ៍បានទេ)។
ការឆ្លើយ — answerVoiceCallToolQuery
| ប៉ារ៉ាម៉ែត្រ | ការពិពណ៌នា |
|---|---|
tool_query_id | voice_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 ឆ្លើយជាភាសាកូរ៉េ។ ខ្លឹមសារនៃលក្ខខណ្ឌខាងលើមានដូចខាងក្រោម ហើយអ្នកយល់ព្រមដោយប៊ូតុង យល់ព្រមលក្ខខណ្ឌ (약관에 동의하기)៖
- បើបើកកំណត់ត្រាសន្ទនា ពេលការហៅបញ្ចប់ ខ្ញុំទទួលអត្ថបទសន្ទនាដែល AI បានសរសេរ។ ខ្ញុំជាអ្នកដោះស្រាយ និងការពារអត្ថបទដែលទទួលបាន។
- ពេលហៅទៅបូតដែលបើកកំណត់ត្រាសន្ទនា ពេលការហៅតភ្ជាប់ សំឡេងជូនដំណឹងប្រាប់មុនថា អត្ថបទសន្ទនានឹងទៅម្ចាស់បូត។
- ខ្ញុំរក្សាទុកអត្ថបទសន្ទនាដែលទទួលបានតែតាមដែលចាំបាច់ ហើយលុបវាពេលអ្នកហៅស្នើ។ ខ្ញុំមិនប្រើវាដើម្បីបង្ហាត់ម៉ូដែលទេ។
- បើប្រើសោម៉ូដែលផ្ទាល់ខ្លួន សំឡេង និងអត្ថបទនៃការហៅទៅអ្នកផ្តល់សេវានៃសោរបស់ខ្ញុំ តាមកិច្ចសន្យារបស់ខ្ញុំ។ ការទទួលខុសត្រូវចំពោះការដោះស្រាយនោះ ស្ថិតលើខ្ញុំ ហើយខ្ញុំសរសេរដូច្នោះក្នុងសេចក្តីជូនដំណឹងឯកជនភាពរបស់ខ្ញុំ។
- ក្នុងរបៀបសំឡេងដើម សំឡេងនៃការហៅទៅម៉ាស៊ីនមេរបស់ខ្ញុំ មិនមែនទៅម៉ូដែល AI របស់ Pabal ទេ។ ខ្ញុំជាអ្នកទទួល និងដោះស្រាយសំឡេងនោះ។ ខ្ញុំប្រើសំឡេង និងខ្លឹមសារនៃសម្តីរបស់អ្នកហៅ តែក្នុងវិសាលភាពដែលច្បាប់អនុញ្ញាត ហើយលុបវាពេលលែងត្រូវការ។
- បើអ្នកហៅសួរថាម៉ាស៊ីនមេរបស់ខ្ញុំនៅទីណា និងធ្វើអ្វី ខ្ញុំប្រាប់គេ។ គួរសរសេរវាក្នុងការណែនាំរបស់បូត។
- បូតតែងតែប្រាប់ថាខ្លួនជា AI។ ចម្លើយត្រូវបង្កើតដោយ AI។ គ្មានមនុស្សឆ្លើយដោយផ្ទាល់ ឬចាក់ការថតសំឡេងរបស់មនុស្សដូចជាចម្លើយរបស់ AI ទេ។ ក្នុងរបៀបសំឡេងដើម Pabal ចាក់សេចក្តីជូនដំណឹង «This is an AI voice bot. The call's audio goes to the bot developer's server.» នៅដើមការហៅ។
- ខ្ញុំមិនសួរលេខកាត លេខអត្តសញ្ញាណផ្ទាល់ខ្លួន ពាក្យសម្ងាត់ ឬលេខកូដផ្ទៀងផ្ទាត់ទេ ហើយខ្ញុំគោរពច្បាប់បូតសំឡេងដដែល។
- Pabal មិនរក្សាទុកអត្ថបទសន្ទនាទេ។ ពេលបញ្ជូនរួច វាត្រូវលុបចេញពីម៉ាស៊ីនមេយ៉ាងយូរ 24 ម៉ោងក្រោយ។ សោ និងសម្ងាត់នៃរបៀបសំឡេងដើម និងម៉ាស៊ីនមេ MCP ត្រូវបានអ៊ិនគ្រីប ហើយមិនកត់ត្រានៅកន្លែងណាទេ។
- បើចុះឈ្មោះម៉ាស៊ីនមេ MCP ពេលម៉ូដែលហៅឧបករណ៍របស់ម៉ាស៊ីនមេនោះក្នុងពេលការហៅ តម្លៃដែលអ្នកហៅនិយាយនឹងទៅម៉ាស៊ីនមេនោះ។ ការទទួលខុសត្រូវចំពោះការដោះស្រាយរបស់ម៉ាស៊ីនមេនោះ និងកន្លែងដែលវាបញ្ជូនបន្ត ស្ថិតលើខ្ញុំ ហើយខ្ញុំរាយការណ៍កន្លែងទទួលតាមការពិត។
- បើបំពានលក្ខខណ្ឌ ប្រតិបត្តិករអាចផ្អាកការហៅជាសំឡេង ឬបូតបាន។
ចំណុច 12–24 គឺជាអ្វីដែលអ្នកគោរព ពេលបើកការហៅពីបូត៖ ប្រើតែសម្រាប់គោលបំណងដែលបានប្រកាស និងប្រតិបត្តិករអនុញ្ញាត ដោយគ្មានការផ្សាយពាណិជ្ជកម្ម ប្រាប់ឈ្មោះបូត និងថាខ្លួនជា AI នៅពាក្យដំបូង មិនដាក់ព័ត៌មានរសើបក្នុង context មិនដែលព្យាយាមហៅមនុស្សអាយុក្រោម 19 ឆ្នាំ មិនគេចពីម៉ោងស្ងាត់ ការផ្អាក ឬដែនកំណត់ ប្រើព័ត៌មានអំពីអ្នកទទួលការហៅតែសម្រាប់គោលបំណងនោះ ហើយលុបវាពេលការអនុញ្ញាតត្រូវបានបិទ និងការពារតូខឹន។ ការហៅដែលបូតធ្វើ មិននាំមកនូវកំណត់ត្រាសន្ទនាទេ (ចំណុច 24)។ ពាក្យពេចន៍នៃលក្ខខណ្ឌអាចផ្លាស់ប្តូរក្រោយការពិនិត្យផ្នែកច្បាប់។
ម៉ាស៊ីនមេ MCP
វាបើកតែពេលប្រតិបត្តិកររៀបចំសមាសភាគ 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 សំឡេង) ខាងស្តាំជាម៉ាស៊ីនមេរបស់ម្ចាស់បូត។ ម៉ាស៊ីនមេបូតមិននិយាយជាមួយកម្មវិធី ឬម៉ាស៊ីនមេ 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"
- ទម្រង់អាសយដ្ឋាន៖ តែ
wss://· គ្មានឈ្មោះអ្នកប្រើ#ឬដកឃ្លា · តែ ASCII (តួអក្សរផ្សេងទៀតត្រូវអ៊ិនកូដភាគរយ) · មិនលើស 2,048 តួ។ host ត្រូវជាឈ្មោះដែលមានចំណុច ឬ IP សាធារណៈ (localhostមិនបានទេ) ច្រកគឺ 443 ឬ 1024 ដល់ 65535។ បើមិនដូច្នោះ នឹងទទួល400 STREAM_URL_INVALID: …។ - ដែនកំណត់ probe ត្រូវរាប់នៅពេលស្នើ៖ បូតនីមួយៗ 5 ដងក្នុងមួយម៉ោង ម្ចាស់នីមួយៗ 10 ដង ហើយក្នុងពេលតែមួយ បូតនីមួយៗ 1 · ម្ចាស់នីមួយៗ 2។ បើលើស នឹងទទួល
429។ probe ដែល gateway រវល់ ហើយមិនបានតភ្ជាប់ទៅកន្លែងណា មិនត្រូវរាប់ទេ។ - ការពិនិត្យអាសយដ្ឋាន៖ បើឈ្មោះចង្អុលទៅអាសយដ្ឋានឯកជន · បម្រុងទុក ឬអាសយដ្ឋានរបស់ Pabal ខ្លួនឯង សូម្បីតែមួយ នឹងទទួល
400 STREAM_URL_INVALID: the host must resolve only to public addresses។ - 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 វិនាទី។ - ពេលរបៀបសំឡេងដើមត្រូវបើក ឬអាសយដ្ឋានត្រូវប្តូរតាម 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 (អក្សរតូច គ្មានច្រក)។ មិនត្រូវគណនាដោយ headerHostនៃសំណើទេ — តម្លៃនោះសរសេរដោយអ្នកផ្ញើ ដូច្នេះគ្មានប្រសិទ្ធភាពក្នុងការចងជាប់នឹង host ទេ។path?queryគឺផ្លូវ និង query នៃ URL ដូចដើម (បើគ្មាន គឺ/)។ ក្នុង probecallគឺជាលេខ 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, nonce00112233445566778899aabbccddeeff, call4611686018427387905, hostbot.example.com, ផ្លូវ/voice?bot=100042→v1=807517ff96ac75223bde35b48c775f49a2eda2fb4832a02c0ea832b914d70d0c។
សំឡេង · ការកាត់សម្តី · mark · ការបញ្ចប់
- buffer បូត → អ្នកហៅ៖ gateway បញ្ចេញតាមល្បឿនចាក់ ដូច្នេះអាចផ្ញើម្តងច្រើនបាន ប៉ុន្តែបើគរលើស 30 វិនាទី ផ្នែកដែលហៀរត្រូវបោះចោល ហើយវាផ្ញើ
buffer_full។ បើសំឡេងបូតដាច់ 300 ms វាចាត់ទុកថា «ដុំ» មួយបានបញ្ចប់ (ឯកតានៃmark·clear)។ clear៖ បោះចោលសំឡេងបូតដែលមិនទាន់ចេញទាំងអស់ ហើយស្ងាត់ចាប់ពី 10 ms បន្ទាប់ (វាស់បានតិចជាង 50 ms)។ ក្នុងចម្លើយclearedplayed_msគឺផលបូកសំឡេងបូតដែលបានចាក់ពិតប្រាកដក្នុងការហៅនេះរហូតមកដល់ពេលនេះdropped_msគឺបរិមាណដែលបោះចោលលើកនេះ ហើយmarksគឺឈ្មោះ mark ដែលជាប់នឹងដុំដែលត្រូវបោះចោល — ប្រើវាដើម្បីប្រាប់ម៉ូដែលថា «ត្រូវកាត់នៅត្រង់ណា»។mark៖ ពេលសំឡេងនៅមុខវាត្រូវចាក់ចប់ វាត្រឡប់មកវិញដោយឈ្មោះដដែល។ សំឡេងនៅមុខ mark គួរបញ្ចប់នៅពហុគុណនៃ 480 បៃ (10 ms) (បំណែកដែលនៅសល់ត្រូវបំពេញដោយភាពស្ងាត់)។- ការបញ្ចប់៖ បូតផ្ញើ
hangupឬបិទស្អាតដោយ 1000·1001។ ការបិទផ្សេងទៀត ឬការដាច់ TCP ត្រូវបញ្ចប់ដូចការបំពានលក្ខណៈបច្ចេកទេស (អ្នកហៅឮសេចក្តីសុំទោស)។ ពេល Pabal បញ្ចប់stop.reasonជាកូដខ្លី —hangup(អ្នកហៅផ្តាច់)max_lengthbot_endeddisconnectdrainkill_switchoperatorlink_lostmedia_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.» រួចការហៅត្រូវផ្តាច់។ ការបដិសេធទាំងអស់បញ្ចប់ដោយសញ្ញារវល់។
ការពន្យល់សម្រាប់អ្នកប្រើកម្មវិធី មាននៅ ការប្រើកម្មវិធី — ការហៅទៅបូតសំឡេង។
ការហៅពីបូត
ម៉ាស៊ីនមេមានមុខងារនេះរួចហើយ ប៉ុន្តែគ្មានបូតណាអាចហៅទៅនរណាម្នាក់បានទេ រហូតដល់ផ្នែក 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 សំឡេងរួមជាមួយម៉ូដែល AI និងកម្មវិធីរបស់អ្នកទទួលការហៅ។ បន្ទាត់ចុចបញ្ឈរគឺពេលវេលា បន្ទាត់ពណ៌ខៀវគឺការហៅដែលកំពុងដំណើរការ ហើយបន្ទាត់ពណ៌ប្រផេះគឺចម្លើយទៅបូត។
- ប្រអប់ប្រផេះនៅ ① — ការពិនិត្យបីដង៖ មុនពេលឆ្លើយ ពិនិត្យខាងបូត (បានបើកឬនៅ ការពិនិត្យរបស់ប្រតិបត្តិករ លក្ខខណ្ឌ ដែនកំណត់) និងថាមានការអនុញ្ញាតឬអត់ ក្រោយ 200 ពិនិត្យខាងមនុស្សនោះ (ម៉ោងស្ងាត់ កំពុងផ្អាក ដែនកំណត់ប្រចាំថ្ងៃ និងចន្លោះពេលរបស់មនុស្សនោះ ឧបករណ៍ដែលអាចរោទ៍) ហើយពិនិត្យម្តងទៀតមុនពេលរោទ៍។
- 200 នៅ ② មានន័យត្រឹមតែ «បានទទួល»។ ថាតើបានរោទ៍ ឬមានគេលើកឬអត់ មានតែ update នៅ ⑧ ទេដែលប្រាប់។
- ④–⑦ ខាងមនុស្សនោះ៖ ការរោទ៍បង្ហាញ "(AI)" បន្ទាប់ពីឈ្មោះបូត ហើយពេលលើក សេចក្តីជូនដំណឹងរបស់ Pabal (⑥) ចាក់មុនបូត។ នៅពាក្យដំបូង (⑦) បូតប្រាប់ឈ្មោះ ថាខ្លួនជា AI និងគោលបំណងនៃការហៅ។ ក្នុងរយៈប្រអប់បៃតង សំឡេងឆ្លងកាត់ gateway និងម៉ូដែល AI — មិនត្រូវបានអ៊ិនគ្រីបពីចុងម្ខាងទៅចុងម្ខាងទេ។
- បន្ទាត់ចុចពណ៌ក្រហមគឺចំណុចសំខាន់៖ សំណើដែលមិនដែលរោទ៍ ដោយសារខាងមនុស្សនោះ និងសំណើដែលរោទ៍តែគ្មានអ្នកលើក បញ្ចប់ដូចគ្នា នៅពេលដូចគ្នា ដោយ
not_answered។ បូតមិនអាចដឹងថាពេលនោះមនុស្សនោះកំពុងគេង ឬកំពុងហៅផ្សេងទេ។
បើក — @BotFather
ការហៅពីបូតត្រូវបានបើកដោយម្ចាស់បូតតែនៅក្នុង @BotFather ប៉ុណ្ណោះ មិនដែលដោយតូខឹនទេ (ការផ្ញើវាលនៃការហៅទៅ setVoiceCallSettings នឹងទទួល 400 VOICE_FIELD_NOT_AVAILABLE)។ ការហៅជាសំឡេង ត្រូវបើកជាមុនសិន។ /mybots → បូត → ការហៅជាសំឡេង (음성 통화) → ការហៅពីបូត (봇이 거는 전화) → បើក (켜기)។
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_id | id របស់មនុស្សដែលត្រូវហៅ ដែលត្រូវតែបានអនុញ្ញាតបូតនេះ |
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 វិនាទី ទោះការកំណត់ម៉ាស៊ីនមេយ៉ាងណាក៏ដោយ ព្រោះម៉ាស៊ីនមេរង់ចាំការប្រើប្រាស់ពី gateway | start_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_reasonbot)។ ការដកវិញក្នុងរយៈ 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 ថ្ងៃ)។
- អ្វីដែលម្ចាស់បូតទទួលបាន (តាមលំដាប់នៃផ្ទាំងអនុញ្ញាត)៖
- id Pabal របស់មនុស្សនោះ
- ថាតើការអនុញ្ញាតកំពុងបើកឬអត់ (ដឹងតាមចម្លើយចំពោះសំណើហៅ)
- ថាតើមនុស្សនោះបានលើកឬអត់
- ពេលចាប់ផ្តើមការហៅ និងរយៈពេល
- អ្នកណាជាអ្នកផ្តាច់
- ឧបករណ៍ប្រើរួមគ្នា៖ ឧបករណ៍ណាដែលកំពុងចូលអាចលើកបាន ហើយបូតប្រាប់គោលបំណង និងខ្លឹមសារដែលបានផ្តល់ទៅអ្នកណាក៏ដោយដែលលើក។ សម្រាប់កុំព្យូទ័រប្រើរួមគ្នា សូមរំលឹកឲ្យចាកចេញ។
- អេក្រង់ចាក់សោ៖ នៅលើ 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 calls | startVoiceCall៖ គោលបំណងដែលបូតមិនបានជ្រើស ភាសាបូតមិនមែនកូរ៉េ ឬអង់គ្លេស |
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_LONG | method ក្នុងពេលការហៅ (ក្នុងពេលការហៅ) |
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ហើយផ្សេងទៀតគឺកូដអក្សរធំដូចដើម។