Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
a1fc137
Add Wave A production-readiness design spec
AndresL230 May 13, 2026
a0afa37
Add Wave A implementation plan
AndresL230 May 13, 2026
bbda447
ci: add ruff + mypy + pytest matrix on Python 3.9-3.12
AndresL230 May 13, 2026
2f6b8e0
fix(types): annotate to_dict returns as dict[str, Any] for mypy strict
AndresL230 May 13, 2026
c37e6c3
fix(interceptor): mypy strict — type wrappers, latency_ms float, drop…
AndresL230 May 13, 2026
d556c8b
fix: clean remaining mypy/ruff issues across recost/
AndresL230 May 13, 2026
170b55a
fix(interceptor): use bare 'raise' to preserve traceback context (#13)
AndresL230 May 13, 2026
9263bbf
fix: remove unused exception variables in _interceptor.py
AndresL230 May 13, 2026
67a7e74
fix: post-rebase cleanup of unused imports and stale type-ignore
AndresL230 May 13, 2026
e298ae6
feat(errors): add RecostError base class
AndresL230 May 13, 2026
3c483ca
feat(init): record current pid on RecostHandle for fork-safety backstop
AndresL230 May 13, 2026
2d610bd
feat(init): add RecostHandle.reinit_after_fork for explicit fork reco…
AndresL230 May 13, 2026
0adf7f4
feat(init): register os.register_at_fork hook for automatic child rei…
AndresL230 May 13, 2026
757e321
feat(init): PID backstop on event path for hook-less fork environment…
AndresL230 May 13, 2026
513d390
fix(interceptor): guard reentrancy across tasks AND threads (#15)
AndresL230 May 13, 2026
7864067
fix(interceptor): revert overbuilt Thread.__init__ patch; keep dual g…
AndresL230 May 13, 2026
79350a7
feat(errors): add RecostAuthError and RecostFatalAuthError
AndresL230 May 13, 2026
88bb42d
feat(errors): add RecostRateLimitError
AndresL230 May 13, 2026
0be6fd6
feat(init): validate api_key format at init() (#17)
AndresL230 May 13, 2026
2775ec9
refactor(transport): _post_cloud returns _CloudResult with parsed Ret…
AndresL230 May 13, 2026
45ca77f
feat(transport): 401 escalation — RecostAuthError per failure, Fatal …
AndresL230 May 13, 2026
8949b80
feat(transport): honor 429 Retry-After — emit RateLimitError, defer n…
AndresL230 May 13, 2026
ff5fd34
fix(interceptor): measure aiohttp json= and FormData body sizes (#8)
AndresL230 May 13, 2026
02ca557
fix(interceptor): guard httpx streaming bodies — never materialize it…
AndresL230 May 13, 2026
4d20a75
docs(readme): clarify streaming caveats for request/response byte counts
AndresL230 May 13, 2026
c4f9ba1
fix(tests): use rc- prefix in atexit subprocess test for api_key vali…
AndresL230 May 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: CI

on:
pull_request:
push:
branches: [main]

jobs:
check:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install
run: |
python -m pip install --upgrade pip
pip install -e ".[dev,all]"
- name: Ruff
run: ruff check recost/ tests/
- name: Mypy
run: mypy recost/
- name: Pytest
run: pytest -v
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,8 @@ Unrecognized hosts still appear in telemetry, grouped under `"unknown"`.
- Request timestamp, method, URL (query params stripped), host, path
- Response status code
- Round-trip latency (ms)
- Request and response body size (bytes)
- Request body size (bytes) — measured for JSON, form, bytes, and string payloads. Streaming uploads (async iterators, generators) are reported as 0 to avoid buffering large bodies.
- Response body size (bytes) — derived from the `Content-Length` response header. HTTP chunked and SSE streams do not set this header and will report 0.
- Matched provider, endpoint category, and estimated cost

**Never captured:**
Expand Down
Loading
Loading