friday-framework 0.1.0a0__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.
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.pyc
|
|
3
|
+
.env
|
|
4
|
+
.venv/
|
|
5
|
+
.idea/
|
|
6
|
+
.vscode/
|
|
7
|
+
dist/
|
|
8
|
+
build/
|
|
9
|
+
*.egg-info/
|
|
10
|
+
chroma_db/
|
|
11
|
+
.friday/
|
|
12
|
+
/vector/
|
|
13
|
+
/exports/
|
|
14
|
+
tests/integration/memory/vector/*/
|
|
15
|
+
tests/integration/memory/vector/backups/*/
|
|
16
|
+
tests/integration/memory/vector/reorganization_logs/*
|
|
17
|
+
*.gpickle
|
|
18
|
+
keys.txt
|
|
19
|
+
experiments/*/config/runtime.local.yaml
|
|
20
|
+
experiments/*/artifacts/*
|
|
21
|
+
!experiments/*/artifacts/.gitkeep
|
|
22
|
+
scripts/source-friday-chat-example-env.sh
|
|
23
|
+
scripts/pypi.sh
|
|
24
|
+
/docs/reference/PyPI-Recovery-Codes-cichuck-2026-07-20T15_36_49.709334.txt
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Friday Team
|
|
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.
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: friday-framework
|
|
3
|
+
Version: 0.1.0a0
|
|
4
|
+
Summary: Friday Agentic Framework Workspace
|
|
5
|
+
Project-URL: Homepage, https://github.com/CIChuck/agent-framework
|
|
6
|
+
Project-URL: Repository, https://github.com/CIChuck/agent-framework
|
|
7
|
+
Project-URL: Issues, https://github.com/CIChuck/agent-framework/issues
|
|
8
|
+
Project-URL: Documentation, https://github.com/CIChuck/agent-framework/tree/main/docs
|
|
9
|
+
Project-URL: Source, https://github.com/CIChuck/agent-framework
|
|
10
|
+
Author: Friday Team
|
|
11
|
+
License-Expression: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: agents,ai,llm,memory
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Requires-Dist: friday-chat==0.1.0a0
|
|
24
|
+
Requires-Dist: friday-framework-agent==0.1.0a0
|
|
25
|
+
Requires-Dist: friday-framework-cli==0.1.0a0
|
|
26
|
+
Requires-Dist: friday-framework-core==0.1.0a0
|
|
27
|
+
Requires-Dist: friday-framework-llm==0.1.0a0
|
|
28
|
+
Requires-Dist: friday-framework-memory==0.1.0a0
|
|
29
|
+
Requires-Dist: friday-framework-runtime==0.1.0a0
|
|
30
|
+
Requires-Dist: friday-framework-telemetry==0.1.0a0
|
|
31
|
+
Requires-Dist: friday-framework-tools==0.1.0a0
|
|
32
|
+
Requires-Dist: friday-framework-transcript==0.1.0a0
|
|
33
|
+
Provides-Extra: all
|
|
34
|
+
Requires-Dist: friday-chat[finance,moltbook,sandbox,speech]==0.1.0a0; extra == 'all'
|
|
35
|
+
Requires-Dist: friday-framework-finance==0.1.0a0; extra == 'all'
|
|
36
|
+
Requires-Dist: friday-framework-llm[langfuse]==0.1.0a0; extra == 'all'
|
|
37
|
+
Requires-Dist: friday-framework-mcp==0.1.0a0; extra == 'all'
|
|
38
|
+
Requires-Dist: friday-framework-moltbook==0.1.0a0; extra == 'all'
|
|
39
|
+
Requires-Dist: friday-framework-sandbox==0.1.0a0; extra == 'all'
|
|
40
|
+
Requires-Dist: friday-framework-speech[elevenlabs,picovoice]==0.1.0a0; extra == 'all'
|
|
41
|
+
Requires-Dist: friday-framework-tools[all-adapters,all-formats,finance,moltbook,sandbox]==0.1.0a0; extra == 'all'
|
|
42
|
+
Provides-Extra: dev
|
|
43
|
+
Requires-Dist: mypy>=1.10.0; extra == 'dev'
|
|
44
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
45
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: respx>=0.20.0; extra == 'dev'
|
|
47
|
+
Requires-Dist: ruff>=0.4.0; extra == 'dev'
|
|
48
|
+
Requires-Dist: types-pyyaml>=6.0.12; extra == 'dev'
|
|
49
|
+
Provides-Extra: documents
|
|
50
|
+
Requires-Dist: friday-framework-tools[documents]==0.1.0a0; extra == 'documents'
|
|
51
|
+
Provides-Extra: finance
|
|
52
|
+
Requires-Dist: friday-chat[finance]==0.1.0a0; extra == 'finance'
|
|
53
|
+
Requires-Dist: friday-framework-finance==0.1.0a0; extra == 'finance'
|
|
54
|
+
Requires-Dist: friday-framework-tools[finance]==0.1.0a0; extra == 'finance'
|
|
55
|
+
Provides-Extra: langfuse
|
|
56
|
+
Requires-Dist: friday-framework-llm[langfuse]==0.1.0a0; extra == 'langfuse'
|
|
57
|
+
Provides-Extra: mcp
|
|
58
|
+
Requires-Dist: friday-framework-mcp==0.1.0a0; extra == 'mcp'
|
|
59
|
+
Provides-Extra: moltbook
|
|
60
|
+
Requires-Dist: friday-chat[moltbook]==0.1.0a0; extra == 'moltbook'
|
|
61
|
+
Requires-Dist: friday-framework-moltbook==0.1.0a0; extra == 'moltbook'
|
|
62
|
+
Requires-Dist: friday-framework-tools[moltbook]==0.1.0a0; extra == 'moltbook'
|
|
63
|
+
Provides-Extra: sandbox
|
|
64
|
+
Requires-Dist: friday-chat[sandbox]==0.1.0a0; extra == 'sandbox'
|
|
65
|
+
Requires-Dist: friday-framework-sandbox==0.1.0a0; extra == 'sandbox'
|
|
66
|
+
Requires-Dist: friday-framework-tools[sandbox]==0.1.0a0; extra == 'sandbox'
|
|
67
|
+
Provides-Extra: speech
|
|
68
|
+
Requires-Dist: friday-chat[speech]==0.1.0a0; extra == 'speech'
|
|
69
|
+
Requires-Dist: friday-framework-speech[elevenlabs,picovoice]==0.1.0a0; extra == 'speech'
|
|
70
|
+
Provides-Extra: spreadsheets
|
|
71
|
+
Requires-Dist: friday-framework-tools[spreadsheets]==0.1.0a0; extra == 'spreadsheets'
|
|
72
|
+
Description-Content-Type: text/markdown
|
|
73
|
+
|
|
74
|
+
# Friday Agent Framework
|
|
75
|
+
|
|
76
|
+
Friday is a Python framework for building AI agents that can remember, retrieve,
|
|
77
|
+
act, and collaborate across sessions. The project is organized as a `uv`
|
|
78
|
+
workspace of independently useful packages covering memory, LLM access, agent
|
|
79
|
+
orchestration, tools, transcripts, telemetry, sandboxing, MCP integration, and
|
|
80
|
+
runtime assembly.
|
|
81
|
+
|
|
82
|
+
The core idea is simple: an agent should not start from zero every time it is
|
|
83
|
+
called. Friday gives agents a memory loop that records what happened, extracts
|
|
84
|
+
what was learned, retrieves relevant context, and feeds that context back into
|
|
85
|
+
future turns.
|
|
86
|
+
|
|
87
|
+
Status: `v0.1.0`, alpha. The memory, agent, runtime, and tool packages contain
|
|
88
|
+
substantial implementation, but the repository is still under active
|
|
89
|
+
architectural cleanup. Some documentation describes the target system as well as
|
|
90
|
+
the current system.
|
|
91
|
+
|
|
92
|
+
## What Friday Provides
|
|
93
|
+
|
|
94
|
+
- Three-tier memory:
|
|
95
|
+
- Episodic memory for conversation history and transcripts.
|
|
96
|
+
- Semantic memory for embedding-backed recall.
|
|
97
|
+
- Associative memory for entity and relationship graphs.
|
|
98
|
+
- Context engineering:
|
|
99
|
+
- Retrieval from memory stores.
|
|
100
|
+
- Token-budget-aware prompt assembly.
|
|
101
|
+
- Session priming and lifecycle-aware memory inclusion.
|
|
102
|
+
- Agent orchestration:
|
|
103
|
+
- Interactive ReAct-style agents.
|
|
104
|
+
- Multi-agent routing and delegation.
|
|
105
|
+
- Workflow/task graph execution with human-in-the-loop support.
|
|
106
|
+
- Tooling:
|
|
107
|
+
- Filesystem, shell, web, git, data, text, code, system, finance, and memory
|
|
108
|
+
tools.
|
|
109
|
+
- Tool schemas for LLM function/tool calling.
|
|
110
|
+
- Prompt-injection-aware output handling.
|
|
111
|
+
- Runtime infrastructure:
|
|
112
|
+
- Headless runtime kernel.
|
|
113
|
+
- Dependency injection for memory, LLM, telemetry, transcripts, and tools.
|
|
114
|
+
- CLI-facing presentation components.
|
|
115
|
+
- Observability:
|
|
116
|
+
- Structured logging.
|
|
117
|
+
- Telemetry interfaces and providers.
|
|
118
|
+
- Persistent transcripts and export formats.
|
|
119
|
+
- Extensibility:
|
|
120
|
+
- Protocol-oriented interfaces for memory stores, LLM clients, tools,
|
|
121
|
+
transcripts, telemetry, and runtime services.
|
|
122
|
+
- MCP client/server integration.
|
|
123
|
+
- Optional local/cloud/hybrid model routing through LiteLLM-compatible
|
|
124
|
+
services.
|
|
125
|
+
|
|
126
|
+
## Repository Layout
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
.
|
|
130
|
+
├── docs/
|
|
131
|
+
│ ├── guides/ # Product and usage documentation
|
|
132
|
+
│ ├── policies/ # Repository engineering policy
|
|
133
|
+
│ └── design/ # Design notes and implementation plans
|
|
134
|
+
├── experiments/ # Labs and exploratory work
|
|
135
|
+
├── packages/ # Python workspace packages
|
|
136
|
+
├── tests/ # Top-level integration/lab/unit suites
|
|
137
|
+
├── main.py # Minimal smoke entry point
|
|
138
|
+
├── pyproject.toml # Root workspace project
|
|
139
|
+
└── uv.lock # Locked dependency graph
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The root project is a convenience workspace package named `friday`. Most code
|
|
143
|
+
lives under `packages/`.
|
|
144
|
+
|
|
145
|
+
## Package Map
|
|
146
|
+
|
|
147
|
+
| Package | Purpose | Notes |
|
|
148
|
+
| --- | --- | --- |
|
|
149
|
+
| `friday-core` | Shared interfaces, config, logging, security primitives, exceptions | Intended foundation layer. Some current factory/bridge code still reaches into concrete packages. |
|
|
150
|
+
| `friday-telemetry` | Telemetry records, interfaces, providers, helper models | Includes debug and OpenTelemetry-style provider support. |
|
|
151
|
+
| `friday-llm` | LiteLLM-backed chat and embedding services | Includes resilience, pricing, telemetry helpers, and provider config. |
|
|
152
|
+
| `friday-transcript` | Persistent transcript models, stores, and exporters | SQLite and JSONL-oriented transcript storage/export support. |
|
|
153
|
+
| `friday-memory` | Memory controller, adapters, lifecycle, retrieval, context assembly, ingestion, multi-agent memory | The largest and most central package. |
|
|
154
|
+
| `friday-agent` | Agent base classes, interactive/Copilot agents, registries, orchestration, workflows, built-in agent tools | `CopilotAgent` currently aliases the interactive runtime agent for compatibility. |
|
|
155
|
+
| `friday-runtime` | Headless runtime kernel and dependency injection | Preferred assembly layer for creating full framework services. |
|
|
156
|
+
| `friday-cli` | Terminal display/input/session components and server hooks | The declared `friday` console entry point is still under development in this checkout. |
|
|
157
|
+
| `friday-tools` | General and integration tool catalog | Includes filesystem, shell, web, git, data, document, code, memory, finance, and integration tools. |
|
|
158
|
+
| `friday-sandbox` | Workspace and subprocess/Docker sandbox support | Used by execution-related tools and runtime isolation work. |
|
|
159
|
+
| `friday-mcp` | Model Context Protocol client/server integration | Supports stdio/SSE-oriented MCP components. |
|
|
160
|
+
| `friday-speech` | Speech service interfaces, selection, chunking, playback, adapters | Optional Picovoice and ElevenLabs extras are defined. |
|
|
161
|
+
| `friday-finance` | Financial data provider integration | Includes a `friday-finance-demo` script. |
|
|
162
|
+
| `friday-moltbook` | Moltbook API client and Pydantic models | Used by Moltbook integration tools. |
|
|
163
|
+
| `friday-optimization` | DSPy/lab optimization package | Currently a playground package rather than a core runtime dependency. |
|
|
164
|
+
|
|
165
|
+
## Architecture Overview
|
|
166
|
+
|
|
167
|
+
Friday separates agent work into two broad areas:
|
|
168
|
+
|
|
169
|
+
```text
|
|
170
|
+
User input
|
|
171
|
+
|
|
|
172
|
+
v
|
|
173
|
+
RuntimeKernel / DI container
|
|
174
|
+
|
|
|
175
|
+
+--> LLM service
|
|
176
|
+
+--> Tool registry
|
|
177
|
+
+--> Transcript store
|
|
178
|
+
+--> MemoryController
|
|
179
|
+
|
|
|
180
|
+
+--> Episodic store conversation turns
|
|
181
|
+
+--> Vector store semantic memories
|
|
182
|
+
+--> Graph store entities and relationships
|
|
183
|
+
+--> Collection manager lifecycle-aware memory collections
|
|
184
|
+
|
|
|
185
|
+
v
|
|
186
|
+
Agent / Orchestrator / Workflow engine
|
|
187
|
+
|
|
|
188
|
+
+--> Context assembly
|
|
189
|
+
+--> LLM inference
|
|
190
|
+
+--> Tool execution
|
|
191
|
+
+--> Transcript and memory archival
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
The memory loop is the central design:
|
|
195
|
+
|
|
196
|
+
1. A user asks a question or gives a task.
|
|
197
|
+
2. Friday retrieves relevant prior context from memory.
|
|
198
|
+
3. The agent sends an assembled prompt to an LLM.
|
|
199
|
+
4. The LLM responds directly or requests tool calls.
|
|
200
|
+
5. Tool results are sanitized, wrapped, and returned to the model.
|
|
201
|
+
6. The turn is archived to transcript/episodic memory.
|
|
202
|
+
7. Extracted insights, entities, and relationships are stored for future turns.
|
|
203
|
+
8. Lifecycle jobs can promote, decay, compact, or reorganize memories over time.
|
|
204
|
+
|
|
205
|
+
## Installation
|
|
206
|
+
|
|
207
|
+
Friday uses `uv` for workspace development.
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
uv sync --all-extras
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
For a lighter development install, the default sync is usually enough:
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
uv sync
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Then verify imports:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
uv run python -c "from friday_runtime import RuntimeKernel; from friday_agent import InteractiveAgent; print('Friday imports OK')"
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Configuration
|
|
226
|
+
|
|
227
|
+
Start from the example environment file:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
cp .env.example .env
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Minimum useful environment:
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
APP_ENV=development
|
|
237
|
+
LOG_LEVEL=INFO
|
|
238
|
+
OPENAI_API_KEY=sk-proj-...
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Common runtime variables include:
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
FRIDAY_LLM_MODEL=gpt-4o-mini
|
|
245
|
+
FRIDAY_CHROMA_PATH=.friday/chroma
|
|
246
|
+
FRIDAY_CHROMA_COLLECTION=friday_memory
|
|
247
|
+
FRIDAY_TELEMETRY_ENABLED=false
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Local or enterprise model gateways can be configured through the runtime and LLM
|
|
251
|
+
configuration objects. See [docs/guides/10-configuration.md](docs/guides/10-configuration.md)
|
|
252
|
+
for the full configuration guide.
|
|
253
|
+
|
|
254
|
+
## Programmatic Usage
|
|
255
|
+
|
|
256
|
+
The headless runtime is the main composition API for applications that want to
|
|
257
|
+
embed Friday without a CLI.
|
|
258
|
+
|
|
259
|
+
```python
|
|
260
|
+
import asyncio
|
|
261
|
+
|
|
262
|
+
from friday_core.profiles import MemoryProfile
|
|
263
|
+
from friday_runtime import RuntimeConfig, RuntimeKernel
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
async def main() -> None:
|
|
267
|
+
config = RuntimeConfig.from_env()
|
|
268
|
+
kernel = RuntimeKernel(config=config, memory_profile=MemoryProfile.FULL)
|
|
269
|
+
|
|
270
|
+
await kernel.start()
|
|
271
|
+
try:
|
|
272
|
+
# Agent spawning requires configured agent profiles.
|
|
273
|
+
# See docs/guides/06-agents.md for profile structure.
|
|
274
|
+
agent = kernel.spawn_agent("assistant")
|
|
275
|
+
response = await agent.run("What do you remember about this project?")
|
|
276
|
+
print(response)
|
|
277
|
+
finally:
|
|
278
|
+
await kernel.stop()
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
if __name__ == "__main__":
|
|
282
|
+
asyncio.run(main())
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
For lower-level use, individual packages can be imported directly:
|
|
286
|
+
|
|
287
|
+
```python
|
|
288
|
+
from friday_llm import LiteLLMService
|
|
289
|
+
from friday_memory import ContextAssembler, MemoryController
|
|
290
|
+
from friday_agent import AgentProfile, InteractiveAgent
|
|
291
|
+
from friday_tools import get_default_registry
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Development Commands
|
|
295
|
+
|
|
296
|
+
Install dependencies:
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
uv sync --all-extras
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
Run tests:
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
uv run pytest
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Run a focused package test suite:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
uv run pytest packages/friday-memory/tests_memory
|
|
312
|
+
uv run pytest packages/friday-agent/tests_agent
|
|
313
|
+
uv run pytest packages/friday-runtime/tests_runtime
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
Run linting:
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
uv run ruff check .
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
Run type checking:
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
uv run mypy packages tests main.py
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
Run the minimal smoke entry point:
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
uv run python main.py
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
## Testing Notes
|
|
335
|
+
|
|
336
|
+
The repository uses:
|
|
337
|
+
|
|
338
|
+
- `pytest`
|
|
339
|
+
- `pytest-asyncio`
|
|
340
|
+
- `ruff`
|
|
341
|
+
- `mypy`
|
|
342
|
+
|
|
343
|
+
Tests are distributed by package, usually under `packages/<package>/tests_*`.
|
|
344
|
+
Top-level integration and lab tests live under `tests/` and `experiments/`.
|
|
345
|
+
|
|
346
|
+
Some tests and integrations require provider credentials, local model services,
|
|
347
|
+
network access, Docker, or pre-existing local state. Prefer focused package tests
|
|
348
|
+
while developing a narrow change.
|
|
349
|
+
|
|
350
|
+
## Security Model
|
|
351
|
+
|
|
352
|
+
Friday treats tool outputs and external content as untrusted. The security
|
|
353
|
+
subsystem is designed around:
|
|
354
|
+
|
|
355
|
+
- Normalizing tool output before scanning.
|
|
356
|
+
- Detecting prompt-injection patterns.
|
|
357
|
+
- Wrapping tool output with provenance markers.
|
|
358
|
+
- Quarantining, redacting, warning, or blocking risky content.
|
|
359
|
+
- Avoiding persistence of raw malicious tool output into memory stores.
|
|
360
|
+
|
|
361
|
+
See [docs/guides/security-configuration-guidelines.md](docs/guides/security-configuration-guidelines.md)
|
|
362
|
+
for configuration details and the tool onboarding checklist.
|
|
363
|
+
|
|
364
|
+
## Documentation
|
|
365
|
+
|
|
366
|
+
Primary product guides:
|
|
367
|
+
|
|
368
|
+
- [Executive summary](docs/guides/01-executive-summary.md)
|
|
369
|
+
- [Getting started](docs/guides/02-getting-started.md)
|
|
370
|
+
- [Core concepts and architecture](docs/guides/03-core-concepts.md)
|
|
371
|
+
- [Adaptive memory](docs/guides/04-adaptive-memory.md)
|
|
372
|
+
- [Tools](docs/guides/05-tools.md)
|
|
373
|
+
- [Agents](docs/guides/06-agents.md)
|
|
374
|
+
- [Multi-agent orchestration](docs/guides/07-multi-agent.md)
|
|
375
|
+
- [Workflows](docs/guides/08-workflows.md)
|
|
376
|
+
- [CLI reference](docs/guides/09-cli-reference.md)
|
|
377
|
+
- [Configuration](docs/guides/10-configuration.md)
|
|
378
|
+
- [Advanced topics](docs/guides/11-advanced-topics.md)
|
|
379
|
+
- [Use cases](docs/guides/12-use-cases.md)
|
|
380
|
+
- [Troubleshooting](docs/guides/13-troubleshooting.md)
|
|
381
|
+
- [Appendices](docs/guides/14-appendices.md)
|
|
382
|
+
- [Contributing](docs/guides/15-contributing.md)
|
|
383
|
+
|
|
384
|
+
Repository policy:
|
|
385
|
+
|
|
386
|
+
- [Repository engineering policy](docs/reference/policies/repository-engineering-policy.md)
|
|
387
|
+
|
|
388
|
+
Important note: the guides are extensive and useful, but some package-layout and
|
|
389
|
+
CLI details are ahead of or behind the current code. When making code changes,
|
|
390
|
+
prefer the repository policy and current package metadata as the source of truth.
|
|
391
|
+
|
|
392
|
+
## Engineering Policy
|
|
393
|
+
|
|
394
|
+
The canonical engineering policy is
|
|
395
|
+
[docs/reference/policies/repository-engineering-policy.md](docs/reference/policies/repository-engineering-policy.md).
|
|
396
|
+
Key rules:
|
|
397
|
+
|
|
398
|
+
- Do not add file-level `# mypy: ignore-errors` under `packages/*/src` without
|
|
399
|
+
an explicit waiver.
|
|
400
|
+
- Do not rely on `assert` as the sole enforcement for essential runtime
|
|
401
|
+
invariants.
|
|
402
|
+
- Prefer typed models, declared interfaces, and explicit contracts at package
|
|
403
|
+
boundaries.
|
|
404
|
+
- Prefer interface fixes over repeated `cast(...)`.
|
|
405
|
+
- Keep runtime credentials and local state out of the repository.
|
|
406
|
+
|
|
407
|
+
## Local State and Secrets
|
|
408
|
+
|
|
409
|
+
Do not commit:
|
|
410
|
+
|
|
411
|
+
- `.env`
|
|
412
|
+
- `.friday/`
|
|
413
|
+
- `chroma_db/`
|
|
414
|
+
- provider API keys
|
|
415
|
+
- local transcript/vector/graph stores
|
|
416
|
+
- generated caches such as `__pycache__`, `.pytest_cache`, and `.ruff_cache`
|
|
417
|
+
|
|
418
|
+
## Current Development Caveats
|
|
419
|
+
|
|
420
|
+
This repository is actively evolving. A few areas are especially worth knowing
|
|
421
|
+
before building on it:
|
|
422
|
+
|
|
423
|
+
- The package architecture has grown beyond older documentation that describes
|
|
424
|
+
an eight-package workspace.
|
|
425
|
+
- The root `main.py` is only a minimal smoke script.
|
|
426
|
+
- The `friday-cli` package contains useful terminal components, but the declared
|
|
427
|
+
console application entry point is not yet a complete CLI in this checkout.
|
|
428
|
+
- `friday-optimization` is currently lab-oriented.
|
|
429
|
+
- Some integration and backup code under `tests/` is legacy or experimental and
|
|
430
|
+
may not represent stable public API usage.
|
|
431
|
+
|
|
432
|
+
## Contributing
|
|
433
|
+
|
|
434
|
+
Before changing code:
|
|
435
|
+
|
|
436
|
+
1. Read [docs/reference/policies/repository-engineering-policy.md](docs/reference/policies/repository-engineering-policy.md).
|
|
437
|
+
2. Identify the package boundary affected by the change.
|
|
438
|
+
3. Prefer narrow, typed contracts over incidental cross-package imports.
|
|
439
|
+
4. Add focused regression tests for behavior changes.
|
|
440
|
+
5. Run the narrowest meaningful tests, then broader validation when practical.
|
|
441
|
+
|
|
442
|
+
Pull requests should include:
|
|
443
|
+
|
|
444
|
+
- What changed.
|
|
445
|
+
- Why it changed.
|
|
446
|
+
- How to validate it.
|
|
447
|
+
- Package or configuration implications.
|
|
448
|
+
- Any migration notes for public contracts or persisted data.
|
|
449
|
+
|
|
450
|
+
## License
|
|
451
|
+
|
|
452
|
+
The root project metadata declares the project as MIT licensed.
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
# Friday Agent Framework
|
|
2
|
+
|
|
3
|
+
Friday is a Python framework for building AI agents that can remember, retrieve,
|
|
4
|
+
act, and collaborate across sessions. The project is organized as a `uv`
|
|
5
|
+
workspace of independently useful packages covering memory, LLM access, agent
|
|
6
|
+
orchestration, tools, transcripts, telemetry, sandboxing, MCP integration, and
|
|
7
|
+
runtime assembly.
|
|
8
|
+
|
|
9
|
+
The core idea is simple: an agent should not start from zero every time it is
|
|
10
|
+
called. Friday gives agents a memory loop that records what happened, extracts
|
|
11
|
+
what was learned, retrieves relevant context, and feeds that context back into
|
|
12
|
+
future turns.
|
|
13
|
+
|
|
14
|
+
Status: `v0.1.0`, alpha. The memory, agent, runtime, and tool packages contain
|
|
15
|
+
substantial implementation, but the repository is still under active
|
|
16
|
+
architectural cleanup. Some documentation describes the target system as well as
|
|
17
|
+
the current system.
|
|
18
|
+
|
|
19
|
+
## What Friday Provides
|
|
20
|
+
|
|
21
|
+
- Three-tier memory:
|
|
22
|
+
- Episodic memory for conversation history and transcripts.
|
|
23
|
+
- Semantic memory for embedding-backed recall.
|
|
24
|
+
- Associative memory for entity and relationship graphs.
|
|
25
|
+
- Context engineering:
|
|
26
|
+
- Retrieval from memory stores.
|
|
27
|
+
- Token-budget-aware prompt assembly.
|
|
28
|
+
- Session priming and lifecycle-aware memory inclusion.
|
|
29
|
+
- Agent orchestration:
|
|
30
|
+
- Interactive ReAct-style agents.
|
|
31
|
+
- Multi-agent routing and delegation.
|
|
32
|
+
- Workflow/task graph execution with human-in-the-loop support.
|
|
33
|
+
- Tooling:
|
|
34
|
+
- Filesystem, shell, web, git, data, text, code, system, finance, and memory
|
|
35
|
+
tools.
|
|
36
|
+
- Tool schemas for LLM function/tool calling.
|
|
37
|
+
- Prompt-injection-aware output handling.
|
|
38
|
+
- Runtime infrastructure:
|
|
39
|
+
- Headless runtime kernel.
|
|
40
|
+
- Dependency injection for memory, LLM, telemetry, transcripts, and tools.
|
|
41
|
+
- CLI-facing presentation components.
|
|
42
|
+
- Observability:
|
|
43
|
+
- Structured logging.
|
|
44
|
+
- Telemetry interfaces and providers.
|
|
45
|
+
- Persistent transcripts and export formats.
|
|
46
|
+
- Extensibility:
|
|
47
|
+
- Protocol-oriented interfaces for memory stores, LLM clients, tools,
|
|
48
|
+
transcripts, telemetry, and runtime services.
|
|
49
|
+
- MCP client/server integration.
|
|
50
|
+
- Optional local/cloud/hybrid model routing through LiteLLM-compatible
|
|
51
|
+
services.
|
|
52
|
+
|
|
53
|
+
## Repository Layout
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
.
|
|
57
|
+
├── docs/
|
|
58
|
+
│ ├── guides/ # Product and usage documentation
|
|
59
|
+
│ ├── policies/ # Repository engineering policy
|
|
60
|
+
│ └── design/ # Design notes and implementation plans
|
|
61
|
+
├── experiments/ # Labs and exploratory work
|
|
62
|
+
├── packages/ # Python workspace packages
|
|
63
|
+
├── tests/ # Top-level integration/lab/unit suites
|
|
64
|
+
├── main.py # Minimal smoke entry point
|
|
65
|
+
├── pyproject.toml # Root workspace project
|
|
66
|
+
└── uv.lock # Locked dependency graph
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The root project is a convenience workspace package named `friday`. Most code
|
|
70
|
+
lives under `packages/`.
|
|
71
|
+
|
|
72
|
+
## Package Map
|
|
73
|
+
|
|
74
|
+
| Package | Purpose | Notes |
|
|
75
|
+
| --- | --- | --- |
|
|
76
|
+
| `friday-core` | Shared interfaces, config, logging, security primitives, exceptions | Intended foundation layer. Some current factory/bridge code still reaches into concrete packages. |
|
|
77
|
+
| `friday-telemetry` | Telemetry records, interfaces, providers, helper models | Includes debug and OpenTelemetry-style provider support. |
|
|
78
|
+
| `friday-llm` | LiteLLM-backed chat and embedding services | Includes resilience, pricing, telemetry helpers, and provider config. |
|
|
79
|
+
| `friday-transcript` | Persistent transcript models, stores, and exporters | SQLite and JSONL-oriented transcript storage/export support. |
|
|
80
|
+
| `friday-memory` | Memory controller, adapters, lifecycle, retrieval, context assembly, ingestion, multi-agent memory | The largest and most central package. |
|
|
81
|
+
| `friday-agent` | Agent base classes, interactive/Copilot agents, registries, orchestration, workflows, built-in agent tools | `CopilotAgent` currently aliases the interactive runtime agent for compatibility. |
|
|
82
|
+
| `friday-runtime` | Headless runtime kernel and dependency injection | Preferred assembly layer for creating full framework services. |
|
|
83
|
+
| `friday-cli` | Terminal display/input/session components and server hooks | The declared `friday` console entry point is still under development in this checkout. |
|
|
84
|
+
| `friday-tools` | General and integration tool catalog | Includes filesystem, shell, web, git, data, document, code, memory, finance, and integration tools. |
|
|
85
|
+
| `friday-sandbox` | Workspace and subprocess/Docker sandbox support | Used by execution-related tools and runtime isolation work. |
|
|
86
|
+
| `friday-mcp` | Model Context Protocol client/server integration | Supports stdio/SSE-oriented MCP components. |
|
|
87
|
+
| `friday-speech` | Speech service interfaces, selection, chunking, playback, adapters | Optional Picovoice and ElevenLabs extras are defined. |
|
|
88
|
+
| `friday-finance` | Financial data provider integration | Includes a `friday-finance-demo` script. |
|
|
89
|
+
| `friday-moltbook` | Moltbook API client and Pydantic models | Used by Moltbook integration tools. |
|
|
90
|
+
| `friday-optimization` | DSPy/lab optimization package | Currently a playground package rather than a core runtime dependency. |
|
|
91
|
+
|
|
92
|
+
## Architecture Overview
|
|
93
|
+
|
|
94
|
+
Friday separates agent work into two broad areas:
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
User input
|
|
98
|
+
|
|
|
99
|
+
v
|
|
100
|
+
RuntimeKernel / DI container
|
|
101
|
+
|
|
|
102
|
+
+--> LLM service
|
|
103
|
+
+--> Tool registry
|
|
104
|
+
+--> Transcript store
|
|
105
|
+
+--> MemoryController
|
|
106
|
+
|
|
|
107
|
+
+--> Episodic store conversation turns
|
|
108
|
+
+--> Vector store semantic memories
|
|
109
|
+
+--> Graph store entities and relationships
|
|
110
|
+
+--> Collection manager lifecycle-aware memory collections
|
|
111
|
+
|
|
|
112
|
+
v
|
|
113
|
+
Agent / Orchestrator / Workflow engine
|
|
114
|
+
|
|
|
115
|
+
+--> Context assembly
|
|
116
|
+
+--> LLM inference
|
|
117
|
+
+--> Tool execution
|
|
118
|
+
+--> Transcript and memory archival
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The memory loop is the central design:
|
|
122
|
+
|
|
123
|
+
1. A user asks a question or gives a task.
|
|
124
|
+
2. Friday retrieves relevant prior context from memory.
|
|
125
|
+
3. The agent sends an assembled prompt to an LLM.
|
|
126
|
+
4. The LLM responds directly or requests tool calls.
|
|
127
|
+
5. Tool results are sanitized, wrapped, and returned to the model.
|
|
128
|
+
6. The turn is archived to transcript/episodic memory.
|
|
129
|
+
7. Extracted insights, entities, and relationships are stored for future turns.
|
|
130
|
+
8. Lifecycle jobs can promote, decay, compact, or reorganize memories over time.
|
|
131
|
+
|
|
132
|
+
## Installation
|
|
133
|
+
|
|
134
|
+
Friday uses `uv` for workspace development.
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
uv sync --all-extras
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
For a lighter development install, the default sync is usually enough:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
uv sync
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Then verify imports:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
uv run python -c "from friday_runtime import RuntimeKernel; from friday_agent import InteractiveAgent; print('Friday imports OK')"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Configuration
|
|
153
|
+
|
|
154
|
+
Start from the example environment file:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
cp .env.example .env
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Minimum useful environment:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
APP_ENV=development
|
|
164
|
+
LOG_LEVEL=INFO
|
|
165
|
+
OPENAI_API_KEY=sk-proj-...
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Common runtime variables include:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
FRIDAY_LLM_MODEL=gpt-4o-mini
|
|
172
|
+
FRIDAY_CHROMA_PATH=.friday/chroma
|
|
173
|
+
FRIDAY_CHROMA_COLLECTION=friday_memory
|
|
174
|
+
FRIDAY_TELEMETRY_ENABLED=false
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Local or enterprise model gateways can be configured through the runtime and LLM
|
|
178
|
+
configuration objects. See [docs/guides/10-configuration.md](docs/guides/10-configuration.md)
|
|
179
|
+
for the full configuration guide.
|
|
180
|
+
|
|
181
|
+
## Programmatic Usage
|
|
182
|
+
|
|
183
|
+
The headless runtime is the main composition API for applications that want to
|
|
184
|
+
embed Friday without a CLI.
|
|
185
|
+
|
|
186
|
+
```python
|
|
187
|
+
import asyncio
|
|
188
|
+
|
|
189
|
+
from friday_core.profiles import MemoryProfile
|
|
190
|
+
from friday_runtime import RuntimeConfig, RuntimeKernel
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
async def main() -> None:
|
|
194
|
+
config = RuntimeConfig.from_env()
|
|
195
|
+
kernel = RuntimeKernel(config=config, memory_profile=MemoryProfile.FULL)
|
|
196
|
+
|
|
197
|
+
await kernel.start()
|
|
198
|
+
try:
|
|
199
|
+
# Agent spawning requires configured agent profiles.
|
|
200
|
+
# See docs/guides/06-agents.md for profile structure.
|
|
201
|
+
agent = kernel.spawn_agent("assistant")
|
|
202
|
+
response = await agent.run("What do you remember about this project?")
|
|
203
|
+
print(response)
|
|
204
|
+
finally:
|
|
205
|
+
await kernel.stop()
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
if __name__ == "__main__":
|
|
209
|
+
asyncio.run(main())
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
For lower-level use, individual packages can be imported directly:
|
|
213
|
+
|
|
214
|
+
```python
|
|
215
|
+
from friday_llm import LiteLLMService
|
|
216
|
+
from friday_memory import ContextAssembler, MemoryController
|
|
217
|
+
from friday_agent import AgentProfile, InteractiveAgent
|
|
218
|
+
from friday_tools import get_default_registry
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Development Commands
|
|
222
|
+
|
|
223
|
+
Install dependencies:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
uv sync --all-extras
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Run tests:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
uv run pytest
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Run a focused package test suite:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
uv run pytest packages/friday-memory/tests_memory
|
|
239
|
+
uv run pytest packages/friday-agent/tests_agent
|
|
240
|
+
uv run pytest packages/friday-runtime/tests_runtime
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Run linting:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
uv run ruff check .
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Run type checking:
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
uv run mypy packages tests main.py
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Run the minimal smoke entry point:
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
uv run python main.py
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Testing Notes
|
|
262
|
+
|
|
263
|
+
The repository uses:
|
|
264
|
+
|
|
265
|
+
- `pytest`
|
|
266
|
+
- `pytest-asyncio`
|
|
267
|
+
- `ruff`
|
|
268
|
+
- `mypy`
|
|
269
|
+
|
|
270
|
+
Tests are distributed by package, usually under `packages/<package>/tests_*`.
|
|
271
|
+
Top-level integration and lab tests live under `tests/` and `experiments/`.
|
|
272
|
+
|
|
273
|
+
Some tests and integrations require provider credentials, local model services,
|
|
274
|
+
network access, Docker, or pre-existing local state. Prefer focused package tests
|
|
275
|
+
while developing a narrow change.
|
|
276
|
+
|
|
277
|
+
## Security Model
|
|
278
|
+
|
|
279
|
+
Friday treats tool outputs and external content as untrusted. The security
|
|
280
|
+
subsystem is designed around:
|
|
281
|
+
|
|
282
|
+
- Normalizing tool output before scanning.
|
|
283
|
+
- Detecting prompt-injection patterns.
|
|
284
|
+
- Wrapping tool output with provenance markers.
|
|
285
|
+
- Quarantining, redacting, warning, or blocking risky content.
|
|
286
|
+
- Avoiding persistence of raw malicious tool output into memory stores.
|
|
287
|
+
|
|
288
|
+
See [docs/guides/security-configuration-guidelines.md](docs/guides/security-configuration-guidelines.md)
|
|
289
|
+
for configuration details and the tool onboarding checklist.
|
|
290
|
+
|
|
291
|
+
## Documentation
|
|
292
|
+
|
|
293
|
+
Primary product guides:
|
|
294
|
+
|
|
295
|
+
- [Executive summary](docs/guides/01-executive-summary.md)
|
|
296
|
+
- [Getting started](docs/guides/02-getting-started.md)
|
|
297
|
+
- [Core concepts and architecture](docs/guides/03-core-concepts.md)
|
|
298
|
+
- [Adaptive memory](docs/guides/04-adaptive-memory.md)
|
|
299
|
+
- [Tools](docs/guides/05-tools.md)
|
|
300
|
+
- [Agents](docs/guides/06-agents.md)
|
|
301
|
+
- [Multi-agent orchestration](docs/guides/07-multi-agent.md)
|
|
302
|
+
- [Workflows](docs/guides/08-workflows.md)
|
|
303
|
+
- [CLI reference](docs/guides/09-cli-reference.md)
|
|
304
|
+
- [Configuration](docs/guides/10-configuration.md)
|
|
305
|
+
- [Advanced topics](docs/guides/11-advanced-topics.md)
|
|
306
|
+
- [Use cases](docs/guides/12-use-cases.md)
|
|
307
|
+
- [Troubleshooting](docs/guides/13-troubleshooting.md)
|
|
308
|
+
- [Appendices](docs/guides/14-appendices.md)
|
|
309
|
+
- [Contributing](docs/guides/15-contributing.md)
|
|
310
|
+
|
|
311
|
+
Repository policy:
|
|
312
|
+
|
|
313
|
+
- [Repository engineering policy](docs/reference/policies/repository-engineering-policy.md)
|
|
314
|
+
|
|
315
|
+
Important note: the guides are extensive and useful, but some package-layout and
|
|
316
|
+
CLI details are ahead of or behind the current code. When making code changes,
|
|
317
|
+
prefer the repository policy and current package metadata as the source of truth.
|
|
318
|
+
|
|
319
|
+
## Engineering Policy
|
|
320
|
+
|
|
321
|
+
The canonical engineering policy is
|
|
322
|
+
[docs/reference/policies/repository-engineering-policy.md](docs/reference/policies/repository-engineering-policy.md).
|
|
323
|
+
Key rules:
|
|
324
|
+
|
|
325
|
+
- Do not add file-level `# mypy: ignore-errors` under `packages/*/src` without
|
|
326
|
+
an explicit waiver.
|
|
327
|
+
- Do not rely on `assert` as the sole enforcement for essential runtime
|
|
328
|
+
invariants.
|
|
329
|
+
- Prefer typed models, declared interfaces, and explicit contracts at package
|
|
330
|
+
boundaries.
|
|
331
|
+
- Prefer interface fixes over repeated `cast(...)`.
|
|
332
|
+
- Keep runtime credentials and local state out of the repository.
|
|
333
|
+
|
|
334
|
+
## Local State and Secrets
|
|
335
|
+
|
|
336
|
+
Do not commit:
|
|
337
|
+
|
|
338
|
+
- `.env`
|
|
339
|
+
- `.friday/`
|
|
340
|
+
- `chroma_db/`
|
|
341
|
+
- provider API keys
|
|
342
|
+
- local transcript/vector/graph stores
|
|
343
|
+
- generated caches such as `__pycache__`, `.pytest_cache`, and `.ruff_cache`
|
|
344
|
+
|
|
345
|
+
## Current Development Caveats
|
|
346
|
+
|
|
347
|
+
This repository is actively evolving. A few areas are especially worth knowing
|
|
348
|
+
before building on it:
|
|
349
|
+
|
|
350
|
+
- The package architecture has grown beyond older documentation that describes
|
|
351
|
+
an eight-package workspace.
|
|
352
|
+
- The root `main.py` is only a minimal smoke script.
|
|
353
|
+
- The `friday-cli` package contains useful terminal components, but the declared
|
|
354
|
+
console application entry point is not yet a complete CLI in this checkout.
|
|
355
|
+
- `friday-optimization` is currently lab-oriented.
|
|
356
|
+
- Some integration and backup code under `tests/` is legacy or experimental and
|
|
357
|
+
may not represent stable public API usage.
|
|
358
|
+
|
|
359
|
+
## Contributing
|
|
360
|
+
|
|
361
|
+
Before changing code:
|
|
362
|
+
|
|
363
|
+
1. Read [docs/reference/policies/repository-engineering-policy.md](docs/reference/policies/repository-engineering-policy.md).
|
|
364
|
+
2. Identify the package boundary affected by the change.
|
|
365
|
+
3. Prefer narrow, typed contracts over incidental cross-package imports.
|
|
366
|
+
4. Add focused regression tests for behavior changes.
|
|
367
|
+
5. Run the narrowest meaningful tests, then broader validation when practical.
|
|
368
|
+
|
|
369
|
+
Pull requests should include:
|
|
370
|
+
|
|
371
|
+
- What changed.
|
|
372
|
+
- Why it changed.
|
|
373
|
+
- How to validate it.
|
|
374
|
+
- Package or configuration implications.
|
|
375
|
+
- Any migration notes for public contracts or persisted data.
|
|
376
|
+
|
|
377
|
+
## License
|
|
378
|
+
|
|
379
|
+
The root project metadata declares the project as MIT licensed.
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "friday-framework"
|
|
3
|
+
version = "0.1.0a0"
|
|
4
|
+
description = "Friday Agentic Framework Workspace"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
license = "MIT"
|
|
8
|
+
authors = [{ name = "Friday Team" }]
|
|
9
|
+
keywords = ["ai", "agents", "memory", "llm"]
|
|
10
|
+
classifiers = [
|
|
11
|
+
"Development Status :: 3 - Alpha",
|
|
12
|
+
"Intended Audience :: Developers",
|
|
13
|
+
"License :: OSI Approved :: MIT License",
|
|
14
|
+
"Programming Language :: Python :: 3",
|
|
15
|
+
"Programming Language :: Python :: 3.10",
|
|
16
|
+
"Programming Language :: Python :: 3.11",
|
|
17
|
+
"Programming Language :: Python :: 3.12",
|
|
18
|
+
"Programming Language :: Python :: 3.13",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
dependencies = [
|
|
22
|
+
"friday-framework-core==0.1.0a0",
|
|
23
|
+
"friday-framework-memory==0.1.0a0",
|
|
24
|
+
"friday-framework-llm==0.1.0a0",
|
|
25
|
+
"friday-framework-agent==0.1.0a0",
|
|
26
|
+
"friday-framework-tools==0.1.0a0",
|
|
27
|
+
"friday-framework-transcript==0.1.0a0",
|
|
28
|
+
"friday-framework-cli==0.1.0a0",
|
|
29
|
+
"friday-framework-runtime==0.1.0a0",
|
|
30
|
+
"friday-framework-telemetry==0.1.0a0",
|
|
31
|
+
"friday-chat==0.1.0a0",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
[project.optional-dependencies]
|
|
35
|
+
speech = [
|
|
36
|
+
"friday-framework-speech[picovoice,elevenlabs]==0.1.0a0",
|
|
37
|
+
"friday-chat[speech]==0.1.0a0",
|
|
38
|
+
]
|
|
39
|
+
finance = [
|
|
40
|
+
"friday-framework-finance==0.1.0a0",
|
|
41
|
+
"friday-framework-tools[finance]==0.1.0a0",
|
|
42
|
+
"friday-chat[finance]==0.1.0a0",
|
|
43
|
+
]
|
|
44
|
+
sandbox = [
|
|
45
|
+
"friday-framework-sandbox==0.1.0a0",
|
|
46
|
+
"friday-framework-tools[sandbox]==0.1.0a0",
|
|
47
|
+
"friday-chat[sandbox]==0.1.0a0",
|
|
48
|
+
]
|
|
49
|
+
moltbook = [
|
|
50
|
+
"friday-framework-moltbook==0.1.0a0",
|
|
51
|
+
"friday-framework-tools[moltbook]==0.1.0a0",
|
|
52
|
+
"friday-chat[moltbook]==0.1.0a0",
|
|
53
|
+
]
|
|
54
|
+
mcp = [
|
|
55
|
+
"friday-framework-mcp==0.1.0a0",
|
|
56
|
+
]
|
|
57
|
+
documents = [
|
|
58
|
+
"friday-framework-tools[documents]==0.1.0a0",
|
|
59
|
+
]
|
|
60
|
+
spreadsheets = [
|
|
61
|
+
"friday-framework-tools[spreadsheets]==0.1.0a0",
|
|
62
|
+
]
|
|
63
|
+
langfuse = [
|
|
64
|
+
"friday-framework-llm[langfuse]==0.1.0a0",
|
|
65
|
+
]
|
|
66
|
+
all = [
|
|
67
|
+
"friday-framework-speech[picovoice,elevenlabs]==0.1.0a0",
|
|
68
|
+
"friday-framework-finance==0.1.0a0",
|
|
69
|
+
"friday-framework-sandbox==0.1.0a0",
|
|
70
|
+
"friday-framework-moltbook==0.1.0a0",
|
|
71
|
+
"friday-framework-mcp==0.1.0a0",
|
|
72
|
+
"friday-framework-tools[all-adapters,all-formats,finance,moltbook,sandbox]==0.1.0a0",
|
|
73
|
+
"friday-framework-llm[langfuse]==0.1.0a0",
|
|
74
|
+
"friday-chat[finance,moltbook,sandbox,speech]==0.1.0a0",
|
|
75
|
+
]
|
|
76
|
+
dev = [
|
|
77
|
+
"pytest>=8.0.0",
|
|
78
|
+
"pytest-asyncio>=0.23.0",
|
|
79
|
+
"respx>=0.20.0",
|
|
80
|
+
"ruff>=0.4.0",
|
|
81
|
+
"mypy>=1.10.0",
|
|
82
|
+
"types-PyYAML>=6.0.12",
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
[project.urls]
|
|
86
|
+
Homepage = "https://github.com/CIChuck/agent-framework"
|
|
87
|
+
Repository = "https://github.com/CIChuck/agent-framework"
|
|
88
|
+
Issues = "https://github.com/CIChuck/agent-framework/issues"
|
|
89
|
+
Documentation = "https://github.com/CIChuck/agent-framework/tree/main/docs"
|
|
90
|
+
Source = "https://github.com/CIChuck/agent-framework"
|
|
91
|
+
|
|
92
|
+
[tool.uv.sources]
|
|
93
|
+
friday-framework-core = { workspace = true }
|
|
94
|
+
friday-framework-memory = { workspace = true }
|
|
95
|
+
friday-framework-llm = { workspace = true }
|
|
96
|
+
friday-framework-agent = { workspace = true }
|
|
97
|
+
friday-framework-speech = { workspace = true }
|
|
98
|
+
friday-framework-sandbox = { workspace = true }
|
|
99
|
+
friday-framework-tools = { workspace = true }
|
|
100
|
+
friday-framework-moltbook = { workspace = true }
|
|
101
|
+
friday-framework-mcp = { workspace = true }
|
|
102
|
+
friday-framework-transcript = { workspace = true }
|
|
103
|
+
friday-framework-cli = { workspace = true }
|
|
104
|
+
friday-chat = { workspace = true }
|
|
105
|
+
friday-framework-runtime = { workspace = true }
|
|
106
|
+
friday-framework-telemetry = { workspace = true }
|
|
107
|
+
friday-framework-finance = { workspace = true }
|
|
108
|
+
|
|
109
|
+
[tool.uv.workspace]
|
|
110
|
+
members = ["packages/*"]
|
|
111
|
+
|
|
112
|
+
[tool.ruff]
|
|
113
|
+
line-length = 88
|
|
114
|
+
target-version = "py310"
|
|
115
|
+
|
|
116
|
+
[tool.ruff.lint]
|
|
117
|
+
select = ["E", "F", "I", "UP", "B", "SIM"]
|
|
118
|
+
ignore = ["E501"] # Line length handled by formatter
|
|
119
|
+
|
|
120
|
+
[tool.mypy]
|
|
121
|
+
python_version = "3.10"
|
|
122
|
+
warn_return_any = true
|
|
123
|
+
warn_unused_ignores = true
|
|
124
|
+
disallow_untyped_defs = true
|
|
125
|
+
ignore_missing_imports = true
|
|
126
|
+
exclude = '(^|/|\\\\)(conftest\\.py|examples($|/|\\\\).*)'
|
|
127
|
+
explicit_package_bases = true
|
|
128
|
+
|
|
129
|
+
[tool.pytest.ini_options]
|
|
130
|
+
testpaths = ["packages/*/tests_*", "experiments/*/tests"]
|
|
131
|
+
asyncio_mode = "auto"
|
|
132
|
+
asyncio_default_fixture_loop_scope = "function"
|
|
133
|
+
|
|
134
|
+
[dependency-groups]
|
|
135
|
+
dev = [
|
|
136
|
+
"pytest>=9.0.2",
|
|
137
|
+
"pytest-asyncio>=1.3.0",
|
|
138
|
+
"respx>=0.20.0",
|
|
139
|
+
"types-PyYAML>=6.0.12",
|
|
140
|
+
]
|
|
141
|
+
|
|
142
|
+
[build-system]
|
|
143
|
+
requires = ["hatchling"]
|
|
144
|
+
build-backend = "hatchling.build"
|
|
145
|
+
|
|
146
|
+
[tool.hatch.build.targets.wheel]
|
|
147
|
+
bypass-selection = true
|
|
148
|
+
|
|
149
|
+
[tool.hatch.build.targets.sdist]
|
|
150
|
+
only-include = [
|
|
151
|
+
"LICENSE",
|
|
152
|
+
"README.md",
|
|
153
|
+
"pyproject.toml",
|
|
154
|
+
]
|