phronesis-framework 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.
- phronesis_framework-0.1.0/.commitlintrc.yml +10 -0
- phronesis_framework-0.1.0/.github/actions/setup-python-uv/action.yml +38 -0
- phronesis_framework-0.1.0/.github/dependabot.yml +15 -0
- phronesis_framework-0.1.0/.github/workflows/branch-ci.yml +67 -0
- phronesis_framework-0.1.0/.github/workflows/pr-ci.yml +139 -0
- phronesis_framework-0.1.0/.github/workflows/release.yml +68 -0
- phronesis_framework-0.1.0/.github/workflows/scheduled-security.yml +30 -0
- phronesis_framework-0.1.0/.github/workflows/sonarcloud.yml +42 -0
- phronesis_framework-0.1.0/.gitignore +40 -0
- phronesis_framework-0.1.0/.pre-commit-config.yaml +36 -0
- phronesis_framework-0.1.0/.python-version +1 -0
- phronesis_framework-0.1.0/PKG-INFO +79 -0
- phronesis_framework-0.1.0/deploy/observability/.gitignore +4 -0
- phronesis_framework-0.1.0/deploy/observability/README.md +78 -0
- phronesis_framework-0.1.0/deploy/observability/docker-compose.dev.yml +28 -0
- phronesis_framework-0.1.0/deploy/observability/docker-compose.prod.yml +126 -0
- phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-agents.json +47 -0
- phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-overview.json +81 -0
- phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-pipelines.json +38 -0
- phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-providers.json +56 -0
- phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-retries.json +35 -0
- phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-tools.json +42 -0
- phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-traces-explorer.json +37 -0
- phronesis_framework-0.1.0/deploy/observability/grafana/provisioning/dashboards/dashboards.yaml +15 -0
- phronesis_framework-0.1.0/deploy/observability/grafana/provisioning/datasources/datasources.yaml +61 -0
- phronesis_framework-0.1.0/deploy/observability/grafana/provisioning/datasources-dev/datasources.yaml +65 -0
- phronesis_framework-0.1.0/deploy/observability/loki/loki.yaml +47 -0
- phronesis_framework-0.1.0/deploy/observability/otel-collector/config.yaml +53 -0
- phronesis_framework-0.1.0/deploy/observability/prometheus/prometheus.yml +25 -0
- phronesis_framework-0.1.0/deploy/observability/scripts/obs_demo.py +199 -0
- phronesis_framework-0.1.0/deploy/observability/tempo/tempo.yaml +55 -0
- phronesis_framework-0.1.0/docs/agents/index.md +568 -0
- phronesis_framework-0.1.0/docs/communication/index.md +259 -0
- phronesis_framework-0.1.0/docs/context/index.md +430 -0
- phronesis_framework-0.1.0/docs/core/index.md +355 -0
- phronesis_framework-0.1.0/docs/examples/customer-support-system.md +461 -0
- phronesis_framework-0.1.0/docs/index.md +58 -0
- phronesis_framework-0.1.0/docs/internal/concurrency/index.md +247 -0
- phronesis_framework-0.1.0/docs/internal/http/index.md +244 -0
- phronesis_framework-0.1.0/docs/internal/ids/index.md +224 -0
- phronesis_framework-0.1.0/docs/internal/index.md +96 -0
- phronesis_framework-0.1.0/docs/internal/logging/index.md +212 -0
- phronesis_framework-0.1.0/docs/internal/retry/index.md +257 -0
- phronesis_framework-0.1.0/docs/internal/typing/index.md +227 -0
- phronesis_framework-0.1.0/docs/mcp/index.md +320 -0
- phronesis_framework-0.1.0/docs/memory/index.md +386 -0
- phronesis_framework-0.1.0/docs/middleware/index.md +293 -0
- phronesis_framework-0.1.0/docs/obs/dashboards.md +168 -0
- phronesis_framework-0.1.0/docs/obs/index.md +356 -0
- phronesis_framework-0.1.0/docs/obs/stack.md +168 -0
- phronesis_framework-0.1.0/docs/pipelines/index.md +400 -0
- phronesis_framework-0.1.0/docs/providers/anthropic/index.md +170 -0
- phronesis_framework-0.1.0/docs/providers/index.md +655 -0
- phronesis_framework-0.1.0/docs/providers/openai/index.md +172 -0
- phronesis_framework-0.1.0/docs/replay/index.md +329 -0
- phronesis_framework-0.1.0/docs/runtime/index.md +624 -0
- phronesis_framework-0.1.0/docs/tools/index.md +1014 -0
- phronesis_framework-0.1.0/public/assets/favicon/favicon.svg +5 -0
- phronesis_framework-0.1.0/public/assets/favicon/safari-pinned-tab.svg +3 -0
- phronesis_framework-0.1.0/public/assets/lockup/lockup-horizontal-dark.svg +9 -0
- phronesis_framework-0.1.0/public/assets/lockup/lockup-horizontal-monochrome.svg +9 -0
- phronesis_framework-0.1.0/public/assets/lockup/lockup-horizontal.svg +9 -0
- phronesis_framework-0.1.0/public/assets/lockup/lockup-vertical.svg +9 -0
- phronesis_framework-0.1.0/public/assets/phronesis-banner.png +0 -0
- phronesis_framework-0.1.0/public/assets/phronesis-master.svg +19 -0
- phronesis_framework-0.1.0/public/assets/symbol/symbol-light.svg +4 -0
- phronesis_framework-0.1.0/public/assets/symbol/symbol.svg +4 -0
- phronesis_framework-0.1.0/public/assets/wordmark/wordmark-dark.svg +5 -0
- phronesis_framework-0.1.0/public/assets/wordmark/wordmark-light.svg +5 -0
- phronesis_framework-0.1.0/public/assets/wordmark/wordmark.svg +5 -0
- phronesis_framework-0.1.0/pyproject.toml +70 -0
- phronesis_framework-0.1.0/sonar-project.properties +20 -0
- phronesis_framework-0.1.0/src/phronesis/__init__.py +38 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/__init__.py +1 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/concurrency/__init__.py +18 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/concurrency/exceptions.py +39 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/concurrency/executor.py +71 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/concurrency/gather.py +65 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/concurrency/policies.py +70 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/http/__init__.py +35 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/http/client.py +429 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/http/exceptions.py +61 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/http/headers.py +34 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/http/models.py +33 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/http/timeouts.py +29 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/ids/__init__.py +13 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/ids/derivation.py +10 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/ids/generator.py +24 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/ids/id.py +37 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/ids/validator.py +26 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/logging/__init__.py +20 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/logging/adapter.py +30 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/logging/config.py +49 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/logging/constants.py +12 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/logging/factory.py +18 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/logging/formatters.py +94 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/retry/__init__.py +18 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/retry/attempt.py +18 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/retry/backoff.py +46 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/retry/decorator.py +191 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/retry/exceptions.py +27 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/typing/__init__.py +45 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/typing/binary.py +13 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/typing/json.py +9 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/typing/maybe.py +36 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/typing/newtypes.py +11 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/typing/protocols.py +22 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/typing/result.py +27 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/typing/sentinels.py +21 -0
- phronesis_framework-0.1.0/src/phronesis/_internal/typing/streaming.py +21 -0
- phronesis_framework-0.1.0/src/phronesis/agents/__init__.py +81 -0
- phronesis_framework-0.1.0/src/phronesis/agents/agent.py +292 -0
- phronesis_framework-0.1.0/src/phronesis/agents/decorator.py +200 -0
- phronesis_framework-0.1.0/src/phronesis/agents/errors.py +100 -0
- phronesis_framework-0.1.0/src/phronesis/agents/events.py +137 -0
- phronesis_framework-0.1.0/src/phronesis/agents/hooks.py +78 -0
- phronesis_framework-0.1.0/src/phronesis/agents/id.py +35 -0
- phronesis_framework-0.1.0/src/phronesis/agents/loop.py +883 -0
- phronesis_framework-0.1.0/src/phronesis/agents/registry.py +165 -0
- phronesis_framework-0.1.0/src/phronesis/agents/run.py +141 -0
- phronesis_framework-0.1.0/src/phronesis/agents/session.py +122 -0
- phronesis_framework-0.1.0/src/phronesis/agents/spec.py +88 -0
- phronesis_framework-0.1.0/src/phronesis/agents/validation.py +128 -0
- phronesis_framework-0.1.0/src/phronesis/communication/__init__.py +1 -0
- phronesis_framework-0.1.0/src/phronesis/communication/session_id.py +16 -0
- phronesis_framework-0.1.0/src/phronesis/context/__init__.py +41 -0
- phronesis_framework-0.1.0/src/phronesis/context/budget.py +17 -0
- phronesis_framework-0.1.0/src/phronesis/context/chain.py +101 -0
- phronesis_framework-0.1.0/src/phronesis/context/compacting.py +387 -0
- phronesis_framework-0.1.0/src/phronesis/context/context.py +50 -0
- phronesis_framework-0.1.0/src/phronesis/context/default.py +55 -0
- phronesis_framework-0.1.0/src/phronesis/context/dry_run.py +88 -0
- phronesis_framework-0.1.0/src/phronesis/context/errors.py +30 -0
- phronesis_framework-0.1.0/src/phronesis/context/input.py +42 -0
- phronesis_framework-0.1.0/src/phronesis/context/protocol.py +45 -0
- phronesis_framework-0.1.0/src/phronesis/core/__init__.py +36 -0
- phronesis_framework-0.1.0/src/phronesis/core/messages.py +251 -0
- phronesis_framework-0.1.0/src/phronesis/errors.py +36 -0
- phronesis_framework-0.1.0/src/phronesis/mcp/__init__.py +62 -0
- phronesis_framework-0.1.0/src/phronesis/mcp/_adapt.py +211 -0
- phronesis_framework-0.1.0/src/phronesis/mcp/client.py +165 -0
- phronesis_framework-0.1.0/src/phronesis/mcp/errors.py +58 -0
- phronesis_framework-0.1.0/src/phronesis/mcp/ids.py +50 -0
- phronesis_framework-0.1.0/src/phronesis/mcp/obs.py +52 -0
- phronesis_framework-0.1.0/src/phronesis/mcp/server.py +229 -0
- phronesis_framework-0.1.0/src/phronesis/mcp/server_spec.py +65 -0
- phronesis_framework-0.1.0/src/phronesis/mcp/transport.py +53 -0
- phronesis_framework-0.1.0/src/phronesis/memory/__init__.py +98 -0
- phronesis_framework-0.1.0/src/phronesis/memory/checkpoint.py +201 -0
- phronesis_framework-0.1.0/src/phronesis/memory/context_builder.py +194 -0
- phronesis_framework-0.1.0/src/phronesis/memory/episodic/__init__.py +22 -0
- phronesis_framework-0.1.0/src/phronesis/memory/episodic/filesystem.py +172 -0
- phronesis_framework-0.1.0/src/phronesis/memory/episodic/in_memory.py +92 -0
- phronesis_framework-0.1.0/src/phronesis/memory/episodic/protocol.py +81 -0
- phronesis_framework-0.1.0/src/phronesis/memory/errors.py +50 -0
- phronesis_framework-0.1.0/src/phronesis/memory/hooks.py +89 -0
- phronesis_framework-0.1.0/src/phronesis/memory/kv/__init__.py +21 -0
- phronesis_framework-0.1.0/src/phronesis/memory/kv/filesystem.py +247 -0
- phronesis_framework-0.1.0/src/phronesis/memory/kv/in_memory.py +175 -0
- phronesis_framework-0.1.0/src/phronesis/memory/kv/protocol.py +70 -0
- phronesis_framework-0.1.0/src/phronesis/memory/obs.py +100 -0
- phronesis_framework-0.1.0/src/phronesis/memory/scope.py +111 -0
- phronesis_framework-0.1.0/src/phronesis/memory/tools.py +296 -0
- phronesis_framework-0.1.0/src/phronesis/memory/vector/__init__.py +28 -0
- phronesis_framework-0.1.0/src/phronesis/memory/vector/_cosine.py +34 -0
- phronesis_framework-0.1.0/src/phronesis/memory/vector/embeddings.py +69 -0
- phronesis_framework-0.1.0/src/phronesis/memory/vector/filesystem.py +174 -0
- phronesis_framework-0.1.0/src/phronesis/memory/vector/in_memory.py +102 -0
- phronesis_framework-0.1.0/src/phronesis/memory/vector/protocol.py +94 -0
- phronesis_framework-0.1.0/src/phronesis/memory/working.py +165 -0
- phronesis_framework-0.1.0/src/phronesis/middleware/__init__.py +30 -0
- phronesis_framework-0.1.0/src/phronesis/middleware/chain.py +102 -0
- phronesis_framework-0.1.0/src/phronesis/middleware/errors.py +13 -0
- phronesis_framework-0.1.0/src/phronesis/middleware/protocol.py +58 -0
- phronesis_framework-0.1.0/src/phronesis/obs/__init__.py +49 -0
- phronesis_framework-0.1.0/src/phronesis/obs/_detect.py +28 -0
- phronesis_framework-0.1.0/src/phronesis/obs/_noop.py +71 -0
- phronesis_framework-0.1.0/src/phronesis/obs/attributes.py +82 -0
- phronesis_framework-0.1.0/src/phronesis/obs/config.py +257 -0
- phronesis_framework-0.1.0/src/phronesis/obs/errors.py +25 -0
- phronesis_framework-0.1.0/src/phronesis/obs/logging_filter.py +97 -0
- phronesis_framework-0.1.0/src/phronesis/obs/metrics.py +146 -0
- phronesis_framework-0.1.0/src/phronesis/obs/spans.py +165 -0
- phronesis_framework-0.1.0/src/phronesis/pipelines/__init__.py +28 -0
- phronesis_framework-0.1.0/src/phronesis/pipelines/errors.py +21 -0
- phronesis_framework-0.1.0/src/phronesis/pipelines/ids.py +63 -0
- phronesis_framework-0.1.0/src/phronesis/pipelines/pipeline.py +250 -0
- phronesis_framework-0.1.0/src/phronesis/providers/__init__.py +80 -0
- phronesis_framework-0.1.0/src/phronesis/providers/_common/__init__.py +9 -0
- phronesis_framework-0.1.0/src/phronesis/providers/anthropic/__init__.py +13 -0
- phronesis_framework-0.1.0/src/phronesis/providers/anthropic/errors.py +113 -0
- phronesis_framework-0.1.0/src/phronesis/providers/anthropic/factory.py +81 -0
- phronesis_framework-0.1.0/src/phronesis/providers/anthropic/messages.py +248 -0
- phronesis_framework-0.1.0/src/phronesis/providers/anthropic/provider.py +344 -0
- phronesis_framework-0.1.0/src/phronesis/providers/anthropic/streaming.py +305 -0
- phronesis_framework-0.1.0/src/phronesis/providers/anthropic/tools.py +48 -0
- phronesis_framework-0.1.0/src/phronesis/providers/chunks.py +85 -0
- phronesis_framework-0.1.0/src/phronesis/providers/errors.py +98 -0
- phronesis_framework-0.1.0/src/phronesis/providers/fallback.py +145 -0
- phronesis_framework-0.1.0/src/phronesis/providers/openai/__init__.py +20 -0
- phronesis_framework-0.1.0/src/phronesis/providers/openai/errors.py +101 -0
- phronesis_framework-0.1.0/src/phronesis/providers/openai/factory.py +98 -0
- phronesis_framework-0.1.0/src/phronesis/providers/openai/helpers.py +189 -0
- phronesis_framework-0.1.0/src/phronesis/providers/openai/messages.py +180 -0
- phronesis_framework-0.1.0/src/phronesis/providers/openai/provider.py +403 -0
- phronesis_framework-0.1.0/src/phronesis/providers/openai/streaming.py +275 -0
- phronesis_framework-0.1.0/src/phronesis/providers/openai/tools.py +50 -0
- phronesis_framework-0.1.0/src/phronesis/providers/protocol.py +156 -0
- phronesis_framework-0.1.0/src/phronesis/providers/retry_config.py +81 -0
- phronesis_framework-0.1.0/src/phronesis/providers/translation.py +167 -0
- phronesis_framework-0.1.0/src/phronesis/providers/types.py +186 -0
- phronesis_framework-0.1.0/src/phronesis/providers/usage.py +32 -0
- phronesis_framework-0.1.0/src/phronesis/replay/__init__.py +57 -0
- phronesis_framework-0.1.0/src/phronesis/replay/cassette.py +148 -0
- phronesis_framework-0.1.0/src/phronesis/replay/errors.py +23 -0
- phronesis_framework-0.1.0/src/phronesis/replay/recording.py +82 -0
- phronesis_framework-0.1.0/src/phronesis/replay/replay.py +127 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/__init__.py +99 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/context.py +153 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/errors.py +77 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/__init__.py +5 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/approval.py +78 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/cascade.py +55 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/conditional.py +41 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/consensus.py +100 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/debate.py +80 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/fallback.py +50 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/handoff_chain.py +100 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/loop.py +80 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/map_reduce.py +81 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/parallel.py +82 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/plan_and_execute.py +79 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/race.py +90 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/reflexion.py +116 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/retry.py +83 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/router.py +57 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/sequence.py +59 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/supervisor.py +113 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/tree_search.py +151 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/modes/validation.py +88 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/node.py +150 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/obs.py +95 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/outcome.py +147 -0
- phronesis_framework-0.1.0/src/phronesis/runtime/protocol.py +36 -0
- phronesis_framework-0.1.0/src/phronesis/testing/__init__.py +19 -0
- phronesis_framework-0.1.0/src/phronesis/testing/providers.py +159 -0
- phronesis_framework-0.1.0/src/phronesis/tools/__init__.py +76 -0
- phronesis_framework-0.1.0/src/phronesis/tools/cache.py +141 -0
- phronesis_framework-0.1.0/src/phronesis/tools/decorator.py +184 -0
- phronesis_framework-0.1.0/src/phronesis/tools/discover.py +48 -0
- phronesis_framework-0.1.0/src/phronesis/tools/effects.py +46 -0
- phronesis_framework-0.1.0/src/phronesis/tools/errors.py +262 -0
- phronesis_framework-0.1.0/src/phronesis/tools/injection.py +82 -0
- phronesis_framework-0.1.0/src/phronesis/tools/lifecycle.py +47 -0
- phronesis_framework-0.1.0/src/phronesis/tools/markers.py +39 -0
- phronesis_framework-0.1.0/src/phronesis/tools/providers/__init__.py +47 -0
- phronesis_framework-0.1.0/src/phronesis/tools/providers/anthropic.py +52 -0
- phronesis_framework-0.1.0/src/phronesis/tools/providers/base.py +52 -0
- phronesis_framework-0.1.0/src/phronesis/tools/providers/openai.py +56 -0
- phronesis_framework-0.1.0/src/phronesis/tools/registry.py +148 -0
- phronesis_framework-0.1.0/src/phronesis/tools/retry.py +65 -0
- phronesis_framework-0.1.0/src/phronesis/tools/schema.py +216 -0
- phronesis_framework-0.1.0/src/phronesis/tools/single_model.py +92 -0
- phronesis_framework-0.1.0/src/phronesis/tools/spec.py +106 -0
- phronesis_framework-0.1.0/src/phronesis/tools/tool.py +317 -0
- phronesis_framework-0.1.0/src/phronesis/tools/tool_id.py +44 -0
- phronesis_framework-0.1.0/src/phronesis/tools/validation.py +160 -0
- phronesis_framework-0.1.0/src/phronesis/tools/version.py +108 -0
- phronesis_framework-0.1.0/tests/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/_internal/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/_internal/concurrency/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/_internal/concurrency/test_exceptions.py +40 -0
- phronesis_framework-0.1.0/tests/_internal/concurrency/test_executor.py +52 -0
- phronesis_framework-0.1.0/tests/_internal/concurrency/test_gather.py +112 -0
- phronesis_framework-0.1.0/tests/_internal/concurrency/test_policies.py +65 -0
- phronesis_framework-0.1.0/tests/_internal/http/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/_internal/http/test_client.py +185 -0
- phronesis_framework-0.1.0/tests/_internal/http/test_exceptions.py +74 -0
- phronesis_framework-0.1.0/tests/_internal/http/test_headers.py +36 -0
- phronesis_framework-0.1.0/tests/_internal/http/test_logging.py +93 -0
- phronesis_framework-0.1.0/tests/_internal/http/test_models.py +45 -0
- phronesis_framework-0.1.0/tests/_internal/http/test_streaming.py +66 -0
- phronesis_framework-0.1.0/tests/_internal/http/test_timeouts.py +34 -0
- phronesis_framework-0.1.0/tests/_internal/ids/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/_internal/ids/test_generator.py +43 -0
- phronesis_framework-0.1.0/tests/_internal/ids/test_id.py +53 -0
- phronesis_framework-0.1.0/tests/_internal/ids/test_validators.py +39 -0
- phronesis_framework-0.1.0/tests/_internal/logging/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/_internal/logging/test_adapter.py +85 -0
- phronesis_framework-0.1.0/tests/_internal/logging/test_concurrency.py +68 -0
- phronesis_framework-0.1.0/tests/_internal/logging/test_configure.py +68 -0
- phronesis_framework-0.1.0/tests/_internal/logging/test_factory.py +42 -0
- phronesis_framework-0.1.0/tests/_internal/logging/test_formatters.py +107 -0
- phronesis_framework-0.1.0/tests/_internal/retry/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/_internal/retry/test_attempt.py +28 -0
- phronesis_framework-0.1.0/tests/_internal/retry/test_backoff.py +47 -0
- phronesis_framework-0.1.0/tests/_internal/retry/test_decorator.py +301 -0
- phronesis_framework-0.1.0/tests/_internal/retry/test_exceptions.py +38 -0
- phronesis_framework-0.1.0/tests/_internal/typing/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/_internal/typing/test_binary.py +39 -0
- phronesis_framework-0.1.0/tests/_internal/typing/test_json.py +82 -0
- phronesis_framework-0.1.0/tests/_internal/typing/test_maybe.py +57 -0
- phronesis_framework-0.1.0/tests/_internal/typing/test_newtypes.py +46 -0
- phronesis_framework-0.1.0/tests/_internal/typing/test_protocols.py +41 -0
- phronesis_framework-0.1.0/tests/_internal/typing/test_result.py +64 -0
- phronesis_framework-0.1.0/tests/_internal/typing/test_sentinels.py +29 -0
- phronesis_framework-0.1.0/tests/_internal/typing/test_streaming.py +47 -0
- phronesis_framework-0.1.0/tests/agents/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/agents/conftest.py +69 -0
- phronesis_framework-0.1.0/tests/agents/test_agent.py +294 -0
- phronesis_framework-0.1.0/tests/agents/test_agent_stream.py +160 -0
- phronesis_framework-0.1.0/tests/agents/test_decorator.py +162 -0
- phronesis_framework-0.1.0/tests/agents/test_errors.py +98 -0
- phronesis_framework-0.1.0/tests/agents/test_events.py +148 -0
- phronesis_framework-0.1.0/tests/agents/test_hooks.py +151 -0
- phronesis_framework-0.1.0/tests/agents/test_id.py +76 -0
- phronesis_framework-0.1.0/tests/agents/test_loop.py +414 -0
- phronesis_framework-0.1.0/tests/agents/test_loop_budget.py +154 -0
- phronesis_framework-0.1.0/tests/agents/test_loop_cache_translation.py +63 -0
- phronesis_framework-0.1.0/tests/agents/test_loop_context.py +139 -0
- phronesis_framework-0.1.0/tests/agents/test_loop_context_builder.py +163 -0
- phronesis_framework-0.1.0/tests/agents/test_loop_metrics.py +290 -0
- phronesis_framework-0.1.0/tests/agents/test_loop_obs.py +303 -0
- phronesis_framework-0.1.0/tests/agents/test_public_api.py +52 -0
- phronesis_framework-0.1.0/tests/agents/test_registry.py +135 -0
- phronesis_framework-0.1.0/tests/agents/test_run.py +261 -0
- phronesis_framework-0.1.0/tests/agents/test_session.py +188 -0
- phronesis_framework-0.1.0/tests/agents/test_spec.py +158 -0
- phronesis_framework-0.1.0/tests/agents/test_tool_lifecycle.py +174 -0
- phronesis_framework-0.1.0/tests/agents/test_tool_not_found_suggestion.py +56 -0
- phronesis_framework-0.1.0/tests/agents/test_tool_retry.py +158 -0
- phronesis_framework-0.1.0/tests/agents/test_validation.py +113 -0
- phronesis_framework-0.1.0/tests/communication/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/communication/test_session_id.py +44 -0
- phronesis_framework-0.1.0/tests/context/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/context/conftest.py +57 -0
- phronesis_framework-0.1.0/tests/context/test_budget.py +65 -0
- phronesis_framework-0.1.0/tests/context/test_chain.py +132 -0
- phronesis_framework-0.1.0/tests/context/test_compacting.py +267 -0
- phronesis_framework-0.1.0/tests/context/test_context.py +111 -0
- phronesis_framework-0.1.0/tests/context/test_default.py +115 -0
- phronesis_framework-0.1.0/tests/context/test_dry_run.py +68 -0
- phronesis_framework-0.1.0/tests/context/test_errors.py +40 -0
- phronesis_framework-0.1.0/tests/context/test_input.py +69 -0
- phronesis_framework-0.1.0/tests/context/test_protocol.py +46 -0
- phronesis_framework-0.1.0/tests/core/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/core/test_messages.py +260 -0
- phronesis_framework-0.1.0/tests/core/test_messages_multimodal.py +57 -0
- phronesis_framework-0.1.0/tests/mcp/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/mcp/conftest.py +54 -0
- phronesis_framework-0.1.0/tests/mcp/test_client.py +133 -0
- phronesis_framework-0.1.0/tests/mcp/test_client_adapter.py +203 -0
- phronesis_framework-0.1.0/tests/mcp/test_errors.py +49 -0
- phronesis_framework-0.1.0/tests/mcp/test_ids.py +59 -0
- phronesis_framework-0.1.0/tests/mcp/test_integration.py +72 -0
- phronesis_framework-0.1.0/tests/mcp/test_obs.py +62 -0
- phronesis_framework-0.1.0/tests/mcp/test_server.py +115 -0
- phronesis_framework-0.1.0/tests/mcp/test_server_adapter.py +46 -0
- phronesis_framework-0.1.0/tests/mcp/test_server_spec.py +67 -0
- phronesis_framework-0.1.0/tests/mcp/test_transport.py +56 -0
- phronesis_framework-0.1.0/tests/memory/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/memory/conftest.py +61 -0
- phronesis_framework-0.1.0/tests/memory/episodic/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/memory/episodic/test_filesystem_json.py +136 -0
- phronesis_framework-0.1.0/tests/memory/episodic/test_in_memory.py +123 -0
- phronesis_framework-0.1.0/tests/memory/kv/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/memory/kv/test_filesystem_json.py +119 -0
- phronesis_framework-0.1.0/tests/memory/kv/test_in_memory.py +151 -0
- phronesis_framework-0.1.0/tests/memory/test_checkpoint.py +135 -0
- phronesis_framework-0.1.0/tests/memory/test_context_builder.py +199 -0
- phronesis_framework-0.1.0/tests/memory/test_errors.py +41 -0
- phronesis_framework-0.1.0/tests/memory/test_hooks.py +103 -0
- phronesis_framework-0.1.0/tests/memory/test_obs.py +65 -0
- phronesis_framework-0.1.0/tests/memory/test_scope.py +81 -0
- phronesis_framework-0.1.0/tests/memory/test_tools.py +114 -0
- phronesis_framework-0.1.0/tests/memory/vector/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/memory/vector/test_deterministic_embedding.py +63 -0
- phronesis_framework-0.1.0/tests/memory/vector/test_filesystem_json.py +122 -0
- phronesis_framework-0.1.0/tests/memory/vector/test_in_memory.py +122 -0
- phronesis_framework-0.1.0/tests/memory/working/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/memory/working/test_in_memory.py +126 -0
- phronesis_framework-0.1.0/tests/middleware/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/middleware/test_chain.py +182 -0
- phronesis_framework-0.1.0/tests/middleware/test_protocol.py +24 -0
- phronesis_framework-0.1.0/tests/obs/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/obs/conftest.py +21 -0
- phronesis_framework-0.1.0/tests/obs/test_attributes.py +96 -0
- phronesis_framework-0.1.0/tests/obs/test_config.py +348 -0
- phronesis_framework-0.1.0/tests/obs/test_detect.py +24 -0
- phronesis_framework-0.1.0/tests/obs/test_errors.py +25 -0
- phronesis_framework-0.1.0/tests/obs/test_logging_filter.py +183 -0
- phronesis_framework-0.1.0/tests/obs/test_metrics.py +72 -0
- phronesis_framework-0.1.0/tests/obs/test_noop.py +108 -0
- phronesis_framework-0.1.0/tests/obs/test_package.py +41 -0
- phronesis_framework-0.1.0/tests/obs/test_public_api.py +63 -0
- phronesis_framework-0.1.0/tests/obs/test_spans.py +202 -0
- phronesis_framework-0.1.0/tests/obs/test_traced.py +162 -0
- phronesis_framework-0.1.0/tests/observability/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/pipelines/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/pipelines/conftest.py +38 -0
- phronesis_framework-0.1.0/tests/pipelines/test_decorator.py +109 -0
- phronesis_framework-0.1.0/tests/pipelines/test_factory.py +78 -0
- phronesis_framework-0.1.0/tests/pipelines/test_ids.py +47 -0
- phronesis_framework-0.1.0/tests/pipelines/test_integration.py +68 -0
- phronesis_framework-0.1.0/tests/pipelines/test_pipeline.py +164 -0
- phronesis_framework-0.1.0/tests/pipelines/test_run.py +43 -0
- phronesis_framework-0.1.0/tests/providers/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/providers/_common/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/providers/anthropic/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/providers/anthropic/test_errors.py +133 -0
- phronesis_framework-0.1.0/tests/providers/anthropic/test_factory.py +74 -0
- phronesis_framework-0.1.0/tests/providers/anthropic/test_messages.py +162 -0
- phronesis_framework-0.1.0/tests/providers/anthropic/test_messages_caching.py +141 -0
- phronesis_framework-0.1.0/tests/providers/anthropic/test_messages_multimodal.py +66 -0
- phronesis_framework-0.1.0/tests/providers/anthropic/test_provider.py +437 -0
- phronesis_framework-0.1.0/tests/providers/anthropic/test_provider_token_counting.py +117 -0
- phronesis_framework-0.1.0/tests/providers/anthropic/test_streaming.py +317 -0
- phronesis_framework-0.1.0/tests/providers/anthropic/test_tools.py +66 -0
- phronesis_framework-0.1.0/tests/providers/openai/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/providers/openai/test_errors.py +125 -0
- phronesis_framework-0.1.0/tests/providers/openai/test_factory.py +91 -0
- phronesis_framework-0.1.0/tests/providers/openai/test_messages.py +168 -0
- phronesis_framework-0.1.0/tests/providers/openai/test_messages_multimodal.py +61 -0
- phronesis_framework-0.1.0/tests/providers/openai/test_oss_factories.py +185 -0
- phronesis_framework-0.1.0/tests/providers/openai/test_provider.py +574 -0
- phronesis_framework-0.1.0/tests/providers/openai/test_provider_response_format.py +86 -0
- phronesis_framework-0.1.0/tests/providers/openai/test_provider_token_counting.py +48 -0
- phronesis_framework-0.1.0/tests/providers/openai/test_streaming.py +351 -0
- phronesis_framework-0.1.0/tests/providers/openai/test_tools.py +76 -0
- phronesis_framework-0.1.0/tests/providers/test_chunks.py +93 -0
- phronesis_framework-0.1.0/tests/providers/test_errors.py +61 -0
- phronesis_framework-0.1.0/tests/providers/test_fallback.py +230 -0
- phronesis_framework-0.1.0/tests/providers/test_package.py +32 -0
- phronesis_framework-0.1.0/tests/providers/test_portability.py +386 -0
- phronesis_framework-0.1.0/tests/providers/test_protocol.py +89 -0
- phronesis_framework-0.1.0/tests/providers/test_public_api.py +120 -0
- phronesis_framework-0.1.0/tests/providers/test_response_format.py +52 -0
- phronesis_framework-0.1.0/tests/providers/test_retry_config.py +108 -0
- phronesis_framework-0.1.0/tests/providers/test_translation.py +95 -0
- phronesis_framework-0.1.0/tests/providers/test_translation_multimodal.py +56 -0
- phronesis_framework-0.1.0/tests/providers/test_types.py +115 -0
- phronesis_framework-0.1.0/tests/providers/test_usage.py +53 -0
- phronesis_framework-0.1.0/tests/replay/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/replay/test_cassette.py +106 -0
- phronesis_framework-0.1.0/tests/replay/test_recording.py +128 -0
- phronesis_framework-0.1.0/tests/replay/test_replay_provider.py +141 -0
- phronesis_framework-0.1.0/tests/runtime/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/runtime/conftest.py +65 -0
- phronesis_framework-0.1.0/tests/runtime/modes/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_approval.py +50 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_cascade.py +47 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_conditional.py +50 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_consensus.py +58 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_debate.py +38 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_fallback.py +39 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_handoff_chain.py +57 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_loop.py +45 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_map_reduce.py +51 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_parallel.py +55 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_plan_and_execute.py +58 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_race.py +49 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_reflexion.py +59 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_retry.py +65 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_router.py +62 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_sequence.py +68 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_supervisor.py +57 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_tree_search.py +43 -0
- phronesis_framework-0.1.0/tests/runtime/modes/test_validation.py +59 -0
- phronesis_framework-0.1.0/tests/runtime/test_context.py +87 -0
- phronesis_framework-0.1.0/tests/runtime/test_errors.py +59 -0
- phronesis_framework-0.1.0/tests/runtime/test_integration.py +61 -0
- phronesis_framework-0.1.0/tests/runtime/test_node.py +74 -0
- phronesis_framework-0.1.0/tests/runtime/test_obs.py +49 -0
- phronesis_framework-0.1.0/tests/runtime/test_outcome.py +60 -0
- phronesis_framework-0.1.0/tests/test_errors.py +0 -0
- phronesis_framework-0.1.0/tests/testing/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/testing/test_providers.py +130 -0
- phronesis_framework-0.1.0/tests/tools/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/tools/conftest.py +16 -0
- phronesis_framework-0.1.0/tests/tools/providers/__init__.py +0 -0
- phronesis_framework-0.1.0/tests/tools/providers/test_anthropic.py +73 -0
- phronesis_framework-0.1.0/tests/tools/providers/test_openai.py +76 -0
- phronesis_framework-0.1.0/tests/tools/test_cache.py +126 -0
- phronesis_framework-0.1.0/tests/tools/test_decorator.py +176 -0
- phronesis_framework-0.1.0/tests/tools/test_discover.py +115 -0
- phronesis_framework-0.1.0/tests/tools/test_effects.py +92 -0
- phronesis_framework-0.1.0/tests/tools/test_errors.py +231 -0
- phronesis_framework-0.1.0/tests/tools/test_injection.py +91 -0
- phronesis_framework-0.1.0/tests/tools/test_markers.py +59 -0
- phronesis_framework-0.1.0/tests/tools/test_public_api.py +183 -0
- phronesis_framework-0.1.0/tests/tools/test_registry.py +155 -0
- phronesis_framework-0.1.0/tests/tools/test_retry.py +51 -0
- phronesis_framework-0.1.0/tests/tools/test_schema.py +178 -0
- phronesis_framework-0.1.0/tests/tools/test_single_model.py +166 -0
- phronesis_framework-0.1.0/tests/tools/test_spec.py +275 -0
- phronesis_framework-0.1.0/tests/tools/test_tool.py +457 -0
- phronesis_framework-0.1.0/tests/tools/test_tool_cache.py +149 -0
- phronesis_framework-0.1.0/tests/tools/test_tool_id.py +84 -0
- phronesis_framework-0.1.0/tests/tools/test_validation.py +162 -0
- phronesis_framework-0.1.0/tests/tools/test_version.py +103 -0
- phronesis_framework-0.1.0/uv.lock +1495 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
extends:
|
|
2
|
+
- "@commitlint/config-conventional"
|
|
3
|
+
rules:
|
|
4
|
+
type-enum:
|
|
5
|
+
- 2
|
|
6
|
+
- always
|
|
7
|
+
- [feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert]
|
|
8
|
+
subject-case: [2, never, [upper-case, pascal-case, start-case]]
|
|
9
|
+
header-max-length: [2, always, 100]
|
|
10
|
+
body-max-line-length: [1, always, 120]
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
name: "Setup Python + uv"
|
|
2
|
+
description: "Instala uv, Python y sincroniza dependencias con cache"
|
|
3
|
+
inputs:
|
|
4
|
+
python-version:
|
|
5
|
+
description: "Python version"
|
|
6
|
+
required: false
|
|
7
|
+
default: "3.11"
|
|
8
|
+
extras:
|
|
9
|
+
description: "Extras a instalar (ej: 'dev', 'dev,test')"
|
|
10
|
+
required: false
|
|
11
|
+
default: "dev"
|
|
12
|
+
|
|
13
|
+
runs:
|
|
14
|
+
using: "composite"
|
|
15
|
+
steps:
|
|
16
|
+
- name: Install uv
|
|
17
|
+
uses: astral-sh/setup-uv@v3
|
|
18
|
+
with:
|
|
19
|
+
enable-cache: true
|
|
20
|
+
cache-dependency-glob: "uv.lock"
|
|
21
|
+
|
|
22
|
+
- name: Setup Python
|
|
23
|
+
uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: ${{ inputs.python-version }}
|
|
26
|
+
|
|
27
|
+
- name: Sync dependencies
|
|
28
|
+
shell: bash
|
|
29
|
+
run: |
|
|
30
|
+
flags=""
|
|
31
|
+
IFS=',' read -ra EXTRAS <<< "${{ inputs.extras }}"
|
|
32
|
+
for extra in "${EXTRAS[@]}"; do
|
|
33
|
+
extra="$(echo -n "$extra" | tr -d '[:space:]')"
|
|
34
|
+
if [ -n "$extra" ]; then
|
|
35
|
+
flags="$flags --extra $extra"
|
|
36
|
+
fi
|
|
37
|
+
done
|
|
38
|
+
uv sync $flags --frozen
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "github-actions"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
open-pull-requests-limit: 5
|
|
8
|
+
labels: ["ci", "dependencies"]
|
|
9
|
+
|
|
10
|
+
- package-ecosystem: "pip"
|
|
11
|
+
directory: "/"
|
|
12
|
+
schedule:
|
|
13
|
+
interval: "weekly"
|
|
14
|
+
open-pull-requests-limit: 5
|
|
15
|
+
labels: ["dependencies"]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
name: Branch CI (fast)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- "feat/**"
|
|
7
|
+
- "feats/**"
|
|
8
|
+
- "feature/**"
|
|
9
|
+
- "fix/**"
|
|
10
|
+
- "bugfix/**"
|
|
11
|
+
- "hotfix/**"
|
|
12
|
+
- "release/**"
|
|
13
|
+
- "refactor/**"
|
|
14
|
+
- "perf/**"
|
|
15
|
+
- "docs/**"
|
|
16
|
+
- "test/**"
|
|
17
|
+
- "build/**"
|
|
18
|
+
- "ci/**"
|
|
19
|
+
- "chore/**"
|
|
20
|
+
- "chores/**"
|
|
21
|
+
- "style/**"
|
|
22
|
+
- "revert/**"
|
|
23
|
+
|
|
24
|
+
concurrency:
|
|
25
|
+
group: branch-ci-${{ github.ref }}
|
|
26
|
+
cancel-in-progress: true
|
|
27
|
+
|
|
28
|
+
permissions:
|
|
29
|
+
contents: read
|
|
30
|
+
|
|
31
|
+
jobs:
|
|
32
|
+
format:
|
|
33
|
+
name: Format (ruff)
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@v4
|
|
37
|
+
- uses: ./.github/actions/setup-python-uv
|
|
38
|
+
- run: uv run ruff format --check .
|
|
39
|
+
|
|
40
|
+
lint:
|
|
41
|
+
name: Lint (ruff)
|
|
42
|
+
runs-on: ubuntu-latest
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v4
|
|
45
|
+
- uses: ./.github/actions/setup-python-uv
|
|
46
|
+
- run: uv run ruff check .
|
|
47
|
+
|
|
48
|
+
types:
|
|
49
|
+
name: Type check (mypy)
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
steps:
|
|
52
|
+
- uses: actions/checkout@v4
|
|
53
|
+
- uses: ./.github/actions/setup-python-uv
|
|
54
|
+
with:
|
|
55
|
+
extras: "dev,obs"
|
|
56
|
+
- run: uv run mypy src
|
|
57
|
+
|
|
58
|
+
test:
|
|
59
|
+
name: Tests (pytest)
|
|
60
|
+
runs-on: ubuntu-latest
|
|
61
|
+
needs: [format, lint, types]
|
|
62
|
+
steps:
|
|
63
|
+
- uses: actions/checkout@v4
|
|
64
|
+
- uses: ./.github/actions/setup-python-uv
|
|
65
|
+
with:
|
|
66
|
+
extras: "dev,obs"
|
|
67
|
+
- run: uv run pytest -x --no-cov
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
name: PR CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [develop, main]
|
|
6
|
+
types: [opened, synchronize, reopened, edited]
|
|
7
|
+
|
|
8
|
+
concurrency:
|
|
9
|
+
group: pr-ci-${{ github.event.pull_request.number }}
|
|
10
|
+
cancel-in-progress: true
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
pull-requests: read
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
# ---------- Format / Quality (siempre) ----------
|
|
18
|
+
pr-title:
|
|
19
|
+
name: PR title (conventional commits)
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- uses: amannn/action-semantic-pull-request@v5
|
|
23
|
+
env:
|
|
24
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
25
|
+
with:
|
|
26
|
+
types: |
|
|
27
|
+
feat
|
|
28
|
+
fix
|
|
29
|
+
docs
|
|
30
|
+
style
|
|
31
|
+
refactor
|
|
32
|
+
perf
|
|
33
|
+
test
|
|
34
|
+
build
|
|
35
|
+
ci
|
|
36
|
+
chore
|
|
37
|
+
revert
|
|
38
|
+
requireScope: false
|
|
39
|
+
subjectPattern: ^(?![A-Z]).+$
|
|
40
|
+
subjectPatternError: |
|
|
41
|
+
El subject del PR no debe empezar en may\u00fascula.
|
|
42
|
+
|
|
43
|
+
commit-lint:
|
|
44
|
+
name: Commit messages lint
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
steps:
|
|
47
|
+
- uses: actions/checkout@v4
|
|
48
|
+
with:
|
|
49
|
+
fetch-depth: 0
|
|
50
|
+
- uses: wagoid/commitlint-github-action@v6
|
|
51
|
+
with:
|
|
52
|
+
configFile: .commitlintrc.yml
|
|
53
|
+
|
|
54
|
+
format:
|
|
55
|
+
name: Format (ruff)
|
|
56
|
+
runs-on: ubuntu-latest
|
|
57
|
+
steps:
|
|
58
|
+
- uses: actions/checkout@v4
|
|
59
|
+
- uses: ./.github/actions/setup-python-uv
|
|
60
|
+
- run: uv run ruff format --check .
|
|
61
|
+
|
|
62
|
+
lint:
|
|
63
|
+
name: Lint (ruff)
|
|
64
|
+
runs-on: ubuntu-latest
|
|
65
|
+
steps:
|
|
66
|
+
- uses: actions/checkout@v4
|
|
67
|
+
- uses: ./.github/actions/setup-python-uv
|
|
68
|
+
- run: uv run ruff check --output-format=github .
|
|
69
|
+
|
|
70
|
+
types:
|
|
71
|
+
name: Type check (mypy)
|
|
72
|
+
runs-on: ubuntu-latest
|
|
73
|
+
steps:
|
|
74
|
+
- uses: actions/checkout@v4
|
|
75
|
+
- uses: ./.github/actions/setup-python-uv
|
|
76
|
+
with:
|
|
77
|
+
extras: "dev,obs"
|
|
78
|
+
- run: uv run mypy src
|
|
79
|
+
|
|
80
|
+
# ---------- Tests + Coverage ----------
|
|
81
|
+
test-coverage:
|
|
82
|
+
name: Tests + Coverage (line >=90, branch >=85)
|
|
83
|
+
runs-on: ubuntu-latest
|
|
84
|
+
needs: [format, lint, types]
|
|
85
|
+
steps:
|
|
86
|
+
- uses: actions/checkout@v4
|
|
87
|
+
- uses: ./.github/actions/setup-python-uv
|
|
88
|
+
with:
|
|
89
|
+
extras: "dev,obs"
|
|
90
|
+
- name: Run pytest with coverage
|
|
91
|
+
run: |
|
|
92
|
+
uv run pytest \
|
|
93
|
+
--cov=src/phronesis \
|
|
94
|
+
--cov-branch \
|
|
95
|
+
--cov-report=xml \
|
|
96
|
+
--cov-report=term-missing \
|
|
97
|
+
--cov-fail-under=90
|
|
98
|
+
- name: Enforce branch coverage threshold
|
|
99
|
+
run: |
|
|
100
|
+
uv run python -c "
|
|
101
|
+
import xml.etree.ElementTree as ET, sys
|
|
102
|
+
root = ET.parse('coverage.xml').getroot()
|
|
103
|
+
branch = float(root.get('branch-rate', 0)) * 100
|
|
104
|
+
print(f'Branch coverage: {branch:.2f}%')
|
|
105
|
+
sys.exit(0 if branch >= 85 else 1)
|
|
106
|
+
"
|
|
107
|
+
- uses: actions/upload-artifact@v4
|
|
108
|
+
with:
|
|
109
|
+
name: coverage-${{ github.sha }}
|
|
110
|
+
path: coverage.xml
|
|
111
|
+
retention-days: 7
|
|
112
|
+
|
|
113
|
+
# ---------- Security ----------
|
|
114
|
+
secrets-scan:
|
|
115
|
+
name: Secret detection (gitleaks)
|
|
116
|
+
runs-on: ubuntu-latest
|
|
117
|
+
steps:
|
|
118
|
+
- uses: actions/checkout@v4
|
|
119
|
+
with:
|
|
120
|
+
fetch-depth: 0
|
|
121
|
+
- uses: gitleaks/gitleaks-action@v2
|
|
122
|
+
env:
|
|
123
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
124
|
+
|
|
125
|
+
# ---------- Solo en PR -> main ----------
|
|
126
|
+
build:
|
|
127
|
+
name: Build (sdist + wheel)
|
|
128
|
+
if: github.base_ref == 'main'
|
|
129
|
+
runs-on: ubuntu-latest
|
|
130
|
+
needs: [test-coverage, secrets-scan]
|
|
131
|
+
steps:
|
|
132
|
+
- uses: actions/checkout@v4
|
|
133
|
+
- uses: ./.github/actions/setup-python-uv
|
|
134
|
+
- run: uv build
|
|
135
|
+
- uses: actions/upload-artifact@v4
|
|
136
|
+
with:
|
|
137
|
+
name: dist-${{ github.sha }}
|
|
138
|
+
path: dist/
|
|
139
|
+
retention-days: 14
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
concurrency:
|
|
9
|
+
group: release-${{ github.ref }}
|
|
10
|
+
cancel-in-progress: false
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: write
|
|
14
|
+
id-token: write # PyPI trusted publishing (OIDC)
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
release:
|
|
18
|
+
name: Release
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
with:
|
|
23
|
+
fetch-depth: 0
|
|
24
|
+
|
|
25
|
+
- uses: ./.github/actions/setup-python-uv
|
|
26
|
+
|
|
27
|
+
- name: Resolve version from tag
|
|
28
|
+
id: ver
|
|
29
|
+
run: |
|
|
30
|
+
VER="${GITHUB_REF_NAME#v}"
|
|
31
|
+
echo "version=$VER" >> "$GITHUB_OUTPUT"
|
|
32
|
+
echo "Releasing $VER"
|
|
33
|
+
|
|
34
|
+
- name: Sync pyproject and __version__ with tag
|
|
35
|
+
run: |
|
|
36
|
+
VER="${{ steps.ver.outputs.version }}"
|
|
37
|
+
python - <<PY
|
|
38
|
+
import pathlib, re
|
|
39
|
+
ver = "$VER"
|
|
40
|
+
p = pathlib.Path("pyproject.toml")
|
|
41
|
+
p.write_text(
|
|
42
|
+
re.sub(r'^version = ".*"', f'version = "{ver}"', p.read_text(encoding="utf-8"), count=1, flags=re.M),
|
|
43
|
+
encoding="utf-8",
|
|
44
|
+
)
|
|
45
|
+
q = pathlib.Path("src/phronesis/__init__.py")
|
|
46
|
+
q.write_text(
|
|
47
|
+
re.sub(r'__version__ = ".*"', f'__version__ = "{ver}"', q.read_text(encoding="utf-8"), count=1),
|
|
48
|
+
encoding="utf-8",
|
|
49
|
+
)
|
|
50
|
+
PY
|
|
51
|
+
|
|
52
|
+
- name: Build distribution
|
|
53
|
+
run: uv build
|
|
54
|
+
|
|
55
|
+
- name: Publish to PyPI (trusted publishing)
|
|
56
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
57
|
+
with:
|
|
58
|
+
packages-dir: dist/
|
|
59
|
+
skip-existing: true
|
|
60
|
+
|
|
61
|
+
- name: Create GitHub Release
|
|
62
|
+
env:
|
|
63
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
64
|
+
run: |
|
|
65
|
+
gh release create "$GITHUB_REF_NAME" \
|
|
66
|
+
--title "$GITHUB_REF_NAME" \
|
|
67
|
+
--generate-notes \
|
|
68
|
+
dist/*
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: Scheduled Security
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "0 6 * * 1" # Lunes 06:00 UTC
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
security-events: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
deep-secrets:
|
|
14
|
+
name: Deep secret scan (full history)
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
with:
|
|
19
|
+
fetch-depth: 0
|
|
20
|
+
- uses: gitleaks/gitleaks-action@v2
|
|
21
|
+
env:
|
|
22
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
23
|
+
|
|
24
|
+
dependency-audit:
|
|
25
|
+
name: Dependency audit (pip-audit)
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@v4
|
|
29
|
+
- uses: ./.github/actions/setup-python-uv
|
|
30
|
+
- run: uv run --with pip-audit pip-audit --disable-pip
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: SonarCloud
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
types: [opened, synchronize, reopened]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
scan:
|
|
11
|
+
name: SonarCloud Scan
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- name: Checkout
|
|
15
|
+
uses: actions/checkout@v4
|
|
16
|
+
with:
|
|
17
|
+
# Full history so SonarCloud can compute blame and new-code metrics.
|
|
18
|
+
fetch-depth: 0
|
|
19
|
+
|
|
20
|
+
- name: Set up Python
|
|
21
|
+
uses: actions/setup-python@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: "3.11"
|
|
24
|
+
|
|
25
|
+
- name: Install uv
|
|
26
|
+
uses: astral-sh/setup-uv@v3
|
|
27
|
+
|
|
28
|
+
- name: Install dependencies
|
|
29
|
+
run: uv sync --all-extras --dev
|
|
30
|
+
|
|
31
|
+
- name: Run tests with coverage
|
|
32
|
+
run: |
|
|
33
|
+
uv run pytest \
|
|
34
|
+
--cov=src/phronesis \
|
|
35
|
+
--cov-branch \
|
|
36
|
+
--cov-report=xml
|
|
37
|
+
|
|
38
|
+
- name: SonarCloud Scan
|
|
39
|
+
uses: SonarSource/sonarqube-scan-action@v4
|
|
40
|
+
env:
|
|
41
|
+
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
|
42
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
dist/
|
|
9
|
+
*.egg-info/
|
|
10
|
+
*.egg
|
|
11
|
+
|
|
12
|
+
# Virtual environments
|
|
13
|
+
.venv/
|
|
14
|
+
venv/
|
|
15
|
+
env/
|
|
16
|
+
|
|
17
|
+
# uv
|
|
18
|
+
.uv/
|
|
19
|
+
|
|
20
|
+
# Testing / coverage
|
|
21
|
+
.pytest_cache/
|
|
22
|
+
.coverage
|
|
23
|
+
htmlcov/
|
|
24
|
+
.tox/
|
|
25
|
+
|
|
26
|
+
# Ruff / mypy
|
|
27
|
+
.ruff_cache/
|
|
28
|
+
.mypy_cache/
|
|
29
|
+
|
|
30
|
+
# IDE
|
|
31
|
+
.idea/
|
|
32
|
+
.vscode/
|
|
33
|
+
|
|
34
|
+
# OS
|
|
35
|
+
.DS_Store
|
|
36
|
+
Thumbs.db
|
|
37
|
+
|
|
38
|
+
# Claude Code
|
|
39
|
+
.claude/
|
|
40
|
+
CLAUDE.md
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v5.0.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: trailing-whitespace
|
|
6
|
+
- id: end-of-file-fixer
|
|
7
|
+
- id: check-yaml
|
|
8
|
+
- id: check-toml
|
|
9
|
+
- id: check-merge-conflict
|
|
10
|
+
- id: detect-private-key
|
|
11
|
+
|
|
12
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
13
|
+
rev: v0.6.9
|
|
14
|
+
hooks:
|
|
15
|
+
- id: ruff-format
|
|
16
|
+
- id: ruff
|
|
17
|
+
args: [--fix]
|
|
18
|
+
|
|
19
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
20
|
+
rev: v1.11.2
|
|
21
|
+
hooks:
|
|
22
|
+
- id: mypy
|
|
23
|
+
additional_dependencies: []
|
|
24
|
+
args: [--config-file=pyproject.toml]
|
|
25
|
+
files: ^src/
|
|
26
|
+
|
|
27
|
+
- repo: https://github.com/gitleaks/gitleaks
|
|
28
|
+
rev: v8.18.4
|
|
29
|
+
hooks:
|
|
30
|
+
- id: gitleaks
|
|
31
|
+
|
|
32
|
+
- repo: https://github.com/compilerla/conventional-pre-commit
|
|
33
|
+
rev: v3.4.0
|
|
34
|
+
hooks:
|
|
35
|
+
- id: conventional-pre-commit
|
|
36
|
+
stages: [commit-msg]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.11
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: phronesis-framework
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Phronesis Framework
|
|
5
|
+
Author-email: Eduardo Marrero González <edumarreroglezz@gmail.com>
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
|
+
Requires-Dist: httpx>=0.27
|
|
8
|
+
Requires-Dist: mcp>=1.27.2
|
|
9
|
+
Requires-Dist: pydantic>=2.5
|
|
10
|
+
Provides-Extra: dev
|
|
11
|
+
Requires-Dist: mypy>=1.11; extra == 'dev'
|
|
12
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
13
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
14
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
15
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
16
|
+
Provides-Extra: obs
|
|
17
|
+
Requires-Dist: opentelemetry-api>=1.27; extra == 'obs'
|
|
18
|
+
Requires-Dist: opentelemetry-exporter-otlp>=1.27; extra == 'obs'
|
|
19
|
+
Requires-Dist: opentelemetry-sdk>=1.27; extra == 'obs'
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
|
|
24
|
+
<div align="center">
|
|
25
|
+
<img src="./assets/banners/phronesis.svg" alt="Phronesis Framework" width="60%" />
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div align="center">
|
|
29
|
+
|
|
30
|
+
# Phronesis Framework - Documentation
|
|
31
|
+
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<div align="center">
|
|
35
|
+
Índice raíz de la documentación. Refleja la estructura de <code>src/phronesis/</code>.
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<div align="center">
|
|
39
|
+
<a href="https://github.com/phronesis-framework/phronesis">repo</a> ·
|
|
40
|
+
<a href="../LICENSE">license</a>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div align="center">
|
|
44
|
+
|
|
45
|
+
[]()
|
|
46
|
+
[]()
|
|
47
|
+
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
<div align="center">
|
|
53
|
+
|
|
54
|
+
## 🗺️ Map
|
|
55
|
+
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
| Área | Estado | Documentación |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| `_internal` - infraestructura compartida | en construcción | [internal/](./internal/index.md) |
|
|
61
|
+
| `tools` - declaración y registro de tools | estable | [tools/](./tools/index.md) |
|
|
62
|
+
| `agents` - `@agent`, runtime, sessions, tool-calling loop | estable | [agents/](./agents/index.md) |
|
|
63
|
+
| `runtime` - orquestación de agentes (19 modos) | estable | [runtime/](./runtime/index.md) |
|
|
64
|
+
| `providers` - adaptadores por proveedor LLM | estable | [providers/](./providers/index.md) |
|
|
65
|
+
| `obs` - observabilidad (spans, metrics, log correlation) | estable | [obs/](./obs/index.md) |
|
|
66
|
+
| `context` - ContextBuilder + Context inyectado a tools | estable | [context/](./context/index.md) |
|
|
67
|
+
| `memory` - working/kv/vector/episodic stores + checkpoints | estable | [memory/](./memory/index.md) |
|
|
68
|
+
| `pipelines` - composición declarativa de Executables nombrados | estable | [pipelines/](./pipelines/index.md) |
|
|
69
|
+
| `mcp` - cliente y servidor Model Context Protocol | estable | [mcp/](./mcp/index.md) |
|
|
70
|
+
| `middleware` - cadena onion sobre `LLMProvider.complete` | estable | [middleware/](./middleware/index.md) |
|
|
71
|
+
| `replay` - record/replay de respuestas LLM en cassettes JSONL | estable | [replay/](./replay/index.md) |
|
|
72
|
+
| `core` - tipos de dominio (`Message`, `ContentBlock`) | estable | [core/](./core/index.md) |
|
|
73
|
+
| `communication` - identidad de sesión (`SessionId`) | estable | [communication/](./communication/index.md) |
|
|
74
|
+
|
|
75
|
+
<div align="center">
|
|
76
|
+
|
|
77
|
+
## 📐 Decisiones y planes
|
|
78
|
+
|
|
79
|
+
</div>
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Phronesis - Observability stack
|
|
2
|
+
|
|
3
|
+
Stack OTLP estandar para consumir lo que `phronesis.obs` emite: traces (Tempo), metricas (Prometheus) y logs (Loki), visualizados en Grafana con dashboards pre-construidos.
|
|
4
|
+
|
|
5
|
+
## Perfiles
|
|
6
|
+
|
|
7
|
+
### Dev (all-in-one)
|
|
8
|
+
|
|
9
|
+
Imagen unica `grafana/otel-lgtm` para iteracion local rapida. Sin persistencia.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
cd deploy/observability
|
|
13
|
+
docker compose -f docker-compose.dev.yml up -d
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Servicios expuestos:
|
|
17
|
+
|
|
18
|
+
- Grafana UI: http://localhost:3000 (sin auth)
|
|
19
|
+
- OTLP HTTP: http://localhost:4318
|
|
20
|
+
- OTLP gRPC: localhost:4317
|
|
21
|
+
- Prometheus: http://localhost:9090
|
|
22
|
+
|
|
23
|
+
### Prod (stack separado)
|
|
24
|
+
|
|
25
|
+
Containers separados con volumenes persistentes, healthchecks y networks aisladas.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
cd deploy/observability
|
|
29
|
+
export GRAFANA_ADMIN_PASSWORD=<secret>
|
|
30
|
+
docker compose -f docker-compose.prod.yml up -d
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Servicios:
|
|
34
|
+
|
|
35
|
+
- `otel-collector` - recibe OTLP HTTP/gRPC y multiplexa a backends
|
|
36
|
+
- `tempo` - traces (filesystem block storage)
|
|
37
|
+
- `loki` - logs (boltdb-shipper + filesystem)
|
|
38
|
+
- `prometheus` - metricas (OTLP write receiver activado)
|
|
39
|
+
- `grafana` - UI + datasources + dashboards auto-provisionados
|
|
40
|
+
|
|
41
|
+
## Configurar phronesis
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
from phronesis.obs import configure_obs
|
|
45
|
+
|
|
46
|
+
configure_obs(
|
|
47
|
+
exporter="otlp",
|
|
48
|
+
endpoint="http://localhost:4318",
|
|
49
|
+
service_name="my-app",
|
|
50
|
+
)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Validar end-to-end
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
uv run python deploy/observability/scripts/obs_demo.py
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Genera trafico sintetico (agent runs, tool invocations, provider requests) e imprime el `trace_id` raiz y la URL de Grafana.
|
|
60
|
+
|
|
61
|
+
## Dashboards
|
|
62
|
+
|
|
63
|
+
Siete dashboards pre-construidos en `grafana/dashboards/`:
|
|
64
|
+
|
|
65
|
+
- `phronesis-overview` - health agregado
|
|
66
|
+
- `phronesis-providers` - LLM perf/cost
|
|
67
|
+
- `phronesis-tools` - tool performance
|
|
68
|
+
- `phronesis-agents` - agent execution
|
|
69
|
+
- `phronesis-pipelines` - pipeline orchestration
|
|
70
|
+
- `phronesis-retries` - resilience
|
|
71
|
+
- `phronesis-traces-explorer` - navegacion Tempo
|
|
72
|
+
|
|
73
|
+
Detalle en `docs/obs/dashboards.md`.
|
|
74
|
+
|
|
75
|
+
## Documentacion
|
|
76
|
+
|
|
77
|
+
- `docs/obs/stack.md` - arquitectura, troubleshooting, retention
|
|
78
|
+
- `docs/obs/dashboards.md` - catalogo panel-a-panel
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: phronesis-obs-dev
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
lgtm:
|
|
5
|
+
image: grafana/otel-lgtm:0.11.12
|
|
6
|
+
container_name: phronesis-lgtm
|
|
7
|
+
ports:
|
|
8
|
+
- "3000:3000"
|
|
9
|
+
- "4317:4317"
|
|
10
|
+
- "4318:4318"
|
|
11
|
+
- "9090:9090"
|
|
12
|
+
environment:
|
|
13
|
+
- GF_AUTH_ANONYMOUS_ENABLED=true
|
|
14
|
+
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
|
|
15
|
+
- GF_AUTH_DISABLE_LOGIN_FORM=true
|
|
16
|
+
volumes:
|
|
17
|
+
# Dev datasources point to localhost (otel-lgtm is all-in-one).
|
|
18
|
+
# Mount the full directory so the built-in grafana-datasources.yaml
|
|
19
|
+
# is replaced; mounting a single file would leave conflicting
|
|
20
|
+
# built-in datasources and crash Grafana provisioning.
|
|
21
|
+
- ./grafana/provisioning/datasources-dev:/otel-lgtm/grafana/conf/provisioning/datasources:ro
|
|
22
|
+
- ./grafana/provisioning/dashboards:/otel-lgtm/grafana/conf/provisioning/dashboards:ro
|
|
23
|
+
- ./grafana/dashboards:/var/lib/grafana/dashboards:ro
|
|
24
|
+
healthcheck:
|
|
25
|
+
test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000/api/health"]
|
|
26
|
+
interval: 10s
|
|
27
|
+
timeout: 5s
|
|
28
|
+
retries: 6
|