openocto-dev 0.1.0__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.
- openocto_dev-0.1.0/.gitignore +49 -0
- openocto_dev-0.1.0/BRAND.md +17 -0
- openocto_dev-0.1.0/CONTRIBUTING.md +32 -0
- openocto_dev-0.1.0/LICENSE.md +74 -0
- openocto_dev-0.1.0/PKG-INFO +311 -0
- openocto_dev-0.1.0/README.md +276 -0
- openocto_dev-0.1.0/config/default.yaml +114 -0
- openocto_dev-0.1.0/docs/openocto-architecture.md +973 -0
- openocto_dev-0.1.0/docs/openocto-vision.md +629 -0
- openocto_dev-0.1.0/openocto/__init__.py +3 -0
- openocto_dev-0.1.0/openocto/__main__.py +128 -0
- openocto_dev-0.1.0/openocto/ai/__init__.py +0 -0
- openocto_dev-0.1.0/openocto/ai/base.py +44 -0
- openocto_dev-0.1.0/openocto/ai/claude.py +60 -0
- openocto_dev-0.1.0/openocto/ai/openai_compat.py +88 -0
- openocto_dev-0.1.0/openocto/ai/router.py +124 -0
- openocto_dev-0.1.0/openocto/app.py +554 -0
- openocto_dev-0.1.0/openocto/audio/__init__.py +0 -0
- openocto_dev-0.1.0/openocto/audio/capture.py +188 -0
- openocto_dev-0.1.0/openocto/audio/player.py +89 -0
- openocto_dev-0.1.0/openocto/config.py +190 -0
- openocto_dev-0.1.0/openocto/event_bus.py +66 -0
- openocto_dev-0.1.0/openocto/history.py +456 -0
- openocto_dev-0.1.0/openocto/memory.py +370 -0
- openocto_dev-0.1.0/openocto/persona/__init__.py +0 -0
- openocto_dev-0.1.0/openocto/persona/manager.py +124 -0
- openocto_dev-0.1.0/openocto/search.py +109 -0
- openocto_dev-0.1.0/openocto/setup_wizard.py +797 -0
- openocto_dev-0.1.0/openocto/state_machine.py +78 -0
- openocto_dev-0.1.0/openocto/stt/__init__.py +0 -0
- openocto_dev-0.1.0/openocto/stt/base.py +32 -0
- openocto_dev-0.1.0/openocto/stt/whisper_cpp.py +111 -0
- openocto_dev-0.1.0/openocto/tts/__init__.py +0 -0
- openocto_dev-0.1.0/openocto/tts/base.py +29 -0
- openocto_dev-0.1.0/openocto/tts/factory.py +32 -0
- openocto_dev-0.1.0/openocto/tts/piper.py +99 -0
- openocto_dev-0.1.0/openocto/tts/silero.py +63 -0
- openocto_dev-0.1.0/openocto/utils/__init__.py +0 -0
- openocto_dev-0.1.0/openocto/utils/keyboard.py +87 -0
- openocto_dev-0.1.0/openocto/utils/model_downloader.py +271 -0
- openocto_dev-0.1.0/openocto/utils/proxy.py +75 -0
- openocto_dev-0.1.0/openocto/vad/__init__.py +0 -0
- openocto_dev-0.1.0/openocto/vad/base.py +22 -0
- openocto_dev-0.1.0/openocto/vad/silero.py +123 -0
- openocto_dev-0.1.0/openocto/wakeword/__init__.py +0 -0
- openocto_dev-0.1.0/openocto/wakeword/base.py +22 -0
- openocto_dev-0.1.0/openocto/wakeword/openwakeword.py +111 -0
- openocto_dev-0.1.0/personas/octo/persona.yaml +20 -0
- openocto_dev-0.1.0/personas/octo/system_prompt.md +10 -0
- openocto_dev-0.1.0/pyproject.toml +58 -0
- openocto_dev-0.1.0/scripts/install.ps1 +127 -0
- openocto_dev-0.1.0/scripts/install.sh +175 -0
- openocto_dev-0.1.0/tests/__init__.py +0 -0
- openocto_dev-0.1.0/tests/test_ai_router.py +119 -0
- openocto_dev-0.1.0/tests/test_config.py +105 -0
- openocto_dev-0.1.0/tests/test_event_bus.py +68 -0
- openocto_dev-0.1.0/tests/test_history.py +204 -0
- openocto_dev-0.1.0/tests/test_memory.py +475 -0
- openocto_dev-0.1.0/tests/test_persona.py +118 -0
- openocto_dev-0.1.0/tests/test_search.py +102 -0
- openocto_dev-0.1.0/tests/test_state_machine.py +104 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
### macOS
|
|
2
|
+
.DS_Store
|
|
3
|
+
._*
|
|
4
|
+
Icon
|
|
5
|
+
.DocumentRevisions-V100
|
|
6
|
+
.fseventsd
|
|
7
|
+
.Spotlight-V100
|
|
8
|
+
.TemporaryItems
|
|
9
|
+
.Trashes
|
|
10
|
+
.VolumeIcon.icns
|
|
11
|
+
.com.apple.timemachine.donotpresent
|
|
12
|
+
|
|
13
|
+
### Python
|
|
14
|
+
__pycache__/
|
|
15
|
+
*.py[cod]
|
|
16
|
+
*$py.class
|
|
17
|
+
*.egg-info/
|
|
18
|
+
*.egg
|
|
19
|
+
dist/
|
|
20
|
+
build/
|
|
21
|
+
.eggs/
|
|
22
|
+
*.so
|
|
23
|
+
.venv/
|
|
24
|
+
venv/
|
|
25
|
+
env/
|
|
26
|
+
|
|
27
|
+
### Testing
|
|
28
|
+
.pytest_cache/
|
|
29
|
+
.coverage
|
|
30
|
+
htmlcov/
|
|
31
|
+
|
|
32
|
+
### IDE
|
|
33
|
+
.idea/
|
|
34
|
+
.vscode/
|
|
35
|
+
*.swp
|
|
36
|
+
*.swo
|
|
37
|
+
|
|
38
|
+
### Project
|
|
39
|
+
models/
|
|
40
|
+
*.onnx
|
|
41
|
+
*.bin
|
|
42
|
+
*.ggml
|
|
43
|
+
|
|
44
|
+
### Secrets
|
|
45
|
+
.env
|
|
46
|
+
config/local.yaml
|
|
47
|
+
|
|
48
|
+
.claude
|
|
49
|
+
CLAUDE.md
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# OpenOcto Brand Guidelines
|
|
2
|
+
|
|
3
|
+
The OpenOcto name, logo (octopus with coral glasses),
|
|
4
|
+
and persona character designs (Hestia, Metis, Nestor,
|
|
5
|
+
Sofia, Argus, Octo) are proprietary assets of Rocket Dev.
|
|
6
|
+
|
|
7
|
+
## What you CAN do:
|
|
8
|
+
- Use the OpenOcto name to refer to the project
|
|
9
|
+
- Use the logo in articles/reviews about OpenOcto
|
|
10
|
+
- Create fan art for non-commercial purposes
|
|
11
|
+
|
|
12
|
+
## What REQUIRES permission:
|
|
13
|
+
- Selling merchandise with OpenOcto branding
|
|
14
|
+
- Using OpenOcto characters in commercial products
|
|
15
|
+
- Modifying the logo for commercial use
|
|
16
|
+
|
|
17
|
+
Contact: info@openocto.dev
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Contributing to OpenOcto
|
|
2
|
+
|
|
3
|
+
We welcome contributions!
|
|
4
|
+
|
|
5
|
+
## Before Your First PR
|
|
6
|
+
|
|
7
|
+
By submitting a pull request, you agree that:
|
|
8
|
+
|
|
9
|
+
1. Your contribution is your original work
|
|
10
|
+
2. You grant OpenOcto project the right to use, modify,
|
|
11
|
+
and distribute your contribution under the project's
|
|
12
|
+
BSL 1.1 license and any future license chosen
|
|
13
|
+
by the project maintainer
|
|
14
|
+
3. You grant the project maintainer the right to
|
|
15
|
+
relicense your contribution (including for
|
|
16
|
+
commercial licensing)
|
|
17
|
+
4. You understand this grant is irrevocable
|
|
18
|
+
|
|
19
|
+
This is a standard Contributor License Agreement (CLA)
|
|
20
|
+
used by many open-source projects to ensure the project
|
|
21
|
+
can be maintained and distributed consistently.
|
|
22
|
+
|
|
23
|
+
## How to Contribute
|
|
24
|
+
|
|
25
|
+
1. Fork the repository
|
|
26
|
+
2. Create a feature branch
|
|
27
|
+
3. Make your changes
|
|
28
|
+
4. Submit a pull request
|
|
29
|
+
|
|
30
|
+
## Questions?
|
|
31
|
+
|
|
32
|
+
Contact: info@openocto.dev
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Business Source License 1.1
|
|
2
|
+
|
|
3
|
+
**Parameters**
|
|
4
|
+
|
|
5
|
+
| Parameter | Value |
|
|
6
|
+
|-----------|-------|
|
|
7
|
+
| **Licensor** | Rocket Dev (rocketdev.tech) |
|
|
8
|
+
| **Licensed Work** | OpenOcto — open-source personal AI assistant constructor with voice control and persona system |
|
|
9
|
+
| **Additional Use Grant** | You may use the Licensed Work for non-commercial and personal purposes, including self-hosting for private use, internal use within an organization (not offered as a service to third parties), educational use, research, and contributing to the project (including creating forks for non-commercial purposes). A commercial license from the Licensor is required if you: (a) offer the Licensed Work as a commercial product or paid service to third parties; (b) offer the Licensed Work as a hosted or managed service (SaaS); (c) embed the Licensed Work in commercial hardware or appliances for sale. |
|
|
10
|
+
| **Change Date** | 2030-03-30 |
|
|
11
|
+
| **Change License** | Apache License, Version 2.0 |
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Terms
|
|
16
|
+
|
|
17
|
+
The Licensor hereby grants you the right to copy, modify, create derivative works, redistribute, and make non-production use of the Licensed Work. The Licensor may make an Additional Use Grant, above, permitting limited production use.
|
|
18
|
+
|
|
19
|
+
Effective on the Change Date, or the fourth anniversary of the first publicly available distribution of a specific version of the Licensed Work under this License, whichever comes first, the Licensor hereby grants you rights under the terms of the Change License, and the rights granted in the paragraph above terminate.
|
|
20
|
+
|
|
21
|
+
If your use of the Licensed Work does not comply with the requirements currently in effect as described in this License, you must purchase a commercial license from the Licensor, its affiliated entities, or authorized resellers, or you must refrain from using the Licensed Work.
|
|
22
|
+
|
|
23
|
+
All copies of the original and modified Licensed Work, and derivative works of the Licensed Work, are subject to this License. This License applies separately for each version of the Licensed Work and the Change Date may vary for each version of the Licensed Work released by Licensor.
|
|
24
|
+
|
|
25
|
+
You must conspicuously display this License on each original or modified copy of the Licensed Work. If you receive the Licensed Work in original or modified form from a third party, the terms and conditions set forth in this License apply to your use of that work.
|
|
26
|
+
|
|
27
|
+
Any use of the Licensed Work in violation of this License will automatically terminate your rights under this License for the current and all other versions of the Licensed Work.
|
|
28
|
+
|
|
29
|
+
This License does not grant you any right in any trademark or logo of Licensor or its affiliates (provided that you may use a trademark or logo of Licensor as expressly required by this License).
|
|
30
|
+
|
|
31
|
+
TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND TITLE.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Covenants of Licensor
|
|
36
|
+
|
|
37
|
+
In consideration of the right to use this License's text and the "Business Source License" name and trademark, Licensor covenants to MariaDB, and to all other recipients of the licensed work to be provided by Licensor:
|
|
38
|
+
|
|
39
|
+
1. To specify as the Change License the Apache License, Version 2.0, or a license that is compatible with GPL Version 2.0 or a later version, where "compatible" means that software provided under the Change License can be included in a program with software provided under GPL Version 2.0 or a later version. Licensor may specify additional Change Licenses without limitation.
|
|
40
|
+
|
|
41
|
+
2. To either: (a) specify an additional grant of rights to use that does not impose any additional restriction on the right granted in this License, as the Additional Use Grant; or (b) insert the text "None" to specify a Change Date.
|
|
42
|
+
|
|
43
|
+
3. Not to modify this License in any other way.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Notice
|
|
48
|
+
|
|
49
|
+
The Business Source License (this document, or the "License") is not an Open Source license. However, the Licensed Work will eventually be made available under an Open Source License, as stated in this License.
|
|
50
|
+
|
|
51
|
+
License text copyright © 2024 MariaDB plc, All Rights Reserved. "Business Source License" is a trademark of MariaDB plc.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Summary (not part of the license)
|
|
56
|
+
|
|
57
|
+
**What you CAN do:**
|
|
58
|
+
- ✅ Use OpenOcto for personal and non-commercial purposes
|
|
59
|
+
- ✅ Self-host for private use at home
|
|
60
|
+
- ✅ Use within a company or organization for internal purposes (not offered to third parties)
|
|
61
|
+
- ✅ Use for education and research
|
|
62
|
+
- ✅ Copy, modify, fork, and create derivative works for non-commercial purposes
|
|
63
|
+
- ✅ Contribute to the project
|
|
64
|
+
|
|
65
|
+
**What REQUIRES a commercial license:**
|
|
66
|
+
- 💼 Offering OpenOcto as part of a commercial product or paid service to third parties
|
|
67
|
+
- 💼 Offering OpenOcto as a hosted or managed service (SaaS)
|
|
68
|
+
- 💼 Embedding OpenOcto in commercial hardware or appliances for sale
|
|
69
|
+
|
|
70
|
+
**After the Change Date (2030-03-30):**
|
|
71
|
+
- 🔓 The code becomes available under the Apache License 2.0
|
|
72
|
+
- 🔓 All restrictions above are removed for that version
|
|
73
|
+
|
|
74
|
+
**Commercial licensing inquiries:** [info@openocto.dev](mailto:info@openocto.dev)
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: openocto-dev
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Open-source personal AI assistant constructor with voice control and persona system
|
|
5
|
+
Author-email: Rocket Dev <hello@rocketdev.io>
|
|
6
|
+
License: BSL-1.1
|
|
7
|
+
License-File: LICENSE.md
|
|
8
|
+
Requires-Python: >=3.10
|
|
9
|
+
Requires-Dist: anthropic>=0.40
|
|
10
|
+
Requires-Dist: click>=8.0
|
|
11
|
+
Requires-Dist: numpy>=1.24
|
|
12
|
+
Requires-Dist: onnxruntime>=1.16
|
|
13
|
+
Requires-Dist: openai>=1.0
|
|
14
|
+
Requires-Dist: piper-tts>=1.2.0
|
|
15
|
+
Requires-Dist: pydantic>=2.0
|
|
16
|
+
Requires-Dist: pynput>=1.7
|
|
17
|
+
Requires-Dist: pywhispercpp>=1.2.0
|
|
18
|
+
Requires-Dist: pyyaml>=6.0
|
|
19
|
+
Requires-Dist: questionary>=2.0
|
|
20
|
+
Requires-Dist: requests>=2.28
|
|
21
|
+
Requires-Dist: silero-vad>=6.0
|
|
22
|
+
Requires-Dist: sounddevice>=0.4.6
|
|
23
|
+
Requires-Dist: tqdm>=4.64
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: pytest-asyncio>=0.21; extra == 'dev'
|
|
26
|
+
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
27
|
+
Provides-Extra: search
|
|
28
|
+
Requires-Dist: fastembed>=0.3; extra == 'search'
|
|
29
|
+
Requires-Dist: sqlite-vec>=0.1; extra == 'search'
|
|
30
|
+
Provides-Extra: silero
|
|
31
|
+
Requires-Dist: torch>=2.0; extra == 'silero'
|
|
32
|
+
Provides-Extra: wakeword
|
|
33
|
+
Requires-Dist: openwakeword>=0.6.0; extra == 'wakeword'
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
# OpenOcto 🐙
|
|
37
|
+
|
|
38
|
+
Open-source personal AI assistant constructor with voice control and persona system.
|
|
39
|
+
|
|
40
|
+
> Hold [Space] → speak → get a voice response. Fully local audio processing. Your voice never leaves the device.
|
|
41
|
+
> Wake word detection ("Hey Hestia") coming in Phase 2.
|
|
42
|
+
|
|
43
|
+
## Features
|
|
44
|
+
|
|
45
|
+
- **Push-to-talk** voice input (hold Space)
|
|
46
|
+
- **Local STT** via [whisper.cpp](https://github.com/ggerganov/whisper.cpp) — auto-detects language (30+ languages supported)
|
|
47
|
+
- **Local TTS** via [piper-tts](https://github.com/rhasspy/piper) — natural voices in English, Spanish, French, and more
|
|
48
|
+
- **Pluggable AI backends** — Claude (native API), Claude Max Proxy (use your subscription), OpenAI, and any OpenAI-compatible provider
|
|
49
|
+
- **Persona system** — character, voice, and system prompt as a single package
|
|
50
|
+
- Cross-platform: macOS, Linux, Windows
|
|
51
|
+
|
|
52
|
+
## Quick Start
|
|
53
|
+
|
|
54
|
+
One command to install, configure, and download models:
|
|
55
|
+
|
|
56
|
+
**macOS / Linux:**
|
|
57
|
+
```bash
|
|
58
|
+
curl -sSL https://raw.githubusercontent.com/openocto-dev/openocto/main/scripts/install.sh | bash
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Windows (PowerShell):**
|
|
62
|
+
```powershell
|
|
63
|
+
irm https://raw.githubusercontent.com/openocto-dev/openocto/main/scripts/install.ps1 | iex
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Already cloned the repo?** Same script works locally:
|
|
67
|
+
```bash
|
|
68
|
+
./scripts/install.sh # macOS / Linux
|
|
69
|
+
.\scripts\install.ps1 # Windows
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
The installer automatically detects whether you're inside the project or need to clone it, then:
|
|
73
|
+
1. Creates a virtual environment and installs dependencies
|
|
74
|
+
2. Launches the **setup wizard** — choose AI backend, enter API key, download models
|
|
75
|
+
|
|
76
|
+
After setup:
|
|
77
|
+
```bash
|
|
78
|
+
openocto start
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
> **macOS:** If prompted, grant microphone access and Accessibility permissions to your terminal app (System Settings → Privacy & Security).
|
|
82
|
+
|
|
83
|
+
## Usage
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
🐙 OpenOcto v0.1.0 | Persona: Octo | AI: claude
|
|
87
|
+
Hold [Space] to speak, [Ctrl+C] to quit
|
|
88
|
+
|
|
89
|
+
You [en]: What's the capital of France?
|
|
90
|
+
Octo: The capital of France is Paris.
|
|
91
|
+
|
|
92
|
+
You [en]: What's the weather like in Tokyo?
|
|
93
|
+
Octo: I don't have access to real-time weather data, but you can check weather.com or ask me anything else.
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### CLI Commands
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
openocto start # start assistant (auto-selects user if only one)
|
|
100
|
+
openocto start --user Dmitry # start as a specific user (skips prompt)
|
|
101
|
+
openocto start --persona octo # specify persona
|
|
102
|
+
openocto start --ai claude-proxy # use Claude subscription (via proxy)
|
|
103
|
+
openocto start --ai openai # use OpenAI
|
|
104
|
+
openocto setup # re-run the setup wizard
|
|
105
|
+
openocto config show # show resolved configuration
|
|
106
|
+
openocto --version
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### Multi-user
|
|
110
|
+
|
|
111
|
+
If multiple users are set up, `openocto start` will prompt you to choose:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
👤 Multiple users — who are you?
|
|
115
|
+
1. Dmitry (last active)
|
|
116
|
+
2. Anna
|
|
117
|
+
|
|
118
|
+
Enter number [1]:
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
To skip the prompt, pass `--user`:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
openocto start --user Anna
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Each user has their own conversation history per persona.
|
|
128
|
+
|
|
129
|
+
## Requirements
|
|
130
|
+
|
|
131
|
+
- Python 3.10+
|
|
132
|
+
- macOS (Apple Silicon or Intel), Linux, or Windows
|
|
133
|
+
- Microphone and speakers
|
|
134
|
+
|
|
135
|
+
## Configuration
|
|
136
|
+
|
|
137
|
+
OpenOcto looks for configuration in this order:
|
|
138
|
+
1. `config/default.yaml` (built-in defaults)
|
|
139
|
+
2. `~/.openocto/config.yaml` (your overrides — created by `openocto setup`)
|
|
140
|
+
3. Environment variables (`${ANTHROPIC_API_KEY}`, etc.)
|
|
141
|
+
4. CLI flags
|
|
142
|
+
|
|
143
|
+
Example `~/.openocto/config.yaml`:
|
|
144
|
+
|
|
145
|
+
```yaml
|
|
146
|
+
persona: "octo"
|
|
147
|
+
|
|
148
|
+
ai:
|
|
149
|
+
default_backend: "claude"
|
|
150
|
+
claude:
|
|
151
|
+
model: "claude-opus-4-6"
|
|
152
|
+
|
|
153
|
+
stt:
|
|
154
|
+
model_size: "medium" # better accuracy on Apple Silicon M4
|
|
155
|
+
|
|
156
|
+
tts:
|
|
157
|
+
models:
|
|
158
|
+
en: "en_US-amy-medium"
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### AI Backends
|
|
162
|
+
|
|
163
|
+
| Backend | Config key | API Key | Notes |
|
|
164
|
+
|---------|-----------|---------|-------|
|
|
165
|
+
| Claude (Anthropic API) | `claude` | `ANTHROPIC_API_KEY` | Native SDK, default |
|
|
166
|
+
| Claude Max Proxy | `claude-proxy` | Not needed | Uses Claude subscription |
|
|
167
|
+
| OpenAI | `openai` | `OPENAI_API_KEY` | OpenAI-compatible |
|
|
168
|
+
| Z.AI | `zai` | `ZAI_API_KEY` | OpenAI-compatible |
|
|
169
|
+
|
|
170
|
+
#### Claude Max Proxy (use your Claude subscription)
|
|
171
|
+
|
|
172
|
+
If you have a Claude Pro/Max subscription, you can use it instead of an API key:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# Install and start the proxy (requires Claude Code CLI to be authenticated)
|
|
176
|
+
npx claude-max-proxy
|
|
177
|
+
|
|
178
|
+
# In another terminal
|
|
179
|
+
openocto start --ai claude-proxy
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
The proxy runs at `http://localhost:3456/v1` and bridges OpenAI-format requests through your authenticated Claude session.
|
|
183
|
+
|
|
184
|
+
#### Adding custom providers
|
|
185
|
+
|
|
186
|
+
Any OpenAI-compatible provider can be added in `~/.openocto/config.yaml`:
|
|
187
|
+
|
|
188
|
+
```yaml
|
|
189
|
+
ai:
|
|
190
|
+
default_backend: "gemini"
|
|
191
|
+
providers:
|
|
192
|
+
gemini:
|
|
193
|
+
api_key: "${GEMINI_API_KEY}"
|
|
194
|
+
model: "gemini-2.5-pro"
|
|
195
|
+
base_url: "https://generativelanguage.googleapis.com/v1beta/openai"
|
|
196
|
+
|
|
197
|
+
deepseek:
|
|
198
|
+
api_key: "${DEEPSEEK_API_KEY}"
|
|
199
|
+
model: "deepseek-chat"
|
|
200
|
+
base_url: "https://api.deepseek.com/v1"
|
|
201
|
+
|
|
202
|
+
ollama:
|
|
203
|
+
model: "llama3:8b"
|
|
204
|
+
base_url: "http://localhost:11434/v1"
|
|
205
|
+
no_auth: true # local services don't need an API key
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Whisper Models
|
|
209
|
+
|
|
210
|
+
| Model | Size | Speed (M2) | Accuracy |
|
|
211
|
+
|-------|------|------------|----------|
|
|
212
|
+
| `tiny` | 75MB | Very fast | Low |
|
|
213
|
+
| `base` | 142MB | Fast | Medium |
|
|
214
|
+
| `small` | 466MB | ~2s/10s audio | Good (default) |
|
|
215
|
+
| `medium` | 1.5GB | ~3s/10s audio | High |
|
|
216
|
+
|
|
217
|
+
## Personas
|
|
218
|
+
|
|
219
|
+
Personas live in the `personas/` directory. Each persona is a folder with:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
personas/
|
|
223
|
+
└── octo/
|
|
224
|
+
├── persona.yaml # name, voice config, personality
|
|
225
|
+
└── system_prompt.md # instructions for the AI
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Creating a Custom Persona
|
|
229
|
+
|
|
230
|
+
```yaml
|
|
231
|
+
# personas/mypersona/persona.yaml
|
|
232
|
+
name: "mypersona"
|
|
233
|
+
display_name: "My Persona"
|
|
234
|
+
description: "My custom assistant"
|
|
235
|
+
|
|
236
|
+
voice:
|
|
237
|
+
engine: "piper"
|
|
238
|
+
models:
|
|
239
|
+
en: "en_US-amy-medium"
|
|
240
|
+
length_scale: 1.0
|
|
241
|
+
|
|
242
|
+
personality:
|
|
243
|
+
tone: "friendly" # warm, professional, playful, serious
|
|
244
|
+
verbosity: "balanced" # brief, balanced, detailed
|
|
245
|
+
formality: "informal" # formal, informal, casual
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
```markdown
|
|
249
|
+
<!-- personas/mypersona/system_prompt.md -->
|
|
250
|
+
You are [Name], a helpful assistant.
|
|
251
|
+
Always respond in the same language the user speaks.
|
|
252
|
+
Keep responses concise — they will be spoken aloud.
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
openocto start --persona mypersona
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Testing the Microphone
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
openocto test mic
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Development
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
pip install -e ".[dev]"
|
|
269
|
+
python -m pytest tests/ -v
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## Project Structure
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
openocto/
|
|
276
|
+
├── openocto/
|
|
277
|
+
│ ├── app.py # Main orchestrator
|
|
278
|
+
│ ├── config.py # Configuration loader (Pydantic)
|
|
279
|
+
│ ├── setup_wizard.py # Interactive setup wizard
|
|
280
|
+
│ ├── event_bus.py # Async pub/sub
|
|
281
|
+
│ ├── state_machine.py # Pipeline state machine
|
|
282
|
+
│ ├── audio/ # Capture and playback
|
|
283
|
+
│ ├── stt/ # Speech-to-Text (whisper.cpp)
|
|
284
|
+
│ ├── tts/ # Text-to-Speech (piper-tts)
|
|
285
|
+
│ ├── vad/ # Voice Activity Detection (Silero)
|
|
286
|
+
│ ├── ai/ # AI backends (Claude, OpenAI-compat)
|
|
287
|
+
│ ├── persona/ # Persona loader
|
|
288
|
+
│ └── utils/ # Model downloader, keyboard listener
|
|
289
|
+
├── personas/octo/ # Default persona
|
|
290
|
+
├── config/default.yaml # Default configuration
|
|
291
|
+
├── scripts/
|
|
292
|
+
│ ├── install.sh # macOS/Linux installer
|
|
293
|
+
│ └── install.ps1 # Windows installer
|
|
294
|
+
├── tests/ # Unit tests
|
|
295
|
+
└── pyproject.toml
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## Brand
|
|
299
|
+
|
|
300
|
+
"OpenOcto" name, logo, mascot, and persona character designs
|
|
301
|
+
are trademarks and copyrighted works of the OpenOcto project author.
|
|
302
|
+
All character artwork © 2026 OpenOcto Contributors. All rights reserved.
|
|
303
|
+
See [BRAND.md](BRAND.md) for usage guidelines.
|
|
304
|
+
|
|
305
|
+
## License
|
|
306
|
+
|
|
307
|
+
[Business Source License 1.1](LICENSE.md) — free for personal and non-commercial use. Converts to Apache 2.0 on 2030-03-30.
|
|
308
|
+
|
|
309
|
+
**Website:** [openocto.dev](https://openocto.dev)
|
|
310
|
+
**Author:** [Rocket Dev](https://rocketdev.tech)
|
|
311
|
+
**Maintainer:** Dmitry Rman ([@Dmitry-rman](https://github.com/Dmitry-rman))
|