[pytest]
testpaths = tests
python_files = test_*.py
python_classes = Test*
python_functions = test_*

# Show detailed test information
addopts = -v

# Configure markers
markers =
    unit: marks tests as unit tests (basic functionality tests)
    integration: marks tests that integrate multiple components
    slow: marks tests that are slow to run
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "karhu"
version = "2.0.0"
description = "An AI assistant with PDF processing, web browsing, and speech capabilities"
readme = "README.md"
authors = [{name = "Abderrahman Gaga", email = "agaga@student.hive.fi"}]
license = {text = "Unlicense"}
requires-python = ">=3.8"
keywords = [
    "ai",
    "assistant",
    "chatbot",
    "pdf",
    "web",
    "cli",
    "speech-to-text",
    "text-to-speech",
]
dependencies = [
    "openai==1.72.0",
    "requests==2.32.3",
    "beautifulsoup4==4.13.3",
    "html2text==2024.2.26",
    "fake-useragent==2.1.0",
    "pdfplumber==0.11.6",
    "termcolor==3.0.1",
    "rich==14.0.0",
    "pyyaml==6.0.2",
    "prompt_toolkit==3.0.50",
    "google-cloud-texttospeech==2.25.1",
    "google-cloud-speech==2.31.1",
    "pyaudio==0.2.14",
    "wave==0.0.2",
    "pynput==1.8.1",
]
classifiers = [
    "Development Status :: 4 - Beta",
    "Intended Audience :: Developers",
    "Intended Audience :: End Users/Desktop",
    "License :: OSI Approved :: The Unlicense",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.8",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3.13",
    "Operating System :: OS Independent",
]

[project.scripts]
karhu = "karhu.cli:main"

[tool.setuptools]
package-dir = {"" = "src"}
packages = {find = {where = ["src"], include = ["karhu*"]}}

