Identities
ไดเรกทอรีของบุคคลและลูกค้าในองค์กรของคุณ: ข้อมูลชุดเดียวต่อหนึ่งคนที่ dashboard แอป และ AI agent ใช้ร่วมกัน
identity คือบุคคล กลุ่ม หรือบัญชีลูกค้าหนึ่งรายในไดเรกทอรีขององค์กรคุณ ทีมของคุณแก้ไขได้ใน dashboard แอปใช้งานผ่าน SDK และ agent ที่คุยกับลูกค้าใช้ตัดสินว่าบทสนทนานั้นอ่านข้อมูลของใครได้ ตารางใน Data Store อ้างอิง identity ได้ ดังนั้นคำสั่งซื้อจะผูกกับตัวบุคคล ไม่ใช่สำเนาชื่อของเขา
เปิด Identities ใน dashboard
ใครอยู่ในไดเรกทอรีบ้าง
identity ส่วนใหญ่ถูกเพิ่มให้โดยอัตโนมัติ:
| แหล่งที่มา | สิ่งที่ถูกเพิ่ม |
|---|---|
| สมาชิกในทีม | สมาชิกทุกคนในองค์กรของคุณ เชื่อมกับบัญชีที่ใช้เข้าสู่ระบบ dashboard |
| ผู้ที่เข้าสู่ระบบแอป | ผู้ใช้แต่ละคนของแอป เชื่อมให้เมื่อเข้าสู่ระบบ |
| ข้อความขาเข้า | หนึ่งบุคคลต่อข้อความส่วนตัวหนึ่งราย หรือหนึ่งกลุ่มต่อแชตกลุ่มหนึ่ง บนช่องทางที่เชื่อมต่อไว้ |
| แอปของคุณ | ใครก็ตามที่แอปสร้างขึ้น เช่น ลูกค้า walk-in หรือพนักงานใหม่ |
| คุณ | ใครก็ตามที่คุณสร้างเองใน dashboard |
- ลูกค้าที่เข้าสู่ระบบแอปของคุณสองแอปถือเป็นคนเดียวกัน
- sandbox, preview และ staging เพิ่มบุคคลเข้าไปในไดเรกทอรีจริงชุดเดียวกับ production บุคคลที่ staging สร้างจะมีเครื่องหมายบอกว่ามาจาก staging นั้น
- ชื่อและ
emailของสมาชิกในทีมเป็นไปตามบัญชี Stardeck ของเขา และแก้ไขไม่ได้ที่นี่ (รวมถึงผ่าน SDK) ตราบที่เขายังอยู่ในทีม ส่วน attribute อื่นยังแก้ไขได้ listและsearchของแอปจะไม่แสดงบุคคลที่เป็นเพียงสมาชิกในทีม
ประเภทของ identity
| ประเภท | คืออะไร | ซ้อนอยู่ใต้ | ผูกกับช่องทางได้ไหม |
|---|---|---|---|
| Account | หน่วย scope ระดับบนสุด: บริษัทหรือบัญชีลูกค้า | ไม่มี (เป็นระดับบนสุด) | ไม่ได้ |
| Group | เจ้าของข้อมูลแบบกลุ่ม เช่น แชตกลุ่ม LINE | account หรือ group | ได้ |
| Person | บุคคลหนึ่งคน | account หรือ group | ได้ |
scope ทำงานอย่างไร
identity ซ้อนกันเป็น tier ผ่าน memberships: account มี group และ group มี person สิทธิ์อ่านไหลขึ้นด้านบน กล่าวคือ เจ้าของข้อมูลอ่านข้อมูลของตัวเองบวกข้อมูลของ identity ที่อยู่เหนือขึ้นไปทุกระดับ และไม่อ่านข้อมูลของสมาชิกหรือของ identity ระดับเดียวกัน
flowchart TD
A["Account: Acme Inc."] --> G["Group: Acme support chat"]
A --> D["Person: Dana"]
G --> S["Person: Sam"]
Sam อ่านข้อมูลของ Sam, support chat และ Acme Inc. Dana อ่านข้อมูลของ Dana และ Acme Inc. แต่ไม่อ่านของ Sam หรือของแชตกลุ่ม Acme Inc. อ่านได้เฉพาะของตัวเอง
ส่วน Memberships ของ identity แสดง effective read scope ซึ่งคือสิ่งที่ agent ที่ถูกจำกัด scope อ่านได้จริง ตรวจดูก่อนชี้ agent ไปที่ลูกค้าคนใดคนหนึ่ง
Channel links
channel link ผูก identifier ภายนอกหรือบัญชีเข้าสู่ระบบเข้ากับ person หรือ group เพื่อให้ข้อความขาเข้าและการเข้าสู่ระบบชี้ไปที่ identity ที่ถูกต้อง Account ไม่ผูกกับช่องทาง
| ชนิดของลิงก์ | ค่าทั่วไป |
|---|---|
| LINE | LINE user id (person) หรือ group id |
| page-scoped user id ของ Facebook | |
| Instagram-scoped user id | |
| อีเมล | |
| Phone | เบอร์โทรศัพท์ |
| App login | การเข้าสู่ระบบของบุคคลในแอปที่ deploy ของคุณ |
| Dashboard user | บัญชี Stardeck ของสมาชิกในทีม |
- Verified หมายถึงพิสูจน์แล้วว่าเป็นของบุคคลนั้นจริง อีเมลและเบอร์โทรที่ยังไม่ verify อยู่กับหลายคนได้ (เช่น ครอบครัวที่ใช้เบอร์เดียวกัน)
- App login, Dashboard login และ channel id แต่ละรายการเป็นของ identity เดียวเท่านั้น
- ข้อความขาเข้าจะหาผู้ส่งจาก channel link หรือสร้าง person (ข้อความส่วนตัว) หรือ group (แชตกลุ่ม) ขึ้นมา การสนทนาบนเว็บแต่ละรายการได้ person แบบไม่ระบุชื่อของตัวเอง
จัดการ identity
- สร้าง: กด New Identity เลือกประเภท ใส่ชื่อที่แสดง และ external reference (รหัสลูกค้าของคุณเอง) ถ้าต้องการ การกำหนด parent ต้องมี
identities:govern - แก้ไข attribute: ช่องแบบอิสระ เช่น ตำแหน่งหรือระดับสมาชิก แอปอ่านและเขียน attribute ชุดเดียวกัน
- Channel links: เพิ่มชนิดและ external id ทำเครื่องหมาย verified เมื่อมั่นใจแล้วเท่านั้น
- Memberships: Belongs to แสดง parent (ทำให้ read scope กว้างขึ้น) Members แสดง child การเปลี่ยน parent ต้องมี
identities:govern - Merge: รวมรายการซ้ำเข้ากับรายการที่คงไว้ซึ่งเป็นประเภทเดียวกัน โดยย้าย link และ scope มาด้วย ต้องมี
identities:governมีบันทึกการตรวจสอบ และไม่สามารถย้อนกลับอัตโนมัติ - Archive: เลิกใช้ identity ซึ่งจะไม่มี read scope เลย บทสนทนาที่ชี้ไปที่ identity นี้จึงอ่านอะไรไม่ได้
หากต้องการให้บัญชีเข้าสู่ระบบแก่คนที่อยู่ในไดเรกทอรีแล้ว ให้เลือกเขาในคอลัมน์ Person ของ สร้างบัญชีโดยตรง หากเพิ่มบัญชีเข้าสู่ระบบให้บุคคลนั้นไม่ได้ บัญชียังใช้งานได้ตามปกติ ให้ merge บุคคลสองรายนี้ที่หน้านี้
เชื่อมลูกค้ากับโปรไฟล์ของเขา
profile connection เชื่อมบัญชีเข้าสู่ระบบใหม่ของลูกค้ากับโปรไฟล์ที่มีประวัติของเขาอยู่แล้ว (ลูกค้า walk-in, การจองทางโทรศัพท์ หรือรายชื่อที่นำเข้า) แอปของคุณขอลิงก์ แล้วลูกค้ายืนยันบนหน้าที่ Stardeck เป็นผู้โฮสต์
- คำเชิญทางอีเมลหรือเบอร์โทร: ส่งไปยังช่องทางติดต่อที่อยู่ในโปรไฟล์ ลูกค้าพิสูจน์ว่าเป็นเจ้าของช่องทางนั้น
- Profile invite link: สำหรับโปรไฟล์ที่ไม่มีช่องทางติดต่อ แสดงต่อหน้าเป็น QR code หรือใบสลิป ไม่มีการ verify ใครก็ตามที่เข้าสู่ระบบจะได้โปรไฟล์นั้นไป ปิดได้ที่ Settings → Authentication ของแอป ใต้ Sessions → Profile Invite Links ลิงก์ที่ออกไปแล้วจะใช้ไม่ได้ทันที
Stardeck จะปฏิเสธการเชื่อมหากบัญชีเข้าสู่ระบบอื่นเป็นเจ้าของโปรไฟล์นั้นอยู่แล้ว หรือพิสูจน์ช่องทางติดต่อนั้นไปแล้ว แอปของคุณไม่ merge โปรไฟล์เอง
สิทธิ์
การจัดการ identity ควบคุมด้วยสิทธิ์ระดับองค์กร (ดู สมาชิกและบทบาท):
| สิทธิ์ | ให้สิ่งใด |
|---|---|
identities:manage | ดูไดเรกทอรี สร้างและแก้ไข identity และแนบ channel link |
identities:govern | การกระทำที่เปลี่ยน read scope: merge, ลบหรือ archive, เปลี่ยน parent และแก้ channel link ที่ขัดแย้งกัน |
identities:assist-claim | จับคู่กับลูกค้าที่เข้าสู่ระบบอยู่ และเลือกว่าจะเชื่อมกับโปรไฟล์เดิมใด ลูกค้ายังต้องยืนยันบนอุปกรณ์ของตัวเอง |
identities:transfer-claim | ย้ายโปรไฟล์ที่เชื่อมกับบัญชีเข้าสู่ระบบอื่นอยู่แล้ว การทำเช่นนี้จะเพิกถอนสิทธิ์เข้าถึงของบัญชีนั้น จึงควรให้สิทธิ์นี้อย่างระมัดระวัง |
identities:impersonate | ดูตัวอย่างแอปใน sandbox ในฐานะบุคคลหนึ่งจากไดเรกทอรี |
identities:manage ช่วยให้ไดเรกทอรีเป็นระเบียบ มีเพียง identities:govern เท่านั้นที่เปลี่ยนสิ่งที่ agent อ่านได้
ใช้ identity กับ AI agent
agent ที่คุยกับลูกค้าและอ่านข้อมูลตาม scope ของ identity อยู่ในช่วง early access หากต้องการลองใช้ ส่งอีเมลถึง support@stardeck.ai
ทุกบทสนทนาในหน้า Conversations มี identity ของตัวเอง หากต้องการแก้ ให้เปลี่ยนแถว Person ในแผง Customer ของบทสนทนา (ต้องมี identities:manage) การอ่านข้อมูลจะเป็นไปตาม identity ใหม่ตั้งแต่การตอบครั้งถัดไป
ใช้ identity จากแอปของคุณ
แอปใช้ integrations.identities จาก integrations-sdk ดู API ทั้งหมดได้ใน SKILL.md ของแพ็กเกจ attribute อยู่ใน profile:
const person = await integrations.identities.create({
type: "person",
displayName: "Somchai",
profile: { position: "Head chef", branch: "Silom" },
});update จะแทนที่ทั้ง profile ให้อ่านก่อน แก้ แล้วเขียนกลับทั้งหมด:
const { identity } = await integrations.identities.get(person.id);
await integrations.identities.update(person.id, {
profile: { ...identity.profile, position: "Sous chef" },
});สำหรับสมาชิกในทีมปัจจุบัน การเปลี่ยนชื่อที่แสดงหรือ email จะถูกปฏิเสธ แต่เขียนค่าเดิมกลับไปได้ และถ้าไม่ใส่ email ก็จะคงค่าเดิมไว้
ค้นหาตาม attribute:
const page = await integrations.identities.search({
attributes: { position: "Head chef" },
});- ตรงกันทุก key แบบตรงตัว ตามชนิด JSON (
"5"ไม่ตรงกับ5) - ค่าเป็น string (ยาวไม่เกิน 500 ตัวอักษร) ตัวเลข หรือ boolean ได้สูงสุด 10 key แต่ละ key ยาว 1–100 ตัวอักษร
- ใช้ร่วมกับ
queryได้ (ชื่อที่แสดง หรือ external id ของ link ใดก็ได้) - แบ่งหน้าด้วย
nextCursor→cursorlimitตั้งได้ 1–100 ค่าเริ่มต้น 50
เก็บข้อมูลภายในไว้เป็นความลับ
scope กำหนดว่า agent อ่านข้อมูลของลูกค้าคนไหนได้ ไม่ได้กำหนดว่าแสดงฟิลด์ใดได้บ้าง customer-facing agent เห็นเฉพาะข้อมูลที่เปิดให้ลูกค้าเห็น ส่วน staff agent เห็นทั้งเรคคอร์ด ให้บังคับเรื่องนี้ที่ Data Store เพราะ agent ที่ถูกจำกัด scope อ่านจาก Data Store โดยตรงและไม่เคยรันโค้ดของแอปคุณ การซ่อนฟิลด์ในแอปจึงไม่มีผล
- Staff-only store: แยกข้อมูลภายในไว้ใน store ของมันเอง แล้วเปิด Staff-only store ใน General settings ของ store นั้น ผู้ช่วยที่คุยกับลูกค้าจะถูกให้สิทธิ์เข้าถึง store นี้ไม่ได้
- Shared store: เปิด Enforce client/internal visibility ใน General settings จากนั้น:
- Column tiers: ทำเครื่องหมายคอลัมน์เป็น Client หรือ Internal คอลัมน์ Internal จะถูกซ่อน และค้นหาหรือเรียงลำดับไม่ได้
- Row visibility: ในแต่ละตาราง เลือกคอลัมน์ที่ระบุว่าแถวไหนลูกค้าเห็นได้ ตารางที่ยังเป็น Not configured จะถูกซ่อนจาก customer-facing agent
- Default tier: คงไว้เป็น Internal เพื่อให้คอลัมน์ใหม่เป็นความลับตั้งแต่แรก