agentcamp 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.
- agentcamp-0.1.0/CHANGELOG.md +18 -0
- agentcamp-0.1.0/LICENSE +21 -0
- agentcamp-0.1.0/MANIFEST.in +8 -0
- agentcamp-0.1.0/PKG-INFO +96 -0
- agentcamp-0.1.0/README.md +68 -0
- agentcamp-0.1.0/pyproject.toml +85 -0
- agentcamp-0.1.0/setup.cfg +4 -0
- agentcamp-0.1.0/src/agentcamp/__init__.py +24 -0
- agentcamp-0.1.0/src/agentcamp/client.py +96 -0
- agentcamp-0.1.0/src/agentcamp/py.typed +0 -0
- agentcamp-0.1.0/src/agentcamp.egg-info/PKG-INFO +96 -0
- agentcamp-0.1.0/src/agentcamp.egg-info/SOURCES.txt +14 -0
- agentcamp-0.1.0/src/agentcamp.egg-info/dependency_links.txt +1 -0
- agentcamp-0.1.0/src/agentcamp.egg-info/requires.txt +6 -0
- agentcamp-0.1.0/src/agentcamp.egg-info/top_level.txt +1 -0
- agentcamp-0.1.0/tests/test_smoke.py +27 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to the `agentcamp` package will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0] - 2026-06-01
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Initial PyPI release of the `agentcamp` package.
|
|
14
|
+
- `AgentCampClient` with `project`, `api_key`, `mode`, and `base_url` configuration.
|
|
15
|
+
- `wrap_langgraph(graph, project=...)` convenience entrypoint (no-op passthrough for now).
|
|
16
|
+
- `Mode` enum: `OBSERVE`, `TRAIN`, `SHADOW`, `ACTIVATE`.
|
|
17
|
+
- `py.typed` marker for type-checker support.
|
|
18
|
+
- PyPI packaging + release infrastructure (GitHub Actions, release scripts, MANIFEST).
|
agentcamp-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 FintorAI
|
|
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.
|
agentcamp-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentcamp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: AgentCamp SDK — where agents train their own experts. Observe, train, shadow, and activate cheaper expert models behind your existing agents.
|
|
5
|
+
Author: FintorAI
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://agentcamp.ai
|
|
8
|
+
Project-URL: Repository, https://github.com/FintorAI/agentcamp
|
|
9
|
+
Project-URL: Changelog, https://github.com/FintorAI/agentcamp/blob/main/CHANGELOG.md
|
|
10
|
+
Keywords: agents,langgraph,llm,fine-tuning,agentcamp,distillation
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Typing :: Typed
|
|
19
|
+
Requires-Python: <4.0,>=3.9
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest; extra == "dev"
|
|
24
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
25
|
+
Requires-Dist: build; extra == "dev"
|
|
26
|
+
Requires-Dist: twine; extra == "dev"
|
|
27
|
+
Dynamic: license-file
|
|
28
|
+
|
|
29
|
+
# AgentCamp
|
|
30
|
+
|
|
31
|
+
[](https://pypi.org/project/agentcamp/)
|
|
32
|
+
[](https://pypi.org/project/agentcamp/)
|
|
33
|
+
|
|
34
|
+
**Where agents train their own experts. Same results, dramatically cheaper.**
|
|
35
|
+
|
|
36
|
+
AgentCamp observes your existing agents in production, trains a fine-tuned
|
|
37
|
+
expert from the traces, shadows it for safety, and then activates it behind
|
|
38
|
+
your stack — with automatic fallback to the teacher model.
|
|
39
|
+
|
|
40
|
+
> v0.1.0 is an early placeholder release. It ships a stable public client
|
|
41
|
+
> surface (`AgentCampClient`, `wrap_langgraph`, and `Mode`) so you can wire up
|
|
42
|
+
> integrations now. Calls are currently no-ops and will begin emitting traces
|
|
43
|
+
> once the training backend lands.
|
|
44
|
+
|
|
45
|
+
## Installation
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
pip install agentcamp
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Quick start
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
import agentcamp
|
|
55
|
+
|
|
56
|
+
# Wrap an existing LangGraph graph so AgentCamp can observe its runs.
|
|
57
|
+
graph = agentcamp.wrap_langgraph(graph, project="support-agent")
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Or use the client directly:
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from agentcamp import AgentCampClient, Mode
|
|
64
|
+
|
|
65
|
+
client = AgentCampClient(project="support-agent", mode=Mode.OBSERVE)
|
|
66
|
+
graph = client.wrap_langgraph(graph)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Modes
|
|
70
|
+
|
|
71
|
+
| Mode | What it does |
|
|
72
|
+
| ---------- | ------------------------------------------------------------------- |
|
|
73
|
+
| `OBSERVE` | Collect traces from the teacher agent only. |
|
|
74
|
+
| `TRAIN` | Build a fine-tuned expert from collected traces. |
|
|
75
|
+
| `SHADOW` | Run the expert alongside the teacher without serving it. |
|
|
76
|
+
| `ACTIVATE` | Serve the expert, falling back to the teacher when needed. |
|
|
77
|
+
|
|
78
|
+
## Configuration
|
|
79
|
+
|
|
80
|
+
| Environment variable | Purpose |
|
|
81
|
+
| -------------------- | ---------------------------------------- |
|
|
82
|
+
| `AGENTCAMP_API_KEY` | API key used to authenticate the client. |
|
|
83
|
+
| `AGENTCAMP_BASE_URL` | Override the AgentCamp API base URL. |
|
|
84
|
+
|
|
85
|
+
## Development
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
python -m venv .venv
|
|
89
|
+
source .venv/bin/activate
|
|
90
|
+
pip install -e '.[dev]'
|
|
91
|
+
pytest
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## License
|
|
95
|
+
|
|
96
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# AgentCamp
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/agentcamp/)
|
|
4
|
+
[](https://pypi.org/project/agentcamp/)
|
|
5
|
+
|
|
6
|
+
**Where agents train their own experts. Same results, dramatically cheaper.**
|
|
7
|
+
|
|
8
|
+
AgentCamp observes your existing agents in production, trains a fine-tuned
|
|
9
|
+
expert from the traces, shadows it for safety, and then activates it behind
|
|
10
|
+
your stack — with automatic fallback to the teacher model.
|
|
11
|
+
|
|
12
|
+
> v0.1.0 is an early placeholder release. It ships a stable public client
|
|
13
|
+
> surface (`AgentCampClient`, `wrap_langgraph`, and `Mode`) so you can wire up
|
|
14
|
+
> integrations now. Calls are currently no-ops and will begin emitting traces
|
|
15
|
+
> once the training backend lands.
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pip install agentcamp
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Quick start
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
import agentcamp
|
|
27
|
+
|
|
28
|
+
# Wrap an existing LangGraph graph so AgentCamp can observe its runs.
|
|
29
|
+
graph = agentcamp.wrap_langgraph(graph, project="support-agent")
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Or use the client directly:
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
from agentcamp import AgentCampClient, Mode
|
|
36
|
+
|
|
37
|
+
client = AgentCampClient(project="support-agent", mode=Mode.OBSERVE)
|
|
38
|
+
graph = client.wrap_langgraph(graph)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Modes
|
|
42
|
+
|
|
43
|
+
| Mode | What it does |
|
|
44
|
+
| ---------- | ------------------------------------------------------------------- |
|
|
45
|
+
| `OBSERVE` | Collect traces from the teacher agent only. |
|
|
46
|
+
| `TRAIN` | Build a fine-tuned expert from collected traces. |
|
|
47
|
+
| `SHADOW` | Run the expert alongside the teacher without serving it. |
|
|
48
|
+
| `ACTIVATE` | Serve the expert, falling back to the teacher when needed. |
|
|
49
|
+
|
|
50
|
+
## Configuration
|
|
51
|
+
|
|
52
|
+
| Environment variable | Purpose |
|
|
53
|
+
| -------------------- | ---------------------------------------- |
|
|
54
|
+
| `AGENTCAMP_API_KEY` | API key used to authenticate the client. |
|
|
55
|
+
| `AGENTCAMP_BASE_URL` | Override the AgentCamp API base URL. |
|
|
56
|
+
|
|
57
|
+
## Development
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
python -m venv .venv
|
|
61
|
+
source .venv/bin/activate
|
|
62
|
+
pip install -e '.[dev]'
|
|
63
|
+
pytest
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## License
|
|
67
|
+
|
|
68
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "agentcamp"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "AgentCamp SDK — where agents train their own experts. Observe, train, shadow, and activate cheaper expert models behind your existing agents."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
requires-python = ">=3.9,<4.0"
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "FintorAI" },
|
|
10
|
+
]
|
|
11
|
+
keywords = ["agents", "langgraph", "llm", "fine-tuning", "agentcamp", "distillation"]
|
|
12
|
+
classifiers = [
|
|
13
|
+
"Development Status :: 3 - Alpha",
|
|
14
|
+
"Intended Audience :: Developers",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.9",
|
|
17
|
+
"Programming Language :: Python :: 3.10",
|
|
18
|
+
"Programming Language :: Python :: 3.11",
|
|
19
|
+
"Programming Language :: Python :: 3.12",
|
|
20
|
+
"Typing :: Typed",
|
|
21
|
+
]
|
|
22
|
+
dependencies = []
|
|
23
|
+
|
|
24
|
+
[project.optional-dependencies]
|
|
25
|
+
dev = [
|
|
26
|
+
"pytest",
|
|
27
|
+
"pytest-cov",
|
|
28
|
+
"build",
|
|
29
|
+
"twine",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[project.urls]
|
|
33
|
+
Homepage = "https://agentcamp.ai"
|
|
34
|
+
Repository = "https://github.com/FintorAI/agentcamp"
|
|
35
|
+
Changelog = "https://github.com/FintorAI/agentcamp/blob/main/CHANGELOG.md"
|
|
36
|
+
|
|
37
|
+
[dependency-groups]
|
|
38
|
+
lint = [
|
|
39
|
+
"ruff>=0.12.2,<0.13.0",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
[build-system]
|
|
43
|
+
requires = ["setuptools>=73.0.0", "wheel"]
|
|
44
|
+
build-backend = "setuptools.build_meta"
|
|
45
|
+
|
|
46
|
+
[tool.setuptools]
|
|
47
|
+
[tool.setuptools.packages.find]
|
|
48
|
+
where = ["src"]
|
|
49
|
+
include = ["agentcamp*"]
|
|
50
|
+
|
|
51
|
+
[tool.setuptools.package-dir]
|
|
52
|
+
"" = "src"
|
|
53
|
+
|
|
54
|
+
[tool.setuptools.package-data]
|
|
55
|
+
"*" = ["py.typed"]
|
|
56
|
+
|
|
57
|
+
[tool.ruff]
|
|
58
|
+
line-length = 150
|
|
59
|
+
exclude = []
|
|
60
|
+
|
|
61
|
+
[tool.ruff.lint]
|
|
62
|
+
select = ["E", "F", "I", "UP", "B"]
|
|
63
|
+
ignore = [
|
|
64
|
+
"COM812",
|
|
65
|
+
"ISC001",
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
[tool.pytest.ini_options]
|
|
69
|
+
pythonpath = ["src"]
|
|
70
|
+
testpaths = ["tests"]
|
|
71
|
+
|
|
72
|
+
[tool.bumpversion]
|
|
73
|
+
current_version = "0.1.0"
|
|
74
|
+
commit = true
|
|
75
|
+
tag = true
|
|
76
|
+
|
|
77
|
+
[[tool.bumpversion.files]]
|
|
78
|
+
filename = "pyproject.toml"
|
|
79
|
+
search = 'version = "{current_version}"'
|
|
80
|
+
replace = 'version = "{new_version}"'
|
|
81
|
+
|
|
82
|
+
[[tool.bumpversion.files]]
|
|
83
|
+
filename = "src/agentcamp/__init__.py"
|
|
84
|
+
search = '__version__ = "{current_version}"'
|
|
85
|
+
replace = '__version__ = "{new_version}"'
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""AgentCamp SDK.
|
|
2
|
+
|
|
3
|
+
Where agents train their own experts. This is the public client surface for
|
|
4
|
+
AgentCamp. v0.1.0 ships a lightweight client stub plus the ``wrap_langgraph``
|
|
5
|
+
entrypoint so integrations can be wired up before the training backend lands.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
__author__ = "FintorAI"
|
|
9
|
+
__version__ = "0.1.0"
|
|
10
|
+
|
|
11
|
+
from agentcamp.client import (
|
|
12
|
+
AgentCampClient,
|
|
13
|
+
AgentCampError,
|
|
14
|
+
Mode,
|
|
15
|
+
wrap_langgraph,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"AgentCampClient",
|
|
20
|
+
"AgentCampError",
|
|
21
|
+
"Mode",
|
|
22
|
+
"__version__",
|
|
23
|
+
"wrap_langgraph",
|
|
24
|
+
]
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Core AgentCamp client.
|
|
2
|
+
|
|
3
|
+
This is the v0.1.0 placeholder surface. It establishes the public API shape
|
|
4
|
+
(client + ``wrap_langgraph`` + modes) without depending on the training
|
|
5
|
+
backend yet, so downstream code can integrate against a stable import path.
|
|
6
|
+
Calls are no-ops today and will start emitting traces once the backend is wired.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
from enum import Enum
|
|
13
|
+
from typing import Any, Optional
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"AgentCampClient",
|
|
17
|
+
"AgentCampError",
|
|
18
|
+
"Mode",
|
|
19
|
+
"wrap_langgraph",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class AgentCampError(Exception):
|
|
24
|
+
"""Base error for all AgentCamp client failures."""
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Mode(str, Enum):
|
|
28
|
+
"""AgentCamp operating modes for a wrapped agent.
|
|
29
|
+
|
|
30
|
+
OBSERVE collect traces from the teacher agent only.
|
|
31
|
+
TRAIN build a fine-tuned expert from collected traces.
|
|
32
|
+
SHADOW run the expert alongside the teacher without serving it.
|
|
33
|
+
ACTIVATE serve the expert, falling back to the teacher when needed.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
OBSERVE = "observe"
|
|
37
|
+
TRAIN = "train"
|
|
38
|
+
SHADOW = "shadow"
|
|
39
|
+
ACTIVATE = "activate"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class AgentCampClient:
|
|
43
|
+
"""Lightweight AgentCamp client.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
project: Project slug that traces and experts are grouped under.
|
|
47
|
+
api_key: AgentCamp API key. Falls back to ``AGENTCAMP_API_KEY``.
|
|
48
|
+
mode: Operating mode for this client. Defaults to ``Mode.OBSERVE``.
|
|
49
|
+
base_url: AgentCamp API base URL. Falls back to ``AGENTCAMP_BASE_URL``.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
project: str,
|
|
55
|
+
api_key: Optional[str] = None,
|
|
56
|
+
mode: Mode = Mode.OBSERVE,
|
|
57
|
+
base_url: Optional[str] = None,
|
|
58
|
+
) -> None:
|
|
59
|
+
if not project:
|
|
60
|
+
raise AgentCampError("`project` is required.")
|
|
61
|
+
self.project = project
|
|
62
|
+
self.api_key = api_key or os.getenv("AGENTCAMP_API_KEY")
|
|
63
|
+
self.mode = Mode(mode)
|
|
64
|
+
self.base_url = base_url or os.getenv(
|
|
65
|
+
"AGENTCAMP_BASE_URL", "https://api.agentcamp.ai"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
def __repr__(self) -> str:
|
|
69
|
+
return (
|
|
70
|
+
f"AgentCampClient(project={self.project!r}, mode={self.mode.value!r})"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def wrap_langgraph(self, graph: Any, mode: Optional[Mode] = None) -> Any:
|
|
74
|
+
"""Wrap a LangGraph graph so AgentCamp can observe/train on its runs.
|
|
75
|
+
|
|
76
|
+
v0.1.0 is a no-op that returns the graph unchanged so integrations can
|
|
77
|
+
be wired ahead of the training backend.
|
|
78
|
+
"""
|
|
79
|
+
_ = mode or self.mode
|
|
80
|
+
return graph
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def wrap_langgraph(
|
|
84
|
+
graph: Any,
|
|
85
|
+
project: str,
|
|
86
|
+
api_key: Optional[str] = None,
|
|
87
|
+
mode: Mode = Mode.OBSERVE,
|
|
88
|
+
) -> Any:
|
|
89
|
+
"""Convenience wrapper around :class:`AgentCampClient`.
|
|
90
|
+
|
|
91
|
+
Example:
|
|
92
|
+
>>> import agentcamp
|
|
93
|
+
>>> graph = agentcamp.wrap_langgraph(graph, project="support-agent")
|
|
94
|
+
"""
|
|
95
|
+
client = AgentCampClient(project=project, api_key=api_key, mode=mode)
|
|
96
|
+
return client.wrap_langgraph(graph)
|
|
File without changes
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentcamp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: AgentCamp SDK — where agents train their own experts. Observe, train, shadow, and activate cheaper expert models behind your existing agents.
|
|
5
|
+
Author: FintorAI
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://agentcamp.ai
|
|
8
|
+
Project-URL: Repository, https://github.com/FintorAI/agentcamp
|
|
9
|
+
Project-URL: Changelog, https://github.com/FintorAI/agentcamp/blob/main/CHANGELOG.md
|
|
10
|
+
Keywords: agents,langgraph,llm,fine-tuning,agentcamp,distillation
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Typing :: Typed
|
|
19
|
+
Requires-Python: <4.0,>=3.9
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest; extra == "dev"
|
|
24
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
25
|
+
Requires-Dist: build; extra == "dev"
|
|
26
|
+
Requires-Dist: twine; extra == "dev"
|
|
27
|
+
Dynamic: license-file
|
|
28
|
+
|
|
29
|
+
# AgentCamp
|
|
30
|
+
|
|
31
|
+
[](https://pypi.org/project/agentcamp/)
|
|
32
|
+
[](https://pypi.org/project/agentcamp/)
|
|
33
|
+
|
|
34
|
+
**Where agents train their own experts. Same results, dramatically cheaper.**
|
|
35
|
+
|
|
36
|
+
AgentCamp observes your existing agents in production, trains a fine-tuned
|
|
37
|
+
expert from the traces, shadows it for safety, and then activates it behind
|
|
38
|
+
your stack — with automatic fallback to the teacher model.
|
|
39
|
+
|
|
40
|
+
> v0.1.0 is an early placeholder release. It ships a stable public client
|
|
41
|
+
> surface (`AgentCampClient`, `wrap_langgraph`, and `Mode`) so you can wire up
|
|
42
|
+
> integrations now. Calls are currently no-ops and will begin emitting traces
|
|
43
|
+
> once the training backend lands.
|
|
44
|
+
|
|
45
|
+
## Installation
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
pip install agentcamp
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Quick start
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
import agentcamp
|
|
55
|
+
|
|
56
|
+
# Wrap an existing LangGraph graph so AgentCamp can observe its runs.
|
|
57
|
+
graph = agentcamp.wrap_langgraph(graph, project="support-agent")
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Or use the client directly:
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from agentcamp import AgentCampClient, Mode
|
|
64
|
+
|
|
65
|
+
client = AgentCampClient(project="support-agent", mode=Mode.OBSERVE)
|
|
66
|
+
graph = client.wrap_langgraph(graph)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Modes
|
|
70
|
+
|
|
71
|
+
| Mode | What it does |
|
|
72
|
+
| ---------- | ------------------------------------------------------------------- |
|
|
73
|
+
| `OBSERVE` | Collect traces from the teacher agent only. |
|
|
74
|
+
| `TRAIN` | Build a fine-tuned expert from collected traces. |
|
|
75
|
+
| `SHADOW` | Run the expert alongside the teacher without serving it. |
|
|
76
|
+
| `ACTIVATE` | Serve the expert, falling back to the teacher when needed. |
|
|
77
|
+
|
|
78
|
+
## Configuration
|
|
79
|
+
|
|
80
|
+
| Environment variable | Purpose |
|
|
81
|
+
| -------------------- | ---------------------------------------- |
|
|
82
|
+
| `AGENTCAMP_API_KEY` | API key used to authenticate the client. |
|
|
83
|
+
| `AGENTCAMP_BASE_URL` | Override the AgentCamp API base URL. |
|
|
84
|
+
|
|
85
|
+
## Development
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
python -m venv .venv
|
|
89
|
+
source .venv/bin/activate
|
|
90
|
+
pip install -e '.[dev]'
|
|
91
|
+
pytest
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## License
|
|
95
|
+
|
|
96
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
CHANGELOG.md
|
|
2
|
+
LICENSE
|
|
3
|
+
MANIFEST.in
|
|
4
|
+
README.md
|
|
5
|
+
pyproject.toml
|
|
6
|
+
src/agentcamp/__init__.py
|
|
7
|
+
src/agentcamp/client.py
|
|
8
|
+
src/agentcamp/py.typed
|
|
9
|
+
src/agentcamp.egg-info/PKG-INFO
|
|
10
|
+
src/agentcamp.egg-info/SOURCES.txt
|
|
11
|
+
src/agentcamp.egg-info/dependency_links.txt
|
|
12
|
+
src/agentcamp.egg-info/requires.txt
|
|
13
|
+
src/agentcamp.egg-info/top_level.txt
|
|
14
|
+
tests/test_smoke.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
agentcamp
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import agentcamp
|
|
2
|
+
from agentcamp import AgentCampClient, AgentCampError, Mode, wrap_langgraph
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def test_version_exposed():
|
|
6
|
+
assert isinstance(agentcamp.__version__, str)
|
|
7
|
+
assert agentcamp.__version__.count(".") == 2
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_client_requires_project():
|
|
11
|
+
try:
|
|
12
|
+
AgentCampClient(project="")
|
|
13
|
+
except AgentCampError:
|
|
14
|
+
pass
|
|
15
|
+
else:
|
|
16
|
+
raise AssertionError("empty project should raise AgentCampError")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_client_defaults():
|
|
20
|
+
client = AgentCampClient(project="support-agent")
|
|
21
|
+
assert client.project == "support-agent"
|
|
22
|
+
assert client.mode is Mode.OBSERVE
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_wrap_langgraph_is_passthrough():
|
|
26
|
+
sentinel = object()
|
|
27
|
+
assert wrap_langgraph(sentinel, project="support-agent") is sentinel
|