[tool.setuptools.package-data]
karhu = ["config/*.json", "data/*"]
include README.md
include requirements.txt
include src/karhu/config/*.json
recursive-include src/karhu/data *
# Karhu AI Assistant CLI

Karhu is a powerful command-line AI assistant designed for productivity, research, and creative tasks. It supports file and document processing, web browsing, contextual conversations, speech synthesis, and advanced profile/model management—all from your terminal.

---

## Table of Contents

- [Features](#features)
- [Installation](#installation)
- [Configuration](#configuration)
- [Usage](#usage)
  - [CLI Options](#cli-options)
  - [Interactive Mode](#interactive-mode)
  - [Example Commands](#example-commands)
- [Profiles and Models](#profiles-and-models)
- [Speech and Voice Features](#speech-and-voice-features)
- [Context Management](#context-management)
- [Module Reference](#module-reference)
- [Testing](#testing)
- [Contributing](#contributing)
- [License](#license)

---

## Features

- **File & Document Processing**: Read and process PDF, text, and other files.
- **Web Browsing & Search**: Browse web pages and perform web searches directly from the CLI.
- **Contextual Conversations**: Maintain, save, and manage conversation context for seamless multi-turn interactions.
- **Profile & Model Management**: Switch between AI models and conversational profiles (e.g., coding, creative, academic, therapist).
- **Speech Synthesis & Recognition**: Text-to-speech (TTS) and speech-to-text (STT) support, including multiple voice engines.
- **Interactive Mode**: Chat with Karhu in a conversational loop with command autocompletion and history.
- **Robust Error Handling**: Graceful error messages and recovery for all operations.
- **Extensible**: Modular design for easy addition of new features and integrations.

---

## Installation

1. **Clone the repository:**
   ```bash
   git clone https://github.com/yourusername/karhu-cli.git
   cd karhu-cli
   ```

2. **Install dependencies:**
   ```bash
   pip install -r requirements.txt
   ```
   *(If using a virtual environment, activate it first.)*

3. **(Optional) Install extra system dependencies** for TTS/STT features (see [Speech and Voice Features](#speech-and-voice-features)).

---

## Configuration

Karhu uses JSON configuration files in `src/karhu/config/`:

- **models.json**: Define available AI models and their parameters.
- **profiles.json**: Define conversational profiles (e.g., coding, creative, therapist).
- **system_prompt.json**: Set the default system prompt for the assistant.

You can customize or add new profiles and models by editing these files.

---

## Usage

### CLI Options

Run Karhu from the project root:

```bash
python src/karhu/cli.py [OPTIONS]
```

**Main options:**

- `--query`, `-q <question>`: Ask a direct question.
- `--interactive`, `-i`: Start interactive chat mode.
- `--file`, `-f <path>`: Process a specific file.
- `--files`, `-ff <directory>`: Process all files in a directory.
- `--web`, `-w <url>`: Browse a web page.
- `--search`, `-s <query>`: Perform a web search.
- `--model`, `-m <name>`: Select AI model.
- `--profile`, `-P <name>`: Select conversational profile.
- `--setsprompt <prompt>`: Set a custom system prompt.
- `--save`: Save conversation context.
- `--clear`, `-c`: Clear current context.
- `--list-models`: List available models.
- `--list-profiles`: List available profiles.
- `--voices`: List TTS voices.
- `--kokoro-voices`: List Kokoro TTS voices.
- `--kokoro-blend <indices>`: Blend Kokoro voices.
- `--help-commands`: Show all available commands.

### Interactive Mode

Start with:

```bash
python src/karhu/cli.py --interactive
```

Features:
- Command autocompletion and history.
- All CLI and special commands available as `!command` (see below).

#### Interactive Commands

- `!model [name]` — Switch AI model.
- `!list_models` — List models.
- `!profile [name]` — Switch profile.
- `!list_profiles` — List profiles.
- `!create_profile [name:prompt]` — Create a new profile.
- `!system_prompt` — Show current system prompt.
- `!setsprompt [prompt]` — Set system prompt.
- `!file [path]` — Read a file.
- `!files [directory]` — Read all files in a directory.
- `!browse [url]` — Browse a web page.
- `!search [query]` — Web search.
- `!context_size` — Show context size.
- `!context_info` — Show context details.
- `!optimize_context` — Summarize/optimize context.
- `!search_context [query]` — Search within context.
- `!chunk [id]` — List/retrieve document chunks.
- `!save` — Save conversation.
- `!clear` — Clear context.
- `!clearall` — Clear all context/history.
- `!lazy` — Toggle speech-to-text mode.
- `!speak` — Toggle text-to-speech mode.
- `!voices` — List TTS voices.
- `!voice [index]` — Change TTS voice.
- `!kokoro` — Toggle Kokoro TTS.
- `!kokoro_voices` — List Kokoro voices.
- `!kokoro_voice [index]` — Change Kokoro voice.
- `!kokoro_blend [indices]` — Blend Kokoro voices.
- `!help` — Show help.
- `!quit` — Exit.

### Example Commands

- Process a PDF:
  ```bash
  python src/karhu/cli.py --file path/to/file.pdf
  ```
- Web search:
  ```bash
  python src/karhu/cli.py --search "What is quantum computing?"
  ```
- Switch to therapist profile in interactive mode:
  ```bash
  python src/karhu/cli.py --interactive --profile therapist
  ```

---

## Profiles and Models

Karhu supports multiple AI models (e.g., GPT-4o, Claude, Gemma) and conversational profiles (e.g., coding, creative, academic, therapist, funny, sarcastic, chill). You can switch or create new ones at runtime.

- **List models:** `!list_models`
- **Switch model:** `!model <name>`
- **List profiles:** `!list_profiles`
- **Switch profile:** `!profile <name>`
- **Create profile:** `!create_profile name:prompt`

Profiles are defined in `src/karhu/config/profiles.json`.

---

## Speech and Voice Features

- **Text-to-Speech (TTS):** Use `!speak`, `!voices`, `!voice [index]` to enable and select voices.
- **Kokoro TTS:** Advanced TTS engine with voice blending (`!kokoro`, `!kokoro_voices`, `!kokoro_voice`, `!kokoro_blend`).
- **Speech-to-Text (STT):** Use `!lazy` to toggle speech input mode.

*Note: Some features may require additional system dependencies (e.g., `espeak`, `ffmpeg`, or platform-specific TTS engines).*

---

## Context Management

- **Save context:** `!save`
- **Clear context:** `!clear`
- **Clear all:** `!clearall`
- **Show context size/info:** `!context_size`, `!context_info`
- **Optimize context:** `!optimize_context`
- **Search context:** `!search_context [query]`
- **Chunking:** `!chunk [id]` for large documents

---

## Module Reference

- **ai_assistant.py**: Core assistant logic and LLM interaction.
- **cli.py**: Command-line interface and argument parsing.
- **interactive.py**: Interactive chat mode.
- **model_manager.py**: Model selection and management.
- **profile_manager.py**: Profile selection and management.
- **context_manager.py**: Context storage, retrieval, and optimization.
- **document_processor.py**: File and document parsing.
- **web_browser.py**: Web browsing and search.
- **TextToSpeech.py / SpeechToText.py / kokorotts.py**: Speech synthesis and recognition.
- **Display_help.py**: Command help and documentation.
- **Errors.py**: Error handling and reporting.
- **config_parser.py**: Configuration file parsing.
- **globals.py**: Global state and settings.

---

## Testing

Run all tests with:

```bash
pytest
```

Tests are located in the `tests/` directory and cover core modules and features.

---

## Contributing

1. Fork the repository and create a new branch.
2. Add your feature or fix.
3. Write or update tests as needed.
4. Submit a pull request with a clear description.

---

## License

This project is licensed under the MIT License.

---

For questions or support, please open an issue on GitHub.

## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
.env


# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp

# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp

# Visual Studio 6 technical files
*.ncb
*.aps

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# Visual Studio History (VSHistory) files
.vshistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd

# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace

# Local History for Visual Studio Code
.history/

# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp

# JetBrains Rider
*.sln.iml
.env
google.json

KARHU_API_TYPE=
OPENAI_API_KEY=
GITHUB_TOKEN=""
OLLAMA_BASE_URL=http://192.168.1.69:11434/v1
GOOGLE_APPLICATION_CREDENTIALS=/Users/user/Desktop/keys/google.json