felix-agent-sdk 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.
- felix_agent_sdk-0.1.0/.github/CODEOWNERS +17 -0
- felix_agent_sdk-0.1.0/.github/workflows/ci.yml +56 -0
- felix_agent_sdk-0.1.0/.github/workflows/publish.yml +83 -0
- felix_agent_sdk-0.1.0/.gitignore +50 -0
- felix_agent_sdk-0.1.0/CHANGELOG.md +53 -0
- felix_agent_sdk-0.1.0/CLAUDE.md +114 -0
- felix_agent_sdk-0.1.0/CONTRIBUTING.md +50 -0
- felix_agent_sdk-0.1.0/LICENSE +29 -0
- felix_agent_sdk-0.1.0/PKG-INFO +355 -0
- felix_agent_sdk-0.1.0/README.md +312 -0
- felix_agent_sdk-0.1.0/docs/api/.gitkeep +0 -0
- felix_agent_sdk-0.1.0/examples/01_hello_world.py +34 -0
- felix_agent_sdk-0.1.0/examples/02_research_workflow.py +78 -0
- felix_agent_sdk-0.1.0/examples/03_custom_workflow.py +72 -0
- felix_agent_sdk-0.1.0/examples/04_memory_persistence.py +132 -0
- felix_agent_sdk-0.1.0/examples/05_deep_research_live/README.md +128 -0
- felix_agent_sdk-0.1.0/examples/05_deep_research_live/__init__.py +0 -0
- felix_agent_sdk-0.1.0/examples/05_deep_research_live/_mock_research.py +257 -0
- felix_agent_sdk-0.1.0/examples/05_deep_research_live/helix_visualizer.py +419 -0
- felix_agent_sdk-0.1.0/examples/05_deep_research_live/run.py +376 -0
- felix_agent_sdk-0.1.0/examples/_mock.py +41 -0
- felix_agent_sdk-0.1.0/pyproject.toml +72 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/__init__.py +71 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/_version.py +1 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/agents/__init__.py +22 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/agents/base.py +276 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/agents/factory.py +187 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/agents/llm_agent.py +370 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/agents/specialized.py +380 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/communication/__init__.py +20 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/communication/central_post.py +596 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/communication/messages.py +48 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/communication/registry.py +329 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/communication/spoke.py +501 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/core/__init__.py +20 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/core/helix.py +375 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/memory/__init__.py +49 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/memory/backends/__init__.py +9 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/memory/backends/base.py +79 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/memory/backends/sqlite.py +313 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/memory/compression.py +489 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/memory/knowledge_store.py +478 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/memory/task_memory.py +606 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/providers/__init__.py +56 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/providers/anthropic.py +207 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/providers/base.py +178 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/providers/errors.py +53 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/providers/local.py +71 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/providers/openai_provider.py +200 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/providers/registry.py +166 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/providers/types.py +108 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/py.typed +0 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/spawning/__init__.py +10 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/streaming/__init__.py +9 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/tokens/__init__.py +10 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/tokens/budget.py +68 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/utils/__init__.py +8 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/workflows/__init__.py +25 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/workflows/config.py +82 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/workflows/context_builder.py +199 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/workflows/runner.py +255 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/workflows/synthesizer.py +132 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/workflows/templates/__init__.py +17 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/workflows/templates/analysis.py +34 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/workflows/templates/research.py +34 -0
- felix_agent_sdk-0.1.0/src/felix_agent_sdk/workflows/templates/review.py +34 -0
- felix_agent_sdk-0.1.0/tests/benchmarks/__init__.py +0 -0
- felix_agent_sdk-0.1.0/tests/conftest.py +259 -0
- felix_agent_sdk-0.1.0/tests/integration/__init__.py +0 -0
- felix_agent_sdk-0.1.0/tests/integration/conftest.py +13 -0
- felix_agent_sdk-0.1.0/tests/integration/test_deep_research_demo.py +194 -0
- felix_agent_sdk-0.1.0/tests/integration/test_providers.py +134 -0
- felix_agent_sdk-0.1.0/tests/integration/test_workflow_pipeline.py +226 -0
- felix_agent_sdk-0.1.0/tests/unit/__init__.py +0 -0
- felix_agent_sdk-0.1.0/tests/unit/test_agent_base.py +264 -0
- felix_agent_sdk-0.1.0/tests/unit/test_agent_factory.py +192 -0
- felix_agent_sdk-0.1.0/tests/unit/test_anthropic_provider.py +468 -0
- felix_agent_sdk-0.1.0/tests/unit/test_backends.py +176 -0
- felix_agent_sdk-0.1.0/tests/unit/test_base_provider.py +220 -0
- felix_agent_sdk-0.1.0/tests/unit/test_central_post.py +450 -0
- felix_agent_sdk-0.1.0/tests/unit/test_communication_registry.py +383 -0
- felix_agent_sdk-0.1.0/tests/unit/test_compression.py +232 -0
- felix_agent_sdk-0.1.0/tests/unit/test_context_builder.py +122 -0
- felix_agent_sdk-0.1.0/tests/unit/test_errors.py +189 -0
- felix_agent_sdk-0.1.0/tests/unit/test_helix.py +368 -0
- felix_agent_sdk-0.1.0/tests/unit/test_knowledge_store.py +299 -0
- felix_agent_sdk-0.1.0/tests/unit/test_llm_agent.py +370 -0
- felix_agent_sdk-0.1.0/tests/unit/test_local_provider.py +189 -0
- felix_agent_sdk-0.1.0/tests/unit/test_messages.py +162 -0
- felix_agent_sdk-0.1.0/tests/unit/test_openai_provider.py +467 -0
- felix_agent_sdk-0.1.0/tests/unit/test_registry.py +212 -0
- felix_agent_sdk-0.1.0/tests/unit/test_specialized_agents.py +270 -0
- felix_agent_sdk-0.1.0/tests/unit/test_spoke.py +477 -0
- felix_agent_sdk-0.1.0/tests/unit/test_synthesizer.py +120 -0
- felix_agent_sdk-0.1.0/tests/unit/test_task_memory.py +245 -0
- felix_agent_sdk-0.1.0/tests/unit/test_token_budget.py +81 -0
- felix_agent_sdk-0.1.0/tests/unit/test_workflow_config.py +106 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Felix Agent SDK — Code Ownership
|
|
2
|
+
# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
|
|
3
|
+
|
|
4
|
+
# Core Felix modules — ported from Caleb's Felix framework
|
|
5
|
+
/src/felix_agent_sdk/core/ @CalebisGross @jkbennitt
|
|
6
|
+
/src/felix_agent_sdk/agents/ @CalebisGross @jkbennitt
|
|
7
|
+
/src/felix_agent_sdk/communication/ @CalebisGross @jkbennitt
|
|
8
|
+
/src/felix_agent_sdk/memory/ @CalebisGross @jkbennitt
|
|
9
|
+
/src/felix_agent_sdk/spawning/ @CalebisGross @jkbennitt
|
|
10
|
+
/src/felix_agent_sdk/workflows/ @CalebisGross @jkbennitt
|
|
11
|
+
|
|
12
|
+
# Provider layer
|
|
13
|
+
/src/felix_agent_sdk/providers/ @jkbennitt
|
|
14
|
+
|
|
15
|
+
# Package infrastructure
|
|
16
|
+
pyproject.toml @jkbennitt
|
|
17
|
+
.github/ @jkbennitt
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ matrix.python-version }}
|
|
23
|
+
cache: 'pip'
|
|
24
|
+
|
|
25
|
+
- name: Install dependencies
|
|
26
|
+
run: |
|
|
27
|
+
python -m pip install --upgrade pip
|
|
28
|
+
pip install -e ".[dev]"
|
|
29
|
+
|
|
30
|
+
- name: Lint
|
|
31
|
+
run: ruff check src/
|
|
32
|
+
|
|
33
|
+
- name: Test
|
|
34
|
+
run: pytest tests/ -v --tb=short
|
|
35
|
+
|
|
36
|
+
build:
|
|
37
|
+
name: Verify package builds
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/checkout@v4
|
|
42
|
+
|
|
43
|
+
- name: Set up Python
|
|
44
|
+
uses: actions/setup-python@v5
|
|
45
|
+
with:
|
|
46
|
+
python-version: "3.12"
|
|
47
|
+
cache: "pip"
|
|
48
|
+
|
|
49
|
+
- name: Install build
|
|
50
|
+
run: pip install build
|
|
51
|
+
|
|
52
|
+
- name: Build package
|
|
53
|
+
run: python -m build
|
|
54
|
+
|
|
55
|
+
- name: Check wheel contents
|
|
56
|
+
run: unzip -l dist/*.whl
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
name: Build distribution
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- name: Set up Python
|
|
19
|
+
uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.12"
|
|
22
|
+
cache: "pip"
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: |
|
|
26
|
+
python -m pip install --upgrade pip
|
|
27
|
+
pip install -e ".[dev]"
|
|
28
|
+
|
|
29
|
+
- name: Lint
|
|
30
|
+
run: ruff check src/
|
|
31
|
+
|
|
32
|
+
- name: Test
|
|
33
|
+
run: pytest tests/ -v --tb=short
|
|
34
|
+
|
|
35
|
+
- name: Install build
|
|
36
|
+
run: pip install build
|
|
37
|
+
|
|
38
|
+
- name: Build package
|
|
39
|
+
run: python -m build
|
|
40
|
+
|
|
41
|
+
- name: Upload distributions
|
|
42
|
+
uses: actions/upload-artifact@v4
|
|
43
|
+
with:
|
|
44
|
+
name: package-distributions
|
|
45
|
+
path: dist/
|
|
46
|
+
|
|
47
|
+
publish-testpypi:
|
|
48
|
+
name: Publish to TestPyPI
|
|
49
|
+
needs: build
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
environment: testpypi
|
|
52
|
+
permissions:
|
|
53
|
+
id-token: write # Required for trusted publishing via OIDC
|
|
54
|
+
|
|
55
|
+
steps:
|
|
56
|
+
- name: Download distributions
|
|
57
|
+
uses: actions/download-artifact@v4
|
|
58
|
+
with:
|
|
59
|
+
name: package-distributions
|
|
60
|
+
path: dist/
|
|
61
|
+
|
|
62
|
+
- name: Publish to TestPyPI
|
|
63
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
64
|
+
with:
|
|
65
|
+
repository-url: https://test.pypi.org/legacy/
|
|
66
|
+
|
|
67
|
+
publish-pypi:
|
|
68
|
+
name: Publish to PyPI
|
|
69
|
+
needs: publish-testpypi
|
|
70
|
+
runs-on: ubuntu-latest
|
|
71
|
+
environment: pypi
|
|
72
|
+
permissions:
|
|
73
|
+
id-token: write # Required for trusted publishing via OIDC
|
|
74
|
+
|
|
75
|
+
steps:
|
|
76
|
+
- name: Download distributions
|
|
77
|
+
uses: actions/download-artifact@v4
|
|
78
|
+
with:
|
|
79
|
+
name: package-distributions
|
|
80
|
+
path: dist/
|
|
81
|
+
|
|
82
|
+
- name: Publish to PyPI
|
|
83
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.pyo
|
|
5
|
+
*.pyd
|
|
6
|
+
.Python
|
|
7
|
+
*.egg-info/
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
.eggs/
|
|
11
|
+
*.egg
|
|
12
|
+
*.whl
|
|
13
|
+
|
|
14
|
+
# Virtual environments
|
|
15
|
+
.venv/
|
|
16
|
+
venv/
|
|
17
|
+
env/
|
|
18
|
+
.env
|
|
19
|
+
|
|
20
|
+
# IDE
|
|
21
|
+
.vscode/
|
|
22
|
+
.idea/
|
|
23
|
+
*.iml
|
|
24
|
+
|
|
25
|
+
# mypy
|
|
26
|
+
.mypy_cache/
|
|
27
|
+
.dmypy.json
|
|
28
|
+
|
|
29
|
+
# pytest
|
|
30
|
+
.pytest_cache/
|
|
31
|
+
.coverage
|
|
32
|
+
coverage.xml
|
|
33
|
+
htmlcov/
|
|
34
|
+
|
|
35
|
+
# Docs
|
|
36
|
+
site/
|
|
37
|
+
docs/_build/
|
|
38
|
+
|
|
39
|
+
# OS
|
|
40
|
+
.DS_Store
|
|
41
|
+
Thumbs.db
|
|
42
|
+
|
|
43
|
+
# Databases
|
|
44
|
+
*.db
|
|
45
|
+
|
|
46
|
+
# Internal design docs (not for public repo)
|
|
47
|
+
felix-agent-sdk-structure.md
|
|
48
|
+
|
|
49
|
+
# Original monolith (split into src/felix_agent_sdk/providers/)
|
|
50
|
+
felix_providers.py
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Felix Agent SDK will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.1.0] — 2026-03-19
|
|
6
|
+
|
|
7
|
+
Initial public release of the Felix Agent SDK.
|
|
8
|
+
|
|
9
|
+
### Core Geometry
|
|
10
|
+
- `HelixGeometry` — 3D parametric helix with `get_position(t)`, `get_radius(z)`, `get_angle_at_t(t)`, `get_tangent_vector(t)`, `approximate_arc_length()`
|
|
11
|
+
- `HelixConfig` — named presets: `default()`, `research_heavy()`, `fast_convergence()`
|
|
12
|
+
- `HelixPosition` — phase-aware wrapper with exploration/analysis/synthesis boundaries
|
|
13
|
+
|
|
14
|
+
### Agents
|
|
15
|
+
- `Agent` base class with helix-aware positioning, temperature, and lifecycle
|
|
16
|
+
- `LLMAgent` with provider integration, position-aware prompting, meta-cognitive evaluation
|
|
17
|
+
- `ResearchAgent`, `AnalysisAgent`, `CriticAgent` specialized agents
|
|
18
|
+
- `AgentFactory` with `create_agent()`, `create_specialized_team()`, custom type registration
|
|
19
|
+
|
|
20
|
+
### Communication
|
|
21
|
+
- `CentralPost` hub with O(N) message routing, phase-aware delivery, performance tracking
|
|
22
|
+
- `AgentRegistry` with capacity management, role indexing, performance history
|
|
23
|
+
- `Spoke` + `SpokeManager` with per-type handler registration, lazy async support
|
|
24
|
+
- `Message` and `MessageType` enums for structured inter-agent communication
|
|
25
|
+
|
|
26
|
+
### Memory
|
|
27
|
+
- `KnowledgeStore` with confidence-tagged entries, domain filtering, relationship graph
|
|
28
|
+
- `TaskMemory` with pattern recognition, strategy recommendations, execution history
|
|
29
|
+
- `ContextCompressor` with hierarchical summarization strategies
|
|
30
|
+
- Pluggable backend interface with `SQLiteBackend` as default
|
|
31
|
+
|
|
32
|
+
### Providers
|
|
33
|
+
- `BaseProvider` abstract interface: `complete()`, `stream()`, `count_tokens()`
|
|
34
|
+
- `AnthropicProvider` — Claude models
|
|
35
|
+
- `OpenAIProvider` — GPT models and OpenAI-compatible APIs
|
|
36
|
+
- `LocalProvider` — LM Studio, Ollama via OpenAI-compatible endpoint
|
|
37
|
+
- `auto_detect_provider()` — environment-based provider selection
|
|
38
|
+
|
|
39
|
+
### Workflows
|
|
40
|
+
- `FelixWorkflow` orchestrator: team spawn → rounds → convergence check → synthesis
|
|
41
|
+
- `WorkflowConfig` with helix config, team composition, confidence threshold, synthesis strategy
|
|
42
|
+
- `CollaborativeContextBuilder` with relevance scoring and deduplication
|
|
43
|
+
- `WorkflowSynthesizer` with BEST_RESULT, COMPRESSED_MERGE, ROUND_ROBIN strategies
|
|
44
|
+
- Pre-built templates: `research_config()`, `analysis_config()`, `review_config()`
|
|
45
|
+
|
|
46
|
+
### Tokens
|
|
47
|
+
- `TokenBudget` with position-aware allocation (exploration vs synthesis split)
|
|
48
|
+
|
|
49
|
+
### Infrastructure
|
|
50
|
+
- Pip-installable package with optional provider dependencies
|
|
51
|
+
- 659 tests (unit + integration)
|
|
52
|
+
- Python 3.10+ support
|
|
53
|
+
- MIT license
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Hard Rules
|
|
6
|
+
|
|
7
|
+
1. Use a venv at `.venv` for all development, testing, and execution.
|
|
8
|
+
2. When porting code from the original Felix framework (`https://github.com/CalebisGross/felix`), Caleb's architecture decisions take precedence. Core algorithms stay identical; only the interface layer changes.
|
|
9
|
+
3. Git attribution for ported/refactored code:
|
|
10
|
+
- **Ported code** (Caleb's algorithms, unchanged): `git commit --author="Caleb Gross <209704970+CalebisGross@users.noreply.github.com>"`
|
|
11
|
+
- **Refactored code** (Caleb's logic, new interfaces): add `Co-authored-by: Caleb Gross <209704970+CalebisGross@users.noreply.github.com>` trailer
|
|
12
|
+
- **New code** (provider layer, configs, tests, docs): normal commits
|
|
13
|
+
4. Never commit `.env`, credentials, `*.db` files, or `felix-agent-sdk-structure.md` (internal design doc).
|
|
14
|
+
5. All PRs require review from `@CalebisGross` (enforced via CODEOWNERS).
|
|
15
|
+
|
|
16
|
+
## Project Overview
|
|
17
|
+
|
|
18
|
+
`felix-agent-sdk` is a pip-installable Python SDK that extracts and repackages the internal Felix Framework into a provider-agnostic, open-source package for external developers.
|
|
19
|
+
|
|
20
|
+
- **GitHub org:** [AppSprout-dev](https://github.com/AppSprout-dev)
|
|
21
|
+
- **Public SDK repo:** `AppSprout-dev/felix-agent-sdk`
|
|
22
|
+
- **Private Felix source:** `AppSprout-dev/felix` (original by Caleb Gross)
|
|
23
|
+
- **Team:** Jason Bennett (@jkbennitt) — SDK lead. Caleb Gross (@CalebisGross) — original Felix author, required reviewer.
|
|
24
|
+
|
|
25
|
+
## Build & Run Commands
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Setup
|
|
29
|
+
python -m venv .venv
|
|
30
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
31
|
+
pip install -e ".[dev]"
|
|
32
|
+
|
|
33
|
+
# Install with specific provider
|
|
34
|
+
pip install -e ".[anthropic]" # Claude models
|
|
35
|
+
pip install -e ".[openai]" # OpenAI models
|
|
36
|
+
pip install -e ".[local]" # LM Studio / Ollama
|
|
37
|
+
pip install -e ".[all]" # Everything
|
|
38
|
+
|
|
39
|
+
# Testing
|
|
40
|
+
pytest tests/
|
|
41
|
+
pytest tests/unit/
|
|
42
|
+
pytest tests/ -v --cov=src
|
|
43
|
+
|
|
44
|
+
# Linting & type checking
|
|
45
|
+
ruff check src/
|
|
46
|
+
ruff format src/
|
|
47
|
+
mypy src/
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Architecture
|
|
51
|
+
|
|
52
|
+
### Package Layout
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
src/felix_agent_sdk/
|
|
56
|
+
├── __init__.py # Public API surface + version
|
|
57
|
+
├── _version.py # Single source of truth for version
|
|
58
|
+
├── core/ # HelixGeometry, HelixConfig, HelixPosition
|
|
59
|
+
├── agents/ # Agent, LLMAgent, specialized agents, AgentFactory
|
|
60
|
+
├── communication/ # CentralPost, Spoke, messages, AgentRegistry
|
|
61
|
+
├── memory/ # KnowledgeStore, TaskMemory, compression, pluggable backends
|
|
62
|
+
├── providers/ # BaseProvider, Anthropic, OpenAI, Local (IMPLEMENTED)
|
|
63
|
+
├── spawning/ # DynamicSpawning, ConfidenceMonitor, ContentAnalyzer
|
|
64
|
+
├── workflows/ # Felix workflow runner + templates
|
|
65
|
+
├── tokens/ # TokenBudgetManager, provider-aware counting
|
|
66
|
+
├── streaming/ # StreamEvent types, StreamHandler
|
|
67
|
+
└── utils/ # Logging, config loading, common types
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Key Design Decisions
|
|
71
|
+
|
|
72
|
+
- **Provider abstraction** is the critical layer. Every provider implements `BaseProvider` with `complete()`, `stream()`, `count_tokens()`. This decouples all agent logic from specific LLM APIs.
|
|
73
|
+
- **`openai_provider.py`** (not `openai.py`) avoids shadowing the `openai` package import.
|
|
74
|
+
- **Helix model:** agents traverse `t ∈ [0,1]` along a 3D spiral. Top (t=0) = exploration, high temperature, broad search. Bottom (t=1) = synthesis, low temperature, focused output. Default: top_radius=3.0, bottom_radius=0.5, height=8.0, turns=2.0.
|
|
75
|
+
- **Hub-spoke O(N)** communication via CentralPost. All messages route through the hub, never direct agent-to-agent mesh (O(N²)).
|
|
76
|
+
- **Memory** uses pluggable backends with SQLite as default.
|
|
77
|
+
- **Dynamic spawning** is confidence-driven. If team confidence drops below threshold, new agents spawn automatically.
|
|
78
|
+
|
|
79
|
+
### Porting Reference
|
|
80
|
+
|
|
81
|
+
The original Felix source is at `https://github.com/CalebisGross/felix`. Key files to port:
|
|
82
|
+
|
|
83
|
+
| Felix source | SDK target | Notes |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| `src/core/helix_geometry.py` (186 lines) | `core/helix.py` | Add HelixConfig presets, HelixPosition |
|
|
86
|
+
| `src/agents/agent.py` (372 lines) | `agents/base.py` | Extract AgentState, clean interface |
|
|
87
|
+
| `src/agents/llm_agent.py` (2130 lines) | `agents/llm_agent.py` | Wire to BaseProvider (biggest refactor) |
|
|
88
|
+
| `src/agents/specialized_agents.py` (578 lines) | `agents/specialized.py` | Keep Research, Analysis, Critic |
|
|
89
|
+
| `src/agents/dynamic_spawning.py` (1204 lines) | `spawning/` | Split into focused modules |
|
|
90
|
+
| `src/communication/central_post.py` (3210 lines) | `communication/` | Extract AgentRegistry, decouple memory |
|
|
91
|
+
| `src/communication/spoke.py` (514 lines) | `communication/spoke.py` | Minimal changes |
|
|
92
|
+
| `src/memory/knowledge_store.py` (2953 lines) | `memory/` | Add pluggable backend interface |
|
|
93
|
+
| `src/memory/task_memory.py` (705 lines) | `memory/` | Pattern recognition |
|
|
94
|
+
| `src/memory/context_compression.py` (564 lines) | `memory/` | Compression strategies |
|
|
95
|
+
| `src/llm/token_budget.py` (331 lines) | `tokens/budget.py` | Provider-aware counting |
|
|
96
|
+
| `src/workflows/felix_workflow.py` | `workflows/` | Add template system |
|
|
97
|
+
|
|
98
|
+
### What NOT to Port
|
|
99
|
+
|
|
100
|
+
- Tkinter/PySide6 GUI code
|
|
101
|
+
- `exp/` benchmarking scripts (write new ones)
|
|
102
|
+
- `linear_pipeline.py` (research baseline)
|
|
103
|
+
- `lm_studio_client.py` / `multi_server_client.py` (replaced by provider layer)
|
|
104
|
+
- CLI, API, execution/trust system, knowledge daemon
|
|
105
|
+
|
|
106
|
+
## Phased Implementation
|
|
107
|
+
|
|
108
|
+
- **Phase 1** (current): Package skeleton + provider layer
|
|
109
|
+
- **Phase 2** `feat/core-geometry`: Port HelixGeometry, add HelixConfig/HelixPosition
|
|
110
|
+
- **Phase 3** `feat/providers`: Tests for provider layer
|
|
111
|
+
- **Phase 4** `feat/agents`: Port agent classes, wire to BaseProvider
|
|
112
|
+
- **Phase 5** `feat/communication`: Port CentralPost, Spoke, messages
|
|
113
|
+
- **Phase 6** `feat/memory`: Port KnowledgeStore, TaskMemory, ContextCompressor
|
|
114
|
+
- **Phase 7** `feat/workflows`: Port workflow runner + templates
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Contributing to Felix Agent SDK
|
|
2
|
+
|
|
3
|
+
Thank you for contributing! This document covers setting up your development environment.
|
|
4
|
+
|
|
5
|
+
## Development Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
git clone https://github.com/AppSprout-dev/felix-agent-sdk.git
|
|
9
|
+
cd felix-agent-sdk
|
|
10
|
+
python -m venv .venv
|
|
11
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
12
|
+
pip install -e ".[dev]"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Running Tests
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pytest tests/
|
|
19
|
+
pytest tests/ -v --cov=src
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Code Style
|
|
23
|
+
|
|
24
|
+
We use `ruff` for linting and formatting:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
ruff check src/
|
|
28
|
+
ruff format src/
|
|
29
|
+
mypy src/
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Submitting Changes
|
|
33
|
+
|
|
34
|
+
1. Fork the repo and create a feature branch from `main`
|
|
35
|
+
2. Write tests for new functionality
|
|
36
|
+
3. Ensure `pytest` and `ruff` pass
|
|
37
|
+
4. Open a pull request — `@CalebisGross` will review core modules
|
|
38
|
+
|
|
39
|
+
## Branch Protection
|
|
40
|
+
|
|
41
|
+
The `main` branch requires at least one approving review before merge.
|
|
42
|
+
Direct pushes to `main` are not permitted after initial setup.
|
|
43
|
+
|
|
44
|
+
## Git Attribution
|
|
45
|
+
|
|
46
|
+
When porting code from the original Felix framework:
|
|
47
|
+
|
|
48
|
+
- **Unchanged algorithms**: Use `git commit --author="Caleb Gross <209704970+CalebisGross@users.noreply.github.com>"`
|
|
49
|
+
- **Refactored code**: Add `Co-authored-by: Caleb Gross <209704970+CalebisGross@users.noreply.github.com>` trailer
|
|
50
|
+
- **New code**: Normal commits
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Felix Framework
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
NOTICE: This is the Community Edition license. For commercial deployments,
|
|
26
|
+
enterprise features, or air-gapped certifications, contact the maintainers
|
|
27
|
+
about commercial licensing options.
|
|
28
|
+
|
|
29
|
+
For commercial licensing inquiries, contact: [caleb@appsprout.dev]
|