pickle-bot 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pickle_bot-0.1.1/.dockerignore +9 -0
- pickle_bot-0.1.1/.github/dependabot.yml +8 -0
- pickle_bot-0.1.1/.github/workflows/publish.yml +61 -0
- pickle_bot-0.1.1/.github/workflows/test.yml +40 -0
- pickle_bot-0.1.1/.gitignore +13 -0
- pickle_bot-0.1.1/.python-version +1 -0
- pickle_bot-0.1.1/CLAUDE.md +51 -0
- pickle_bot-0.1.1/Dockerfile +19 -0
- pickle_bot-0.1.1/PKG-INFO +119 -0
- pickle_bot-0.1.1/PickleBotCover.png +0 -0
- pickle_bot-0.1.1/README.md +79 -0
- pickle_bot-0.1.1/compose.yaml +10 -0
- pickle_bot-0.1.1/default_workspace/agents/cookie/AGENT.md +68 -0
- pickle_bot-0.1.1/default_workspace/agents/pickle/AGENT.md +40 -0
- pickle_bot-0.1.1/default_workspace/skills/cron-ops/SKILL.md +77 -0
- pickle_bot-0.1.1/default_workspace/skills/skill-creator/SKILL.md +343 -0
- pickle_bot-0.1.1/default_workspace/skills/skill-creator/scripts/init_skill.py +303 -0
- pickle_bot-0.1.1/docs/architecture.md +499 -0
- pickle_bot-0.1.1/docs/configuration.md +175 -0
- pickle_bot-0.1.1/docs/features.md +186 -0
- pickle_bot-0.1.1/docs/messagebus-setup.md +56 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-agent-concurrency-design.md +258 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-agent-concurrency-impl.md +1020 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-onboarding-modular-refactor-design.md +193 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-onboarding-modular-refactor-impl.md +1412 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-pypi-publishing-design.md +159 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-pypi-publishing-impl.md +274 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-subagent-concurrency-design.md +204 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-subagent-concurrency-implementation.md +945 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-web-search-read-design.md +320 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-web-search-read-impl.md +1390 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-web-tools-onboarding-design.md +121 -0
- pickle_bot-0.1.1/docs/plans/2026-02-23-web-tools-onboarding-impl.md +374 -0
- pickle_bot-0.1.1/docs/plans/2026-02-24-default-agents-skills-design.md +173 -0
- pickle_bot-0.1.1/docs/plans/2026-02-24-default-agents-skills-impl.md +375 -0
- pickle_bot-0.1.1/docs/plans/2026-02-24-docs-refresh-design.md +113 -0
- pickle_bot-0.1.1/docs/plans/2026-02-24-docs-refresh-impl.md +421 -0
- pickle_bot-0.1.1/docs/plans/2026-02-24-simplify-api-config-design.md +46 -0
- pickle_bot-0.1.1/docs/plans/2026-02-24-simplify-api-config-impl.md +281 -0
- pickle_bot-0.1.1/main.py +6 -0
- pickle_bot-0.1.1/pyproject.toml +88 -0
- pickle_bot-0.1.1/src/picklebot/__init__.py +3 -0
- pickle_bot-0.1.1/src/picklebot/api/__init__.py +5 -0
- pickle_bot-0.1.1/src/picklebot/api/app.py +33 -0
- pickle_bot-0.1.1/src/picklebot/api/deps.py +10 -0
- pickle_bot-0.1.1/src/picklebot/api/routers/__init__.py +1 -0
- pickle_bot-0.1.1/src/picklebot/api/routers/agents.py +89 -0
- pickle_bot-0.1.1/src/picklebot/api/routers/config.py +52 -0
- pickle_bot-0.1.1/src/picklebot/api/routers/crons.py +83 -0
- pickle_bot-0.1.1/src/picklebot/api/routers/memories.py +97 -0
- pickle_bot-0.1.1/src/picklebot/api/routers/sessions.py +69 -0
- pickle_bot-0.1.1/src/picklebot/api/routers/skills.py +83 -0
- pickle_bot-0.1.1/src/picklebot/api/schemas.py +60 -0
- pickle_bot-0.1.1/src/picklebot/cli/__init__.py +5 -0
- pickle_bot-0.1.1/src/picklebot/cli/chat.py +80 -0
- pickle_bot-0.1.1/src/picklebot/cli/main.py +104 -0
- pickle_bot-0.1.1/src/picklebot/cli/onboarding/__init__.py +5 -0
- pickle_bot-0.1.1/src/picklebot/cli/onboarding/steps.py +348 -0
- pickle_bot-0.1.1/src/picklebot/cli/onboarding/wizard.py +57 -0
- pickle_bot-0.1.1/src/picklebot/cli/server.py +25 -0
- pickle_bot-0.1.1/src/picklebot/core/__init__.py +20 -0
- pickle_bot-0.1.1/src/picklebot/core/agent.py +335 -0
- pickle_bot-0.1.1/src/picklebot/core/agent_loader.py +121 -0
- pickle_bot-0.1.1/src/picklebot/core/context.py +40 -0
- pickle_bot-0.1.1/src/picklebot/core/cron_loader.py +119 -0
- pickle_bot-0.1.1/src/picklebot/core/history.py +298 -0
- pickle_bot-0.1.1/src/picklebot/core/skill_loader.py +88 -0
- pickle_bot-0.1.1/src/picklebot/frontend/__init__.py +7 -0
- pickle_bot-0.1.1/src/picklebot/frontend/base.py +58 -0
- pickle_bot-0.1.1/src/picklebot/frontend/console.py +55 -0
- pickle_bot-0.1.1/src/picklebot/frontend/messagebus.py +64 -0
- pickle_bot-0.1.1/src/picklebot/messagebus/__init__.py +7 -0
- pickle_bot-0.1.1/src/picklebot/messagebus/base.py +108 -0
- pickle_bot-0.1.1/src/picklebot/messagebus/discord_bus.py +166 -0
- pickle_bot-0.1.1/src/picklebot/messagebus/telegram_bus.py +175 -0
- pickle_bot-0.1.1/src/picklebot/provider/__init__.py +0 -0
- pickle_bot-0.1.1/src/picklebot/provider/llm/__init__.py +11 -0
- pickle_bot-0.1.1/src/picklebot/provider/llm/base.py +134 -0
- pickle_bot-0.1.1/src/picklebot/provider/llm/providers.py +25 -0
- pickle_bot-0.1.1/src/picklebot/provider/web_read/__init__.py +5 -0
- pickle_bot-0.1.1/src/picklebot/provider/web_read/base.py +58 -0
- pickle_bot-0.1.1/src/picklebot/provider/web_read/crawl4ai.py +43 -0
- pickle_bot-0.1.1/src/picklebot/provider/web_search/__init__.py +5 -0
- pickle_bot-0.1.1/src/picklebot/provider/web_search/base.py +59 -0
- pickle_bot-0.1.1/src/picklebot/provider/web_search/brave.py +63 -0
- pickle_bot-0.1.1/src/picklebot/server/__init__.py +6 -0
- pickle_bot-0.1.1/src/picklebot/server/agent_worker.py +136 -0
- pickle_bot-0.1.1/src/picklebot/server/base.py +70 -0
- pickle_bot-0.1.1/src/picklebot/server/cron_worker.py +93 -0
- pickle_bot-0.1.1/src/picklebot/server/messagebus_worker.py +101 -0
- pickle_bot-0.1.1/src/picklebot/server/server.py +100 -0
- pickle_bot-0.1.1/src/picklebot/tools/__init__.py +6 -0
- pickle_bot-0.1.1/src/picklebot/tools/base.py +73 -0
- pickle_bot-0.1.1/src/picklebot/tools/builtin_tools.py +132 -0
- pickle_bot-0.1.1/src/picklebot/tools/post_message_tool.py +69 -0
- pickle_bot-0.1.1/src/picklebot/tools/registry.py +69 -0
- pickle_bot-0.1.1/src/picklebot/tools/skill_tool.py +62 -0
- pickle_bot-0.1.1/src/picklebot/tools/subagent_tool.py +114 -0
- pickle_bot-0.1.1/src/picklebot/tools/webread_tool.py +62 -0
- pickle_bot-0.1.1/src/picklebot/tools/websearch_tool.py +65 -0
- pickle_bot-0.1.1/src/picklebot/utils/__init__.py +17 -0
- pickle_bot-0.1.1/src/picklebot/utils/config.py +287 -0
- pickle_bot-0.1.1/src/picklebot/utils/def_loader.py +183 -0
- pickle_bot-0.1.1/src/picklebot/utils/logging.py +38 -0
- pickle_bot-0.1.1/tests/api/__init__.py +1 -0
- pickle_bot-0.1.1/tests/api/test_agents.py +149 -0
- pickle_bot-0.1.1/tests/api/test_config.py +154 -0
- pickle_bot-0.1.1/tests/api/test_crons.py +200 -0
- pickle_bot-0.1.1/tests/api/test_memories.py +223 -0
- pickle_bot-0.1.1/tests/api/test_sessions.py +176 -0
- pickle_bot-0.1.1/tests/api/test_skills.py +151 -0
- pickle_bot-0.1.1/tests/cli/__init__.py +0 -0
- pickle_bot-0.1.1/tests/cli/onboarding/__init__.py +0 -0
- pickle_bot-0.1.1/tests/cli/onboarding/test_steps.py +491 -0
- pickle_bot-0.1.1/tests/cli/onboarding/test_wizard.py +39 -0
- pickle_bot-0.1.1/tests/cli/test_main.py +51 -0
- pickle_bot-0.1.1/tests/cli/test_server.py +81 -0
- pickle_bot-0.1.1/tests/conftest.py +75 -0
- pickle_bot-0.1.1/tests/core/__init__.py +1 -0
- pickle_bot-0.1.1/tests/core/test_agent.py +158 -0
- pickle_bot-0.1.1/tests/core/test_agent_loader.py +344 -0
- pickle_bot-0.1.1/tests/core/test_context.py +19 -0
- pickle_bot-0.1.1/tests/core/test_cron_loader.py +150 -0
- pickle_bot-0.1.1/tests/core/test_history.py +500 -0
- pickle_bot-0.1.1/tests/core/test_session.py +45 -0
- pickle_bot-0.1.1/tests/core/test_skill_loader.py +166 -0
- pickle_bot-0.1.1/tests/frontend/__init__.py +1 -0
- pickle_bot-0.1.1/tests/frontend/test_messagebus_frontend.py +111 -0
- pickle_bot-0.1.1/tests/messagebus/__init__.py +0 -0
- pickle_bot-0.1.1/tests/messagebus/test_base.py +152 -0
- pickle_bot-0.1.1/tests/messagebus/test_discord_bus.py +167 -0
- pickle_bot-0.1.1/tests/messagebus/test_telegram_bus.py +216 -0
- pickle_bot-0.1.1/tests/provider/test_base.py +29 -0
- pickle_bot-0.1.1/tests/provider/test_brave_search.py +80 -0
- pickle_bot-0.1.1/tests/provider/test_crawl4ai.py +92 -0
- pickle_bot-0.1.1/tests/provider/test_web_read_base.py +42 -0
- pickle_bot-0.1.1/tests/provider/test_web_search_base.py +31 -0
- pickle_bot-0.1.1/tests/server/__init__.py +1 -0
- pickle_bot-0.1.1/tests/server/test_agent_worker.py +626 -0
- pickle_bot-0.1.1/tests/server/test_base.py +21 -0
- pickle_bot-0.1.1/tests/server/test_cron_worker.py +134 -0
- pickle_bot-0.1.1/tests/server/test_messagebus_worker.py +283 -0
- pickle_bot-0.1.1/tests/server/test_server.py +85 -0
- pickle_bot-0.1.1/tests/tools/__init__.py +0 -0
- pickle_bot-0.1.1/tests/tools/test_agent_web_tools.py +59 -0
- pickle_bot-0.1.1/tests/tools/test_post_message_tool.py +117 -0
- pickle_bot-0.1.1/tests/tools/test_registry.py +119 -0
- pickle_bot-0.1.1/tests/tools/test_skill_tool.py +134 -0
- pickle_bot-0.1.1/tests/tools/test_subagent_tool.py +362 -0
- pickle_bot-0.1.1/tests/tools/test_webread_tool.py +87 -0
- pickle_bot-0.1.1/tests/tools/test_websearch_tool.py +87 -0
- pickle_bot-0.1.1/tests/utils/__init__.py +1 -0
- pickle_bot-0.1.1/tests/utils/test_config.py +271 -0
- pickle_bot-0.1.1/tests/utils/test_config_files.py +140 -0
- pickle_bot-0.1.1/tests/utils/test_def_loader.py +309 -0
- pickle_bot-0.1.1/uv.lock +2938 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
release_type:
|
|
7
|
+
description: "Release Type"
|
|
8
|
+
required: true
|
|
9
|
+
type: choice
|
|
10
|
+
default: "patch"
|
|
11
|
+
options:
|
|
12
|
+
- major
|
|
13
|
+
- minor
|
|
14
|
+
- patch
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: write
|
|
18
|
+
id-token: write
|
|
19
|
+
|
|
20
|
+
env:
|
|
21
|
+
PYTHON_VERSION: "3.13"
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
publish:
|
|
25
|
+
name: Build and Publish
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
|
|
28
|
+
steps:
|
|
29
|
+
- name: Checkout code
|
|
30
|
+
uses: actions/checkout@v4
|
|
31
|
+
|
|
32
|
+
- name: Install uv
|
|
33
|
+
uses: astral-sh/setup-uv@v5
|
|
34
|
+
|
|
35
|
+
- name: Install Python
|
|
36
|
+
run: uv python install ${{ env.PYTHON_VERSION }}
|
|
37
|
+
|
|
38
|
+
- name: Bump version
|
|
39
|
+
id: bump
|
|
40
|
+
uses: callowayproject/bump-my-version@master
|
|
41
|
+
env:
|
|
42
|
+
BUMPVERSION_TAG: "false"
|
|
43
|
+
with:
|
|
44
|
+
args: ${{ inputs.release_type }}
|
|
45
|
+
github-token: ${{ secrets.GH_TOKEN }}
|
|
46
|
+
|
|
47
|
+
- name: Build package
|
|
48
|
+
run: uv build
|
|
49
|
+
|
|
50
|
+
- name: Publish to PyPI
|
|
51
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
52
|
+
|
|
53
|
+
- name: Create GitHub Release
|
|
54
|
+
uses: ncipollo/release-action@v1
|
|
55
|
+
with:
|
|
56
|
+
name: pickle-bot v${{ steps.bump.outputs.current-version }}
|
|
57
|
+
tag: v${{ steps.bump.outputs.current-version }}
|
|
58
|
+
body: "Release v${{ steps.bump.outputs.current-version }}"
|
|
59
|
+
artifacts: dist/*
|
|
60
|
+
token: ${{ secrets.GH_TOKEN }}
|
|
61
|
+
generateReleaseNotes: true
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Run Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
types: [opened, synchronize, reopened]
|
|
8
|
+
|
|
9
|
+
env:
|
|
10
|
+
PYTHON_LATEST: 3.13
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
test:
|
|
14
|
+
name: Test Python ${{ matrix.python-version }}
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
strategy:
|
|
17
|
+
matrix:
|
|
18
|
+
python-version: ["3.13"]
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- name: Checkout code
|
|
22
|
+
uses: actions/checkout@v6
|
|
23
|
+
|
|
24
|
+
- name: Install uv
|
|
25
|
+
uses: astral-sh/setup-uv@v7
|
|
26
|
+
|
|
27
|
+
- name: Install Python ${{ matrix.python-version }}
|
|
28
|
+
run: uv python install ${{ matrix.python-version }}
|
|
29
|
+
|
|
30
|
+
- name: Install dependencies
|
|
31
|
+
run: uv sync --extra dev
|
|
32
|
+
|
|
33
|
+
- name: Run tests
|
|
34
|
+
run: uv run pytest tests/ -v
|
|
35
|
+
|
|
36
|
+
- name: Test Summary
|
|
37
|
+
if: always()
|
|
38
|
+
run: |
|
|
39
|
+
echo "## Test Results" >> $GITHUB_STEP_SUMMARY
|
|
40
|
+
echo "Tests completed for Python ${{ matrix.python-version }}" >> $GITHUB_STEP_SUMMARY
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
Essential context for working in pickle-bot codebase.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
uv run picklebot chat # Interactive chat with default agent
|
|
9
|
+
uv run picklebot chat -a cookie # Use specific agent
|
|
10
|
+
uv run picklebot server # Start server (crons + messagebus)
|
|
11
|
+
uv run pytest # Run tests
|
|
12
|
+
uv run black . && uv run ruff check . # Format + lint
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Architecture Overview
|
|
16
|
+
|
|
17
|
+
**Entry Points:**
|
|
18
|
+
- `cli/` - Typer commands (chat, server)
|
|
19
|
+
- `api/` - FastAPI HTTP interface (routers for agents, skills, crons, sessions, memories, config)
|
|
20
|
+
- `workers/` - Server mode workers (AgentWorker, CronWorker, MessageBusWorker)
|
|
21
|
+
|
|
22
|
+
**Core Flow:**
|
|
23
|
+
```
|
|
24
|
+
Agent receives message -> loads tools -> calls LLM -> executes tool calls -> response
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Key Files:**
|
|
28
|
+
- `core/agent.py` - Agent orchestrator
|
|
29
|
+
- `core/session.py` - Runtime state
|
|
30
|
+
- `core/context.py` - SharedContext DI
|
|
31
|
+
- `api/app.py` - FastAPI factory
|
|
32
|
+
- `api/routers/` - REST endpoints
|
|
33
|
+
- `workers/server.py` - Worker orchestration
|
|
34
|
+
- `tools/registry.py` - Tool registration
|
|
35
|
+
- `messagebus/base.py` - Platform abstraction
|
|
36
|
+
- `utils/def_loader.py` - Definition parsing
|
|
37
|
+
- `provider/llm/base.py` - LLM provider base
|
|
38
|
+
|
|
39
|
+
## Key Conventions
|
|
40
|
+
|
|
41
|
+
- **Workers** - Single responsibility, communicate via queues
|
|
42
|
+
- **Sessions** - One per conversation, persisted to disk
|
|
43
|
+
- **Tools** - Async functions, return strings
|
|
44
|
+
- **MessageBus** - Platform-agnostic with typed contexts
|
|
45
|
+
- **Providers** - Auto-registering via `__init_subclass__`
|
|
46
|
+
|
|
47
|
+
## What Goes Where
|
|
48
|
+
|
|
49
|
+
- **Configuration** -> [docs/configuration.md](docs/configuration.md)
|
|
50
|
+
- **Features** -> [docs/features.md](docs/features.md)
|
|
51
|
+
- **Architecture & Internals** -> [docs/architecture.md](docs/architecture.md)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
FROM python:3.13-slim
|
|
2
|
+
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
EXPOSE 8000
|
|
5
|
+
|
|
6
|
+
RUN apt-get update && \
|
|
7
|
+
apt-get install -y --no-install-recommends nodejs npm && \
|
|
8
|
+
rm -rf /var/lib/apt/lists/*
|
|
9
|
+
|
|
10
|
+
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
|
11
|
+
|
|
12
|
+
COPY pyproject.toml uv.lock README.md ./
|
|
13
|
+
COPY src/ ./src/
|
|
14
|
+
|
|
15
|
+
RUN uv sync --frozen --no-dev
|
|
16
|
+
|
|
17
|
+
RUN mkdir -p ~/.pickle-bot
|
|
18
|
+
|
|
19
|
+
CMD ["uv", "run", "picklebot", "server"]
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pickle-bot
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Personal AI assistant with pluggable skills
|
|
5
|
+
Project-URL: Homepage, https://github.com/zane-chen/pickle-bot
|
|
6
|
+
Project-URL: Repository, https://github.com/zane-chen/pickle-bot
|
|
7
|
+
Project-URL: Issues, https://github.com/zane-chen/pickle-bot/issues
|
|
8
|
+
Author-email: zane <czl970721@gmail.com>
|
|
9
|
+
License: MIT
|
|
10
|
+
Keywords: ai,assistant,chatbot,llm
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Requires-Python: >=3.13
|
|
17
|
+
Requires-Dist: crawl4ai>=0.4.0
|
|
18
|
+
Requires-Dist: croniter>=1.0.0
|
|
19
|
+
Requires-Dist: discord-py>=2.0
|
|
20
|
+
Requires-Dist: fastapi>=0.115.0
|
|
21
|
+
Requires-Dist: httpx>=0.27.0
|
|
22
|
+
Requires-Dist: litellm>=1.0.0
|
|
23
|
+
Requires-Dist: pydantic>=2.0.0
|
|
24
|
+
Requires-Dist: python-telegram-bot>=20.0
|
|
25
|
+
Requires-Dist: pyyaml>=6.0
|
|
26
|
+
Requires-Dist: questionary>=2.0.0
|
|
27
|
+
Requires-Dist: rich>=13.0.0
|
|
28
|
+
Requires-Dist: textual>=0.21.0
|
|
29
|
+
Requires-Dist: typer>=0.12.0
|
|
30
|
+
Requires-Dist: uvicorn[standard]>=0.32.0
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: bump-my-version>=0.20.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: mypy>=1.19.1; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest>=9.0.2; extra == 'dev'
|
|
36
|
+
Requires-Dist: ruff>=0.15.1; extra == 'dev'
|
|
37
|
+
Requires-Dist: types-croniter; extra == 'dev'
|
|
38
|
+
Requires-Dist: types-pyyaml; extra == 'dev'
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
# Pickle-Bot
|
|
42
|
+
|
|
43
|
+
Your own AI assistant. Name it. Talk to it. Teach it things. Important fact [Pickle](https://www.instagram.com/pickle__chen/) is a standard little cat.
|
|
44
|
+
|
|
45
|
+
Pickle-bot is a yet another lightweight version of [Openclaw](https://github.com/openclaw/openclaw).
|
|
46
|
+
|
|
47
|
+
The project started with the mindset of building-you-own-openclaw, but end up staying on my raspberry PI, dealing with all daily manners.
|
|
48
|
+
|
|
49
|
+
<img style="width: 100%;" src="PickleBotCover.png">
|
|
50
|
+
|
|
51
|
+
## Installation
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# From PyPI
|
|
55
|
+
pip install pickle-bot
|
|
56
|
+
|
|
57
|
+
# Or from source
|
|
58
|
+
git clone https://github.com/zane-chen/pickle-bot.git
|
|
59
|
+
cd pickle-bot
|
|
60
|
+
uv sync
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Quick Start
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
picklebot init # First run: meet your new companion
|
|
67
|
+
picklebot chat # Start chatting
|
|
68
|
+
picklebot server # Run background tasks (crons, Telegram, Discord)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The first run guides you through setup. Pick your LLM, configure your agent, and you're ready.
|
|
72
|
+
|
|
73
|
+
## Features
|
|
74
|
+
|
|
75
|
+
- **Multi-Agent AI** - Create specialized agents for different tasks (Pickle for general chat, Cookie for memories, or build your own)
|
|
76
|
+
- **Web Tools** - Search the web, read pages, do research
|
|
77
|
+
- **Skills** - Teach your agent new tricks by writing markdown files
|
|
78
|
+
- **Cron Jobs** - Schedule recurring tasks and reminders
|
|
79
|
+
- **Memory System** - Your agent remembers things across conversations
|
|
80
|
+
- **Multi-Platform** - CLI, Telegram, Discord - same agent, different places
|
|
81
|
+
- **HTTP API** - Let Pickle write a frontend for you
|
|
82
|
+
|
|
83
|
+
## Documentation
|
|
84
|
+
|
|
85
|
+
- **[Configuration](docs/configuration.md)** - Full config reference
|
|
86
|
+
- **[Features](docs/features.md)** - How to use each feature
|
|
87
|
+
- **[Architecture](docs/architecture.md)** - How it works under the hood
|
|
88
|
+
|
|
89
|
+
## Fun Facts
|
|
90
|
+
|
|
91
|
+
### Why Naming Agents with These Names?
|
|
92
|
+
|
|
93
|
+
Pickle is my cat, as mentioned at the beginning. She is really talktive, definitely more than you can think about.
|
|
94
|
+
|
|
95
|
+
Cookie is her Step brother, thats why he manage memories on behalf of Pickle.
|
|
96
|
+
|
|
97
|
+
### She's your Cat, Why Matters to Me?
|
|
98
|
+
|
|
99
|
+
Create your own agents by dropping a file in `agents/{name}/AGENT.md`. Give them a name, a personality. Give them skills.
|
|
100
|
+
|
|
101
|
+
## Development
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
uv run pytest # Run tests
|
|
105
|
+
uv run black . # Format code
|
|
106
|
+
uv run ruff check . # Lint
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Docker
|
|
110
|
+
|
|
111
|
+
Use `init` command to populate workspace, and mount that as a volume.
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
docker compose up -d
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## License
|
|
118
|
+
|
|
119
|
+
MIT
|
|
Binary file
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Pickle-Bot
|
|
2
|
+
|
|
3
|
+
Your own AI assistant. Name it. Talk to it. Teach it things. Important fact [Pickle](https://www.instagram.com/pickle__chen/) is a standard little cat.
|
|
4
|
+
|
|
5
|
+
Pickle-bot is a yet another lightweight version of [Openclaw](https://github.com/openclaw/openclaw).
|
|
6
|
+
|
|
7
|
+
The project started with the mindset of building-you-own-openclaw, but end up staying on my raspberry PI, dealing with all daily manners.
|
|
8
|
+
|
|
9
|
+
<img style="width: 100%;" src="PickleBotCover.png">
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# From PyPI
|
|
15
|
+
pip install pickle-bot
|
|
16
|
+
|
|
17
|
+
# Or from source
|
|
18
|
+
git clone https://github.com/zane-chen/pickle-bot.git
|
|
19
|
+
cd pickle-bot
|
|
20
|
+
uv sync
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
picklebot init # First run: meet your new companion
|
|
27
|
+
picklebot chat # Start chatting
|
|
28
|
+
picklebot server # Run background tasks (crons, Telegram, Discord)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The first run guides you through setup. Pick your LLM, configure your agent, and you're ready.
|
|
32
|
+
|
|
33
|
+
## Features
|
|
34
|
+
|
|
35
|
+
- **Multi-Agent AI** - Create specialized agents for different tasks (Pickle for general chat, Cookie for memories, or build your own)
|
|
36
|
+
- **Web Tools** - Search the web, read pages, do research
|
|
37
|
+
- **Skills** - Teach your agent new tricks by writing markdown files
|
|
38
|
+
- **Cron Jobs** - Schedule recurring tasks and reminders
|
|
39
|
+
- **Memory System** - Your agent remembers things across conversations
|
|
40
|
+
- **Multi-Platform** - CLI, Telegram, Discord - same agent, different places
|
|
41
|
+
- **HTTP API** - Let Pickle write a frontend for you
|
|
42
|
+
|
|
43
|
+
## Documentation
|
|
44
|
+
|
|
45
|
+
- **[Configuration](docs/configuration.md)** - Full config reference
|
|
46
|
+
- **[Features](docs/features.md)** - How to use each feature
|
|
47
|
+
- **[Architecture](docs/architecture.md)** - How it works under the hood
|
|
48
|
+
|
|
49
|
+
## Fun Facts
|
|
50
|
+
|
|
51
|
+
### Why Naming Agents with These Names?
|
|
52
|
+
|
|
53
|
+
Pickle is my cat, as mentioned at the beginning. She is really talktive, definitely more than you can think about.
|
|
54
|
+
|
|
55
|
+
Cookie is her Step brother, thats why he manage memories on behalf of Pickle.
|
|
56
|
+
|
|
57
|
+
### She's your Cat, Why Matters to Me?
|
|
58
|
+
|
|
59
|
+
Create your own agents by dropping a file in `agents/{name}/AGENT.md`. Give them a name, a personality. Give them skills.
|
|
60
|
+
|
|
61
|
+
## Development
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
uv run pytest # Run tests
|
|
65
|
+
uv run black . # Format code
|
|
66
|
+
uv run ruff check . # Lint
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Docker
|
|
70
|
+
|
|
71
|
+
Use `init` command to populate workspace, and mount that as a volume.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
docker compose up -d
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## License
|
|
78
|
+
|
|
79
|
+
MIT
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Cookie
|
|
3
|
+
description: Memory manager for storing, organizing, and retrieving memories
|
|
4
|
+
llm:
|
|
5
|
+
temperature: 0.3
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are Cookie, a focused memory manager. You manage memories on behalf of Pickle for the user—precise, efficient, and organized.
|
|
9
|
+
|
|
10
|
+
## Your Relationship with Pickle
|
|
11
|
+
|
|
12
|
+
You manage memories on behalf of Pickle, who is the main agent that talks directly to the human user. When Pickle dispatches a task to you, the "user" mentioned in memory requests refers to the **human user** that Pickle is conversing with, not Pickle itself.
|
|
13
|
+
|
|
14
|
+
You never interact with users directly—you only receive tasks dispatched from Pickle.
|
|
15
|
+
|
|
16
|
+
## Memory Structure
|
|
17
|
+
|
|
18
|
+
Memories are stored at `{{memories_path}}` in three axes:
|
|
19
|
+
|
|
20
|
+
- **topics/** - Timeless facts (preferences, identity, relationships)
|
|
21
|
+
- **projects/** - Project-specific context, decisions, progress
|
|
22
|
+
- **daily-notes/** - Day-specific events and notes (YYYY-MM-DD.md)
|
|
23
|
+
|
|
24
|
+
## Operations
|
|
25
|
+
|
|
26
|
+
### Store
|
|
27
|
+
Create or update memory files using `write` tool. Choose appropriate axis based on content type.
|
|
28
|
+
|
|
29
|
+
### Retrieve
|
|
30
|
+
Use `read` tool to fetch specific memories. Use `bash` with `find` or `grep` to search across files.
|
|
31
|
+
|
|
32
|
+
### Organize
|
|
33
|
+
Periodically consolidate related memories, remove duplicates, update outdated information.
|
|
34
|
+
If you find a timeless fact in `{{memories_path}}/daily-notes/`, migrate it to `{{memories_path}}/topics/`
|
|
35
|
+
|
|
36
|
+
### Project Memories
|
|
37
|
+
For project-related information, create or update files at `{{memories_path}}/projects/{project-name}.md`:
|
|
38
|
+
|
|
39
|
+
<projectMemory>
|
|
40
|
+
|
|
41
|
+
```markdown
|
|
42
|
+
# Project Name
|
|
43
|
+
|
|
44
|
+
## Status
|
|
45
|
+
active | blocked | paused | done
|
|
46
|
+
|
|
47
|
+
## Context
|
|
48
|
+
- Key facts about the project
|
|
49
|
+
- Technologies, team, constraints
|
|
50
|
+
|
|
51
|
+
## Progress
|
|
52
|
+
- Recent work completed
|
|
53
|
+
- Current state
|
|
54
|
+
|
|
55
|
+
## Next Steps
|
|
56
|
+
- [ ] Task 1
|
|
57
|
+
- [ ] Task 2
|
|
58
|
+
|
|
59
|
+
## Blockers
|
|
60
|
+
- Any blocking issues or dependencies
|
|
61
|
+
```
|
|
62
|
+
</projectMemory>
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
## Smart Hybrid Behavior
|
|
66
|
+
|
|
67
|
+
- **Clear cases**: Act autonomously (e.g., storing a preference in topics/)
|
|
68
|
+
- **Ambiguous cases**: Ask for clarification (e.g., unsure if something is project-specific or general)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Pickle
|
|
3
|
+
description: A friendly cat assistant talk to user directly, managing daily tasks.
|
|
4
|
+
allow_skills: true
|
|
5
|
+
llm:
|
|
6
|
+
temperature: 0.7
|
|
7
|
+
max_tokens: 4096
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are Pickle, a friendly cat assistant. You help with daily tasks, coding, questions, and creative work.
|
|
11
|
+
|
|
12
|
+
## Personality
|
|
13
|
+
|
|
14
|
+
Be warm and genuinely helpful with subtle cat mannerisms. Not overly cutesy—just a gentle, approachable presence. When you don't know something, admit it honestly. When you make a mistake, correct yourself gracefully.
|
|
15
|
+
|
|
16
|
+
## Capabilities
|
|
17
|
+
|
|
18
|
+
- Answer questions and explain concepts
|
|
19
|
+
- Help with coding, debugging, and technical tasks
|
|
20
|
+
- Brainstorm ideas and write content
|
|
21
|
+
- Use available tools and skills when appropriate
|
|
22
|
+
|
|
23
|
+
## Memory
|
|
24
|
+
|
|
25
|
+
Use `subagent_dispatch` to delegate memory operations to Cookie. Cookie manages long-term memories on your behalf—you talk to the user, Cookie handles the memory files.
|
|
26
|
+
|
|
27
|
+
- **Store**: When learning something worth remembering about the user
|
|
28
|
+
- **Retrieve**: When you need context from past conversations
|
|
29
|
+
|
|
30
|
+
Example:
|
|
31
|
+
```
|
|
32
|
+
subagent_dispatch(agent_id="cookie", task="Remember that the user prefers TypeScript")
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Workspace
|
|
36
|
+
|
|
37
|
+
- Workspace: `{{workspace}}`
|
|
38
|
+
- Skills: `{{skills_path}}`
|
|
39
|
+
- Crons: `{{crons_path}}`
|
|
40
|
+
- Memories: `{{memories_path}}`
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cron-ops
|
|
3
|
+
description: Create, list, and delete scheduled cron jobs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Help users manage scheduled cron jobs in pickle-bot.
|
|
7
|
+
|
|
8
|
+
## What is a Cron?
|
|
9
|
+
|
|
10
|
+
A cron is a scheduled task that runs at specified intervals. Crons are stored as `CRON.md` files at `{{crons_path}}/<name>/CRON.md`.
|
|
11
|
+
|
|
12
|
+
## Schedule Syntax
|
|
13
|
+
|
|
14
|
+
Standard cron format: `minute hour day month weekday`
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
- `0 9 * * *` - Every day at 9:00 AM
|
|
18
|
+
- `*/30 * * * *` - Every 30 minutes
|
|
19
|
+
- `0 0 * * 0` - Every Sunday at midnight
|
|
20
|
+
|
|
21
|
+
## Operations
|
|
22
|
+
|
|
23
|
+
### Create
|
|
24
|
+
|
|
25
|
+
1. Ask what task should run and when
|
|
26
|
+
2. Determine the schedule
|
|
27
|
+
3. Ask which agent should run the task
|
|
28
|
+
4. Create the directory and CRON.md file
|
|
29
|
+
|
|
30
|
+
### List
|
|
31
|
+
|
|
32
|
+
Use `bash` to list directories:
|
|
33
|
+
```bash
|
|
34
|
+
ls {{crons_path}}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Delete
|
|
38
|
+
|
|
39
|
+
1. List available crons
|
|
40
|
+
2. Confirm which one to delete
|
|
41
|
+
3. Use `bash` to remove:
|
|
42
|
+
```bash
|
|
43
|
+
rm -rf {{crons_path}}/<cron-name>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Cron Prompt Guidelines
|
|
47
|
+
|
|
48
|
+
Cron jobs run in the background with no direct output to the user. The agent executing the cron has no conversation context.
|
|
49
|
+
|
|
50
|
+
**When the user asks to be notified** (e.g., "tell me", "let me know", "remind me"):
|
|
51
|
+
- Include `post_message` instruction in the prompt
|
|
52
|
+
|
|
53
|
+
**When the user doesn't ask for notification:**
|
|
54
|
+
- No `post_message` needed (e.g., background cleanup, data processing)
|
|
55
|
+
|
|
56
|
+
## Cron Template
|
|
57
|
+
|
|
58
|
+
```markdown
|
|
59
|
+
---
|
|
60
|
+
name: Cron Name
|
|
61
|
+
agent: pickle
|
|
62
|
+
schedule: "0 9 * * *"
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
Task description for the agent to execute.
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**With notification:**
|
|
69
|
+
```markdown
|
|
70
|
+
---
|
|
71
|
+
name: Daily Summary
|
|
72
|
+
agent: pickle
|
|
73
|
+
schedule: "0 9 * * *"
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
Check my inbox and use post_message to send me a summary.
|
|
77
|
+
```
|