docs: lock scope to Telegram / 文件收斂為 Telegram 單平台並新增 V1 設計
This commit is contained in:
144
telegram-v1-design.md
Normal file
144
telegram-v1-design.md
Normal file
@@ -0,0 +1,144 @@
|
||||
# reply-end-controls - Telegram V1 Design
|
||||
|
||||
## Scope
|
||||
|
||||
This project is Telegram-only.
|
||||
|
||||
No Discord, Slack, or cross-channel abstraction is part of V1.
|
||||
|
||||
## Product behavior
|
||||
|
||||
At the end of every assistant reply sent to Telegram, attach two inline buttons:
|
||||
|
||||
- `A. 繼續`
|
||||
- `B. 就這樣吧,不需要額外處理`
|
||||
|
||||
Button selection must be captured and stored in conversation/session state.
|
||||
|
||||
If the user types a new message instead of pressing a button, the typed message takes priority.
|
||||
|
||||
## V1 rules
|
||||
|
||||
### Rule 1
|
||||
|
||||
Every assistant reply gets reply-end buttons.
|
||||
|
||||
### Rule 2
|
||||
|
||||
If the user taps `繼續`:
|
||||
|
||||
- store `lastChoice=continue`
|
||||
- allow follow-up behavior on later turns
|
||||
|
||||
### Rule 3
|
||||
|
||||
If the user taps `就這樣吧,不需要額外處理`:
|
||||
|
||||
- store `lastChoice=stop`
|
||||
- suppress unnecessary continuation behavior on later turns
|
||||
|
||||
### Rule 4
|
||||
|
||||
If the user sends a new typed message, that input overrides the button state.
|
||||
|
||||
### Rule 5
|
||||
|
||||
After a button is clicked, the original message buttons should be updated so the selection is visually resolved and repeated clicks are reduced.
|
||||
|
||||
## State model
|
||||
|
||||
Store this in Telegram conversation/session state:
|
||||
|
||||
```json
|
||||
{
|
||||
"replyEndControls": {
|
||||
"lastChoice": "continue | stop",
|
||||
"lastChoiceAt": "ISO timestamp",
|
||||
"sourceMessageId": "telegram message id",
|
||||
"sourceCallbackId": "telegram callback query id",
|
||||
"active": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Telegram callback payloads
|
||||
|
||||
Suggested callback data format:
|
||||
|
||||
- `rec:continue`
|
||||
- `rec:stop`
|
||||
|
||||
If message-scoped state is needed later, extend to:
|
||||
|
||||
- `rec:continue:<messageId>`
|
||||
- `rec:stop:<messageId>`
|
||||
|
||||
## Technical flow
|
||||
|
||||
### Outbound reply flow
|
||||
|
||||
1. Assistant reply text is produced.
|
||||
2. Telegram reply payload is decorated with inline keyboard.
|
||||
3. Message is sent to Telegram.
|
||||
|
||||
### Callback flow
|
||||
|
||||
1. User clicks button.
|
||||
2. Telegram sends callback query.
|
||||
3. Callback handler parses `continue` or `stop`.
|
||||
4. State is persisted.
|
||||
5. Original message buttons are updated to reflect the chosen option.
|
||||
|
||||
### Next-turn behavior
|
||||
|
||||
1. A later turn begins.
|
||||
2. Runtime checks `replyEndControls.lastChoice`.
|
||||
3. If `stop`, do not proactively extend or continue the previous thread unless the user explicitly asks.
|
||||
4. If `continue`, normal continuation behavior is allowed.
|
||||
|
||||
## Suggested implementation modules
|
||||
|
||||
### 1. Reply decorator
|
||||
|
||||
Responsibility:
|
||||
|
||||
- append Telegram inline keyboard to every assistant reply
|
||||
|
||||
### 2. Callback handler
|
||||
|
||||
Responsibility:
|
||||
|
||||
- receive Telegram callback queries
|
||||
- parse reply-end action
|
||||
- update state
|
||||
|
||||
### 3. State storage helper
|
||||
|
||||
Responsibility:
|
||||
|
||||
- persist and retrieve the latest reply-end selection for the current conversation/session
|
||||
|
||||
### 4. Behavior policy hook
|
||||
|
||||
Responsibility:
|
||||
|
||||
- inspect `lastChoice`
|
||||
- suppress proactive continuation when `stop` is active
|
||||
|
||||
## Acceptance criteria for V1
|
||||
|
||||
V1 is complete when all of the following are true:
|
||||
|
||||
1. A normal Telegram assistant reply shows both buttons.
|
||||
2. Clicking `繼續` is received and stored.
|
||||
3. Clicking `就這樣吧,不需要額外處理` is received and stored.
|
||||
4. After click, the original message is updated to show the choice state.
|
||||
5. A new typed user message still works without pressing any button.
|
||||
6. A later turn can read the stored choice and alter continuation behavior.
|
||||
|
||||
## Non-goals for V1
|
||||
|
||||
- multi-channel abstraction
|
||||
- governance integration
|
||||
- analytics dashboard
|
||||
- complex branching controls beyond `continue` and `stop`
|
||||
Reference in New Issue
Block a user