Start an interactive chat with the knowledge base.
(ctx, resume, list_sessions_flag, delete_id, no_color, raw)
| 1753 | ) |
| 1754 | @click.pass_context |
| 1755 | def chat(ctx, resume, list_sessions_flag, delete_id, no_color, raw): |
| 1756 | """Start an interactive chat with the knowledge base.""" |
| 1757 | kb_dir = _find_kb_dir(ctx.obj.get("kb_dir_override")) |
| 1758 | if kb_dir is None: |
| 1759 | click.echo("No knowledge base found. Run `openkb init` first.") |
| 1760 | return |
| 1761 | |
| 1762 | from openkb.agent.chat_session import ( |
| 1763 | ChatSession, |
| 1764 | delete_session, |
| 1765 | list_sessions, |
| 1766 | load_session, |
| 1767 | relative_time, |
| 1768 | resolve_session_id, |
| 1769 | ) |
| 1770 | |
| 1771 | if list_sessions_flag: |
| 1772 | sessions = list_sessions(kb_dir) |
| 1773 | if not sessions: |
| 1774 | click.echo("No chat sessions yet.") |
| 1775 | return |
| 1776 | click.echo(f" {'ID':<22} {'TURNS':<6} {'UPDATED':<12} TITLE") |
| 1777 | click.echo(f" {'-' * 22} {'-' * 6} {'-' * 12} {'-' * 30}") |
| 1778 | for s in sessions: |
| 1779 | rel = relative_time(s.get("updated_at", "")) |
| 1780 | title = s.get("title") or "(empty)" |
| 1781 | click.echo(f" {s['id']:<22} {s['turn_count']:<6} {rel:<12} {title}") |
| 1782 | click.echo(f"\n{len(sessions)} session(s) in {kb_dir / '.openkb' / 'chats'}") |
| 1783 | return |
| 1784 | |
| 1785 | if delete_id is not None: |
| 1786 | try: |
| 1787 | resolved = resolve_session_id(kb_dir, delete_id) |
| 1788 | except ValueError as exc: |
| 1789 | click.echo(f"[ERROR] {exc}") |
| 1790 | return |
| 1791 | if not resolved: |
| 1792 | click.echo(f"No matching session: {delete_id}") |
| 1793 | return |
| 1794 | if delete_session(kb_dir, resolved): |
| 1795 | click.echo(f"Deleted session {resolved}") |
| 1796 | else: |
| 1797 | click.echo(f"Could not delete session: {resolved}") |
| 1798 | return |
| 1799 | |
| 1800 | openkb_dir = kb_dir / ".openkb" |
| 1801 | config = load_config(openkb_dir / "config.yaml") |
| 1802 | _setup_llm_key(kb_dir) |
| 1803 | |
| 1804 | if resume is not None: |
| 1805 | try: |
| 1806 | resolved = resolve_session_id(kb_dir, resume) |
| 1807 | except ValueError as exc: |
| 1808 | click.echo(f"[ERROR] {exc}") |
| 1809 | return |
| 1810 | if not resolved: |
| 1811 | if resume == "__latest__": |
| 1812 | click.echo("No previous chat sessions to resume.") |
nothing calls this directly
no test coverage detected