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.
Files changed (501) hide show
  1. phronesis_framework-0.1.0/.commitlintrc.yml +10 -0
  2. phronesis_framework-0.1.0/.github/actions/setup-python-uv/action.yml +38 -0
  3. phronesis_framework-0.1.0/.github/dependabot.yml +15 -0
  4. phronesis_framework-0.1.0/.github/workflows/branch-ci.yml +67 -0
  5. phronesis_framework-0.1.0/.github/workflows/pr-ci.yml +139 -0
  6. phronesis_framework-0.1.0/.github/workflows/release.yml +68 -0
  7. phronesis_framework-0.1.0/.github/workflows/scheduled-security.yml +30 -0
  8. phronesis_framework-0.1.0/.github/workflows/sonarcloud.yml +42 -0
  9. phronesis_framework-0.1.0/.gitignore +40 -0
  10. phronesis_framework-0.1.0/.pre-commit-config.yaml +36 -0
  11. phronesis_framework-0.1.0/.python-version +1 -0
  12. phronesis_framework-0.1.0/PKG-INFO +79 -0
  13. phronesis_framework-0.1.0/deploy/observability/.gitignore +4 -0
  14. phronesis_framework-0.1.0/deploy/observability/README.md +78 -0
  15. phronesis_framework-0.1.0/deploy/observability/docker-compose.dev.yml +28 -0
  16. phronesis_framework-0.1.0/deploy/observability/docker-compose.prod.yml +126 -0
  17. phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-agents.json +47 -0
  18. phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-overview.json +81 -0
  19. phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-pipelines.json +38 -0
  20. phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-providers.json +56 -0
  21. phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-retries.json +35 -0
  22. phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-tools.json +42 -0
  23. phronesis_framework-0.1.0/deploy/observability/grafana/dashboards/phronesis-traces-explorer.json +37 -0
  24. phronesis_framework-0.1.0/deploy/observability/grafana/provisioning/dashboards/dashboards.yaml +15 -0
  25. phronesis_framework-0.1.0/deploy/observability/grafana/provisioning/datasources/datasources.yaml +61 -0
  26. phronesis_framework-0.1.0/deploy/observability/grafana/provisioning/datasources-dev/datasources.yaml +65 -0
  27. phronesis_framework-0.1.0/deploy/observability/loki/loki.yaml +47 -0
  28. phronesis_framework-0.1.0/deploy/observability/otel-collector/config.yaml +53 -0
  29. phronesis_framework-0.1.0/deploy/observability/prometheus/prometheus.yml +25 -0
  30. phronesis_framework-0.1.0/deploy/observability/scripts/obs_demo.py +199 -0
  31. phronesis_framework-0.1.0/deploy/observability/tempo/tempo.yaml +55 -0
  32. phronesis_framework-0.1.0/docs/agents/index.md +568 -0
  33. phronesis_framework-0.1.0/docs/communication/index.md +259 -0
  34. phronesis_framework-0.1.0/docs/context/index.md +430 -0
  35. phronesis_framework-0.1.0/docs/core/index.md +355 -0
  36. phronesis_framework-0.1.0/docs/examples/customer-support-system.md +461 -0
  37. phronesis_framework-0.1.0/docs/index.md +58 -0
  38. phronesis_framework-0.1.0/docs/internal/concurrency/index.md +247 -0
  39. phronesis_framework-0.1.0/docs/internal/http/index.md +244 -0
  40. phronesis_framework-0.1.0/docs/internal/ids/index.md +224 -0
  41. phronesis_framework-0.1.0/docs/internal/index.md +96 -0
  42. phronesis_framework-0.1.0/docs/internal/logging/index.md +212 -0
  43. phronesis_framework-0.1.0/docs/internal/retry/index.md +257 -0
  44. phronesis_framework-0.1.0/docs/internal/typing/index.md +227 -0
  45. phronesis_framework-0.1.0/docs/mcp/index.md +320 -0
  46. phronesis_framework-0.1.0/docs/memory/index.md +386 -0
  47. phronesis_framework-0.1.0/docs/middleware/index.md +293 -0
  48. phronesis_framework-0.1.0/docs/obs/dashboards.md +168 -0
  49. phronesis_framework-0.1.0/docs/obs/index.md +356 -0
  50. phronesis_framework-0.1.0/docs/obs/stack.md +168 -0
  51. phronesis_framework-0.1.0/docs/pipelines/index.md +400 -0
  52. phronesis_framework-0.1.0/docs/providers/anthropic/index.md +170 -0
  53. phronesis_framework-0.1.0/docs/providers/index.md +655 -0
  54. phronesis_framework-0.1.0/docs/providers/openai/index.md +172 -0
  55. phronesis_framework-0.1.0/docs/replay/index.md +329 -0
  56. phronesis_framework-0.1.0/docs/runtime/index.md +624 -0
  57. phronesis_framework-0.1.0/docs/tools/index.md +1014 -0
  58. phronesis_framework-0.1.0/public/assets/favicon/favicon.svg +5 -0
  59. phronesis_framework-0.1.0/public/assets/favicon/safari-pinned-tab.svg +3 -0
  60. phronesis_framework-0.1.0/public/assets/lockup/lockup-horizontal-dark.svg +9 -0
  61. phronesis_framework-0.1.0/public/assets/lockup/lockup-horizontal-monochrome.svg +9 -0
  62. phronesis_framework-0.1.0/public/assets/lockup/lockup-horizontal.svg +9 -0
  63. phronesis_framework-0.1.0/public/assets/lockup/lockup-vertical.svg +9 -0
  64. phronesis_framework-0.1.0/public/assets/phronesis-banner.png +0 -0
  65. phronesis_framework-0.1.0/public/assets/phronesis-master.svg +19 -0
  66. phronesis_framework-0.1.0/public/assets/symbol/symbol-light.svg +4 -0
  67. phronesis_framework-0.1.0/public/assets/symbol/symbol.svg +4 -0
  68. phronesis_framework-0.1.0/public/assets/wordmark/wordmark-dark.svg +5 -0
  69. phronesis_framework-0.1.0/public/assets/wordmark/wordmark-light.svg +5 -0
  70. phronesis_framework-0.1.0/public/assets/wordmark/wordmark.svg +5 -0
  71. phronesis_framework-0.1.0/pyproject.toml +70 -0
  72. phronesis_framework-0.1.0/sonar-project.properties +20 -0
  73. phronesis_framework-0.1.0/src/phronesis/__init__.py +38 -0
  74. phronesis_framework-0.1.0/src/phronesis/_internal/__init__.py +1 -0
  75. phronesis_framework-0.1.0/src/phronesis/_internal/concurrency/__init__.py +18 -0
  76. phronesis_framework-0.1.0/src/phronesis/_internal/concurrency/exceptions.py +39 -0
  77. phronesis_framework-0.1.0/src/phronesis/_internal/concurrency/executor.py +71 -0
  78. phronesis_framework-0.1.0/src/phronesis/_internal/concurrency/gather.py +65 -0
  79. phronesis_framework-0.1.0/src/phronesis/_internal/concurrency/policies.py +70 -0
  80. phronesis_framework-0.1.0/src/phronesis/_internal/http/__init__.py +35 -0
  81. phronesis_framework-0.1.0/src/phronesis/_internal/http/client.py +429 -0
  82. phronesis_framework-0.1.0/src/phronesis/_internal/http/exceptions.py +61 -0
  83. phronesis_framework-0.1.0/src/phronesis/_internal/http/headers.py +34 -0
  84. phronesis_framework-0.1.0/src/phronesis/_internal/http/models.py +33 -0
  85. phronesis_framework-0.1.0/src/phronesis/_internal/http/timeouts.py +29 -0
  86. phronesis_framework-0.1.0/src/phronesis/_internal/ids/__init__.py +13 -0
  87. phronesis_framework-0.1.0/src/phronesis/_internal/ids/derivation.py +10 -0
  88. phronesis_framework-0.1.0/src/phronesis/_internal/ids/generator.py +24 -0
  89. phronesis_framework-0.1.0/src/phronesis/_internal/ids/id.py +37 -0
  90. phronesis_framework-0.1.0/src/phronesis/_internal/ids/validator.py +26 -0
  91. phronesis_framework-0.1.0/src/phronesis/_internal/logging/__init__.py +20 -0
  92. phronesis_framework-0.1.0/src/phronesis/_internal/logging/adapter.py +30 -0
  93. phronesis_framework-0.1.0/src/phronesis/_internal/logging/config.py +49 -0
  94. phronesis_framework-0.1.0/src/phronesis/_internal/logging/constants.py +12 -0
  95. phronesis_framework-0.1.0/src/phronesis/_internal/logging/factory.py +18 -0
  96. phronesis_framework-0.1.0/src/phronesis/_internal/logging/formatters.py +94 -0
  97. phronesis_framework-0.1.0/src/phronesis/_internal/retry/__init__.py +18 -0
  98. phronesis_framework-0.1.0/src/phronesis/_internal/retry/attempt.py +18 -0
  99. phronesis_framework-0.1.0/src/phronesis/_internal/retry/backoff.py +46 -0
  100. phronesis_framework-0.1.0/src/phronesis/_internal/retry/decorator.py +191 -0
  101. phronesis_framework-0.1.0/src/phronesis/_internal/retry/exceptions.py +27 -0
  102. phronesis_framework-0.1.0/src/phronesis/_internal/typing/__init__.py +45 -0
  103. phronesis_framework-0.1.0/src/phronesis/_internal/typing/binary.py +13 -0
  104. phronesis_framework-0.1.0/src/phronesis/_internal/typing/json.py +9 -0
  105. phronesis_framework-0.1.0/src/phronesis/_internal/typing/maybe.py +36 -0
  106. phronesis_framework-0.1.0/src/phronesis/_internal/typing/newtypes.py +11 -0
  107. phronesis_framework-0.1.0/src/phronesis/_internal/typing/protocols.py +22 -0
  108. phronesis_framework-0.1.0/src/phronesis/_internal/typing/result.py +27 -0
  109. phronesis_framework-0.1.0/src/phronesis/_internal/typing/sentinels.py +21 -0
  110. phronesis_framework-0.1.0/src/phronesis/_internal/typing/streaming.py +21 -0
  111. phronesis_framework-0.1.0/src/phronesis/agents/__init__.py +81 -0
  112. phronesis_framework-0.1.0/src/phronesis/agents/agent.py +292 -0
  113. phronesis_framework-0.1.0/src/phronesis/agents/decorator.py +200 -0
  114. phronesis_framework-0.1.0/src/phronesis/agents/errors.py +100 -0
  115. phronesis_framework-0.1.0/src/phronesis/agents/events.py +137 -0
  116. phronesis_framework-0.1.0/src/phronesis/agents/hooks.py +78 -0
  117. phronesis_framework-0.1.0/src/phronesis/agents/id.py +35 -0
  118. phronesis_framework-0.1.0/src/phronesis/agents/loop.py +883 -0
  119. phronesis_framework-0.1.0/src/phronesis/agents/registry.py +165 -0
  120. phronesis_framework-0.1.0/src/phronesis/agents/run.py +141 -0
  121. phronesis_framework-0.1.0/src/phronesis/agents/session.py +122 -0
  122. phronesis_framework-0.1.0/src/phronesis/agents/spec.py +88 -0
  123. phronesis_framework-0.1.0/src/phronesis/agents/validation.py +128 -0
  124. phronesis_framework-0.1.0/src/phronesis/communication/__init__.py +1 -0
  125. phronesis_framework-0.1.0/src/phronesis/communication/session_id.py +16 -0
  126. phronesis_framework-0.1.0/src/phronesis/context/__init__.py +41 -0
  127. phronesis_framework-0.1.0/src/phronesis/context/budget.py +17 -0
  128. phronesis_framework-0.1.0/src/phronesis/context/chain.py +101 -0
  129. phronesis_framework-0.1.0/src/phronesis/context/compacting.py +387 -0
  130. phronesis_framework-0.1.0/src/phronesis/context/context.py +50 -0
  131. phronesis_framework-0.1.0/src/phronesis/context/default.py +55 -0
  132. phronesis_framework-0.1.0/src/phronesis/context/dry_run.py +88 -0
  133. phronesis_framework-0.1.0/src/phronesis/context/errors.py +30 -0
  134. phronesis_framework-0.1.0/src/phronesis/context/input.py +42 -0
  135. phronesis_framework-0.1.0/src/phronesis/context/protocol.py +45 -0
  136. phronesis_framework-0.1.0/src/phronesis/core/__init__.py +36 -0
  137. phronesis_framework-0.1.0/src/phronesis/core/messages.py +251 -0
  138. phronesis_framework-0.1.0/src/phronesis/errors.py +36 -0
  139. phronesis_framework-0.1.0/src/phronesis/mcp/__init__.py +62 -0
  140. phronesis_framework-0.1.0/src/phronesis/mcp/_adapt.py +211 -0
  141. phronesis_framework-0.1.0/src/phronesis/mcp/client.py +165 -0
  142. phronesis_framework-0.1.0/src/phronesis/mcp/errors.py +58 -0
  143. phronesis_framework-0.1.0/src/phronesis/mcp/ids.py +50 -0
  144. phronesis_framework-0.1.0/src/phronesis/mcp/obs.py +52 -0
  145. phronesis_framework-0.1.0/src/phronesis/mcp/server.py +229 -0
  146. phronesis_framework-0.1.0/src/phronesis/mcp/server_spec.py +65 -0
  147. phronesis_framework-0.1.0/src/phronesis/mcp/transport.py +53 -0
  148. phronesis_framework-0.1.0/src/phronesis/memory/__init__.py +98 -0
  149. phronesis_framework-0.1.0/src/phronesis/memory/checkpoint.py +201 -0
  150. phronesis_framework-0.1.0/src/phronesis/memory/context_builder.py +194 -0
  151. phronesis_framework-0.1.0/src/phronesis/memory/episodic/__init__.py +22 -0
  152. phronesis_framework-0.1.0/src/phronesis/memory/episodic/filesystem.py +172 -0
  153. phronesis_framework-0.1.0/src/phronesis/memory/episodic/in_memory.py +92 -0
  154. phronesis_framework-0.1.0/src/phronesis/memory/episodic/protocol.py +81 -0
  155. phronesis_framework-0.1.0/src/phronesis/memory/errors.py +50 -0
  156. phronesis_framework-0.1.0/src/phronesis/memory/hooks.py +89 -0
  157. phronesis_framework-0.1.0/src/phronesis/memory/kv/__init__.py +21 -0
  158. phronesis_framework-0.1.0/src/phronesis/memory/kv/filesystem.py +247 -0
  159. phronesis_framework-0.1.0/src/phronesis/memory/kv/in_memory.py +175 -0
  160. phronesis_framework-0.1.0/src/phronesis/memory/kv/protocol.py +70 -0
  161. phronesis_framework-0.1.0/src/phronesis/memory/obs.py +100 -0
  162. phronesis_framework-0.1.0/src/phronesis/memory/scope.py +111 -0
  163. phronesis_framework-0.1.0/src/phronesis/memory/tools.py +296 -0
  164. phronesis_framework-0.1.0/src/phronesis/memory/vector/__init__.py +28 -0
  165. phronesis_framework-0.1.0/src/phronesis/memory/vector/_cosine.py +34 -0
  166. phronesis_framework-0.1.0/src/phronesis/memory/vector/embeddings.py +69 -0
  167. phronesis_framework-0.1.0/src/phronesis/memory/vector/filesystem.py +174 -0
  168. phronesis_framework-0.1.0/src/phronesis/memory/vector/in_memory.py +102 -0
  169. phronesis_framework-0.1.0/src/phronesis/memory/vector/protocol.py +94 -0
  170. phronesis_framework-0.1.0/src/phronesis/memory/working.py +165 -0
  171. phronesis_framework-0.1.0/src/phronesis/middleware/__init__.py +30 -0
  172. phronesis_framework-0.1.0/src/phronesis/middleware/chain.py +102 -0
  173. phronesis_framework-0.1.0/src/phronesis/middleware/errors.py +13 -0
  174. phronesis_framework-0.1.0/src/phronesis/middleware/protocol.py +58 -0
  175. phronesis_framework-0.1.0/src/phronesis/obs/__init__.py +49 -0
  176. phronesis_framework-0.1.0/src/phronesis/obs/_detect.py +28 -0
  177. phronesis_framework-0.1.0/src/phronesis/obs/_noop.py +71 -0
  178. phronesis_framework-0.1.0/src/phronesis/obs/attributes.py +82 -0
  179. phronesis_framework-0.1.0/src/phronesis/obs/config.py +257 -0
  180. phronesis_framework-0.1.0/src/phronesis/obs/errors.py +25 -0
  181. phronesis_framework-0.1.0/src/phronesis/obs/logging_filter.py +97 -0
  182. phronesis_framework-0.1.0/src/phronesis/obs/metrics.py +146 -0
  183. phronesis_framework-0.1.0/src/phronesis/obs/spans.py +165 -0
  184. phronesis_framework-0.1.0/src/phronesis/pipelines/__init__.py +28 -0
  185. phronesis_framework-0.1.0/src/phronesis/pipelines/errors.py +21 -0
  186. phronesis_framework-0.1.0/src/phronesis/pipelines/ids.py +63 -0
  187. phronesis_framework-0.1.0/src/phronesis/pipelines/pipeline.py +250 -0
  188. phronesis_framework-0.1.0/src/phronesis/providers/__init__.py +80 -0
  189. phronesis_framework-0.1.0/src/phronesis/providers/_common/__init__.py +9 -0
  190. phronesis_framework-0.1.0/src/phronesis/providers/anthropic/__init__.py +13 -0
  191. phronesis_framework-0.1.0/src/phronesis/providers/anthropic/errors.py +113 -0
  192. phronesis_framework-0.1.0/src/phronesis/providers/anthropic/factory.py +81 -0
  193. phronesis_framework-0.1.0/src/phronesis/providers/anthropic/messages.py +248 -0
  194. phronesis_framework-0.1.0/src/phronesis/providers/anthropic/provider.py +344 -0
  195. phronesis_framework-0.1.0/src/phronesis/providers/anthropic/streaming.py +305 -0
  196. phronesis_framework-0.1.0/src/phronesis/providers/anthropic/tools.py +48 -0
  197. phronesis_framework-0.1.0/src/phronesis/providers/chunks.py +85 -0
  198. phronesis_framework-0.1.0/src/phronesis/providers/errors.py +98 -0
  199. phronesis_framework-0.1.0/src/phronesis/providers/fallback.py +145 -0
  200. phronesis_framework-0.1.0/src/phronesis/providers/openai/__init__.py +20 -0
  201. phronesis_framework-0.1.0/src/phronesis/providers/openai/errors.py +101 -0
  202. phronesis_framework-0.1.0/src/phronesis/providers/openai/factory.py +98 -0
  203. phronesis_framework-0.1.0/src/phronesis/providers/openai/helpers.py +189 -0
  204. phronesis_framework-0.1.0/src/phronesis/providers/openai/messages.py +180 -0
  205. phronesis_framework-0.1.0/src/phronesis/providers/openai/provider.py +403 -0
  206. phronesis_framework-0.1.0/src/phronesis/providers/openai/streaming.py +275 -0
  207. phronesis_framework-0.1.0/src/phronesis/providers/openai/tools.py +50 -0
  208. phronesis_framework-0.1.0/src/phronesis/providers/protocol.py +156 -0
  209. phronesis_framework-0.1.0/src/phronesis/providers/retry_config.py +81 -0
  210. phronesis_framework-0.1.0/src/phronesis/providers/translation.py +167 -0
  211. phronesis_framework-0.1.0/src/phronesis/providers/types.py +186 -0
  212. phronesis_framework-0.1.0/src/phronesis/providers/usage.py +32 -0
  213. phronesis_framework-0.1.0/src/phronesis/replay/__init__.py +57 -0
  214. phronesis_framework-0.1.0/src/phronesis/replay/cassette.py +148 -0
  215. phronesis_framework-0.1.0/src/phronesis/replay/errors.py +23 -0
  216. phronesis_framework-0.1.0/src/phronesis/replay/recording.py +82 -0
  217. phronesis_framework-0.1.0/src/phronesis/replay/replay.py +127 -0
  218. phronesis_framework-0.1.0/src/phronesis/runtime/__init__.py +99 -0
  219. phronesis_framework-0.1.0/src/phronesis/runtime/context.py +153 -0
  220. phronesis_framework-0.1.0/src/phronesis/runtime/errors.py +77 -0
  221. phronesis_framework-0.1.0/src/phronesis/runtime/modes/__init__.py +5 -0
  222. phronesis_framework-0.1.0/src/phronesis/runtime/modes/approval.py +78 -0
  223. phronesis_framework-0.1.0/src/phronesis/runtime/modes/cascade.py +55 -0
  224. phronesis_framework-0.1.0/src/phronesis/runtime/modes/conditional.py +41 -0
  225. phronesis_framework-0.1.0/src/phronesis/runtime/modes/consensus.py +100 -0
  226. phronesis_framework-0.1.0/src/phronesis/runtime/modes/debate.py +80 -0
  227. phronesis_framework-0.1.0/src/phronesis/runtime/modes/fallback.py +50 -0
  228. phronesis_framework-0.1.0/src/phronesis/runtime/modes/handoff_chain.py +100 -0
  229. phronesis_framework-0.1.0/src/phronesis/runtime/modes/loop.py +80 -0
  230. phronesis_framework-0.1.0/src/phronesis/runtime/modes/map_reduce.py +81 -0
  231. phronesis_framework-0.1.0/src/phronesis/runtime/modes/parallel.py +82 -0
  232. phronesis_framework-0.1.0/src/phronesis/runtime/modes/plan_and_execute.py +79 -0
  233. phronesis_framework-0.1.0/src/phronesis/runtime/modes/race.py +90 -0
  234. phronesis_framework-0.1.0/src/phronesis/runtime/modes/reflexion.py +116 -0
  235. phronesis_framework-0.1.0/src/phronesis/runtime/modes/retry.py +83 -0
  236. phronesis_framework-0.1.0/src/phronesis/runtime/modes/router.py +57 -0
  237. phronesis_framework-0.1.0/src/phronesis/runtime/modes/sequence.py +59 -0
  238. phronesis_framework-0.1.0/src/phronesis/runtime/modes/supervisor.py +113 -0
  239. phronesis_framework-0.1.0/src/phronesis/runtime/modes/tree_search.py +151 -0
  240. phronesis_framework-0.1.0/src/phronesis/runtime/modes/validation.py +88 -0
  241. phronesis_framework-0.1.0/src/phronesis/runtime/node.py +150 -0
  242. phronesis_framework-0.1.0/src/phronesis/runtime/obs.py +95 -0
  243. phronesis_framework-0.1.0/src/phronesis/runtime/outcome.py +147 -0
  244. phronesis_framework-0.1.0/src/phronesis/runtime/protocol.py +36 -0
  245. phronesis_framework-0.1.0/src/phronesis/testing/__init__.py +19 -0
  246. phronesis_framework-0.1.0/src/phronesis/testing/providers.py +159 -0
  247. phronesis_framework-0.1.0/src/phronesis/tools/__init__.py +76 -0
  248. phronesis_framework-0.1.0/src/phronesis/tools/cache.py +141 -0
  249. phronesis_framework-0.1.0/src/phronesis/tools/decorator.py +184 -0
  250. phronesis_framework-0.1.0/src/phronesis/tools/discover.py +48 -0
  251. phronesis_framework-0.1.0/src/phronesis/tools/effects.py +46 -0
  252. phronesis_framework-0.1.0/src/phronesis/tools/errors.py +262 -0
  253. phronesis_framework-0.1.0/src/phronesis/tools/injection.py +82 -0
  254. phronesis_framework-0.1.0/src/phronesis/tools/lifecycle.py +47 -0
  255. phronesis_framework-0.1.0/src/phronesis/tools/markers.py +39 -0
  256. phronesis_framework-0.1.0/src/phronesis/tools/providers/__init__.py +47 -0
  257. phronesis_framework-0.1.0/src/phronesis/tools/providers/anthropic.py +52 -0
  258. phronesis_framework-0.1.0/src/phronesis/tools/providers/base.py +52 -0
  259. phronesis_framework-0.1.0/src/phronesis/tools/providers/openai.py +56 -0
  260. phronesis_framework-0.1.0/src/phronesis/tools/registry.py +148 -0
  261. phronesis_framework-0.1.0/src/phronesis/tools/retry.py +65 -0
  262. phronesis_framework-0.1.0/src/phronesis/tools/schema.py +216 -0
  263. phronesis_framework-0.1.0/src/phronesis/tools/single_model.py +92 -0
  264. phronesis_framework-0.1.0/src/phronesis/tools/spec.py +106 -0
  265. phronesis_framework-0.1.0/src/phronesis/tools/tool.py +317 -0
  266. phronesis_framework-0.1.0/src/phronesis/tools/tool_id.py +44 -0
  267. phronesis_framework-0.1.0/src/phronesis/tools/validation.py +160 -0
  268. phronesis_framework-0.1.0/src/phronesis/tools/version.py +108 -0
  269. phronesis_framework-0.1.0/tests/__init__.py +0 -0
  270. phronesis_framework-0.1.0/tests/_internal/__init__.py +0 -0
  271. phronesis_framework-0.1.0/tests/_internal/concurrency/__init__.py +0 -0
  272. phronesis_framework-0.1.0/tests/_internal/concurrency/test_exceptions.py +40 -0
  273. phronesis_framework-0.1.0/tests/_internal/concurrency/test_executor.py +52 -0
  274. phronesis_framework-0.1.0/tests/_internal/concurrency/test_gather.py +112 -0
  275. phronesis_framework-0.1.0/tests/_internal/concurrency/test_policies.py +65 -0
  276. phronesis_framework-0.1.0/tests/_internal/http/__init__.py +0 -0
  277. phronesis_framework-0.1.0/tests/_internal/http/test_client.py +185 -0
  278. phronesis_framework-0.1.0/tests/_internal/http/test_exceptions.py +74 -0
  279. phronesis_framework-0.1.0/tests/_internal/http/test_headers.py +36 -0
  280. phronesis_framework-0.1.0/tests/_internal/http/test_logging.py +93 -0
  281. phronesis_framework-0.1.0/tests/_internal/http/test_models.py +45 -0
  282. phronesis_framework-0.1.0/tests/_internal/http/test_streaming.py +66 -0
  283. phronesis_framework-0.1.0/tests/_internal/http/test_timeouts.py +34 -0
  284. phronesis_framework-0.1.0/tests/_internal/ids/__init__.py +0 -0
  285. phronesis_framework-0.1.0/tests/_internal/ids/test_generator.py +43 -0
  286. phronesis_framework-0.1.0/tests/_internal/ids/test_id.py +53 -0
  287. phronesis_framework-0.1.0/tests/_internal/ids/test_validators.py +39 -0
  288. phronesis_framework-0.1.0/tests/_internal/logging/__init__.py +0 -0
  289. phronesis_framework-0.1.0/tests/_internal/logging/test_adapter.py +85 -0
  290. phronesis_framework-0.1.0/tests/_internal/logging/test_concurrency.py +68 -0
  291. phronesis_framework-0.1.0/tests/_internal/logging/test_configure.py +68 -0
  292. phronesis_framework-0.1.0/tests/_internal/logging/test_factory.py +42 -0
  293. phronesis_framework-0.1.0/tests/_internal/logging/test_formatters.py +107 -0
  294. phronesis_framework-0.1.0/tests/_internal/retry/__init__.py +0 -0
  295. phronesis_framework-0.1.0/tests/_internal/retry/test_attempt.py +28 -0
  296. phronesis_framework-0.1.0/tests/_internal/retry/test_backoff.py +47 -0
  297. phronesis_framework-0.1.0/tests/_internal/retry/test_decorator.py +301 -0
  298. phronesis_framework-0.1.0/tests/_internal/retry/test_exceptions.py +38 -0
  299. phronesis_framework-0.1.0/tests/_internal/typing/__init__.py +0 -0
  300. phronesis_framework-0.1.0/tests/_internal/typing/test_binary.py +39 -0
  301. phronesis_framework-0.1.0/tests/_internal/typing/test_json.py +82 -0
  302. phronesis_framework-0.1.0/tests/_internal/typing/test_maybe.py +57 -0
  303. phronesis_framework-0.1.0/tests/_internal/typing/test_newtypes.py +46 -0
  304. phronesis_framework-0.1.0/tests/_internal/typing/test_protocols.py +41 -0
  305. phronesis_framework-0.1.0/tests/_internal/typing/test_result.py +64 -0
  306. phronesis_framework-0.1.0/tests/_internal/typing/test_sentinels.py +29 -0
  307. phronesis_framework-0.1.0/tests/_internal/typing/test_streaming.py +47 -0
  308. phronesis_framework-0.1.0/tests/agents/__init__.py +0 -0
  309. phronesis_framework-0.1.0/tests/agents/conftest.py +69 -0
  310. phronesis_framework-0.1.0/tests/agents/test_agent.py +294 -0
  311. phronesis_framework-0.1.0/tests/agents/test_agent_stream.py +160 -0
  312. phronesis_framework-0.1.0/tests/agents/test_decorator.py +162 -0
  313. phronesis_framework-0.1.0/tests/agents/test_errors.py +98 -0
  314. phronesis_framework-0.1.0/tests/agents/test_events.py +148 -0
  315. phronesis_framework-0.1.0/tests/agents/test_hooks.py +151 -0
  316. phronesis_framework-0.1.0/tests/agents/test_id.py +76 -0
  317. phronesis_framework-0.1.0/tests/agents/test_loop.py +414 -0
  318. phronesis_framework-0.1.0/tests/agents/test_loop_budget.py +154 -0
  319. phronesis_framework-0.1.0/tests/agents/test_loop_cache_translation.py +63 -0
  320. phronesis_framework-0.1.0/tests/agents/test_loop_context.py +139 -0
  321. phronesis_framework-0.1.0/tests/agents/test_loop_context_builder.py +163 -0
  322. phronesis_framework-0.1.0/tests/agents/test_loop_metrics.py +290 -0
  323. phronesis_framework-0.1.0/tests/agents/test_loop_obs.py +303 -0
  324. phronesis_framework-0.1.0/tests/agents/test_public_api.py +52 -0
  325. phronesis_framework-0.1.0/tests/agents/test_registry.py +135 -0
  326. phronesis_framework-0.1.0/tests/agents/test_run.py +261 -0
  327. phronesis_framework-0.1.0/tests/agents/test_session.py +188 -0
  328. phronesis_framework-0.1.0/tests/agents/test_spec.py +158 -0
  329. phronesis_framework-0.1.0/tests/agents/test_tool_lifecycle.py +174 -0
  330. phronesis_framework-0.1.0/tests/agents/test_tool_not_found_suggestion.py +56 -0
  331. phronesis_framework-0.1.0/tests/agents/test_tool_retry.py +158 -0
  332. phronesis_framework-0.1.0/tests/agents/test_validation.py +113 -0
  333. phronesis_framework-0.1.0/tests/communication/__init__.py +0 -0
  334. phronesis_framework-0.1.0/tests/communication/test_session_id.py +44 -0
  335. phronesis_framework-0.1.0/tests/context/__init__.py +0 -0
  336. phronesis_framework-0.1.0/tests/context/conftest.py +57 -0
  337. phronesis_framework-0.1.0/tests/context/test_budget.py +65 -0
  338. phronesis_framework-0.1.0/tests/context/test_chain.py +132 -0
  339. phronesis_framework-0.1.0/tests/context/test_compacting.py +267 -0
  340. phronesis_framework-0.1.0/tests/context/test_context.py +111 -0
  341. phronesis_framework-0.1.0/tests/context/test_default.py +115 -0
  342. phronesis_framework-0.1.0/tests/context/test_dry_run.py +68 -0
  343. phronesis_framework-0.1.0/tests/context/test_errors.py +40 -0
  344. phronesis_framework-0.1.0/tests/context/test_input.py +69 -0
  345. phronesis_framework-0.1.0/tests/context/test_protocol.py +46 -0
  346. phronesis_framework-0.1.0/tests/core/__init__.py +0 -0
  347. phronesis_framework-0.1.0/tests/core/test_messages.py +260 -0
  348. phronesis_framework-0.1.0/tests/core/test_messages_multimodal.py +57 -0
  349. phronesis_framework-0.1.0/tests/mcp/__init__.py +0 -0
  350. phronesis_framework-0.1.0/tests/mcp/conftest.py +54 -0
  351. phronesis_framework-0.1.0/tests/mcp/test_client.py +133 -0
  352. phronesis_framework-0.1.0/tests/mcp/test_client_adapter.py +203 -0
  353. phronesis_framework-0.1.0/tests/mcp/test_errors.py +49 -0
  354. phronesis_framework-0.1.0/tests/mcp/test_ids.py +59 -0
  355. phronesis_framework-0.1.0/tests/mcp/test_integration.py +72 -0
  356. phronesis_framework-0.1.0/tests/mcp/test_obs.py +62 -0
  357. phronesis_framework-0.1.0/tests/mcp/test_server.py +115 -0
  358. phronesis_framework-0.1.0/tests/mcp/test_server_adapter.py +46 -0
  359. phronesis_framework-0.1.0/tests/mcp/test_server_spec.py +67 -0
  360. phronesis_framework-0.1.0/tests/mcp/test_transport.py +56 -0
  361. phronesis_framework-0.1.0/tests/memory/__init__.py +0 -0
  362. phronesis_framework-0.1.0/tests/memory/conftest.py +61 -0
  363. phronesis_framework-0.1.0/tests/memory/episodic/__init__.py +0 -0
  364. phronesis_framework-0.1.0/tests/memory/episodic/test_filesystem_json.py +136 -0
  365. phronesis_framework-0.1.0/tests/memory/episodic/test_in_memory.py +123 -0
  366. phronesis_framework-0.1.0/tests/memory/kv/__init__.py +0 -0
  367. phronesis_framework-0.1.0/tests/memory/kv/test_filesystem_json.py +119 -0
  368. phronesis_framework-0.1.0/tests/memory/kv/test_in_memory.py +151 -0
  369. phronesis_framework-0.1.0/tests/memory/test_checkpoint.py +135 -0
  370. phronesis_framework-0.1.0/tests/memory/test_context_builder.py +199 -0
  371. phronesis_framework-0.1.0/tests/memory/test_errors.py +41 -0
  372. phronesis_framework-0.1.0/tests/memory/test_hooks.py +103 -0
  373. phronesis_framework-0.1.0/tests/memory/test_obs.py +65 -0
  374. phronesis_framework-0.1.0/tests/memory/test_scope.py +81 -0
  375. phronesis_framework-0.1.0/tests/memory/test_tools.py +114 -0
  376. phronesis_framework-0.1.0/tests/memory/vector/__init__.py +0 -0
  377. phronesis_framework-0.1.0/tests/memory/vector/test_deterministic_embedding.py +63 -0
  378. phronesis_framework-0.1.0/tests/memory/vector/test_filesystem_json.py +122 -0
  379. phronesis_framework-0.1.0/tests/memory/vector/test_in_memory.py +122 -0
  380. phronesis_framework-0.1.0/tests/memory/working/__init__.py +0 -0
  381. phronesis_framework-0.1.0/tests/memory/working/test_in_memory.py +126 -0
  382. phronesis_framework-0.1.0/tests/middleware/__init__.py +0 -0
  383. phronesis_framework-0.1.0/tests/middleware/test_chain.py +182 -0
  384. phronesis_framework-0.1.0/tests/middleware/test_protocol.py +24 -0
  385. phronesis_framework-0.1.0/tests/obs/__init__.py +0 -0
  386. phronesis_framework-0.1.0/tests/obs/conftest.py +21 -0
  387. phronesis_framework-0.1.0/tests/obs/test_attributes.py +96 -0
  388. phronesis_framework-0.1.0/tests/obs/test_config.py +348 -0
  389. phronesis_framework-0.1.0/tests/obs/test_detect.py +24 -0
  390. phronesis_framework-0.1.0/tests/obs/test_errors.py +25 -0
  391. phronesis_framework-0.1.0/tests/obs/test_logging_filter.py +183 -0
  392. phronesis_framework-0.1.0/tests/obs/test_metrics.py +72 -0
  393. phronesis_framework-0.1.0/tests/obs/test_noop.py +108 -0
  394. phronesis_framework-0.1.0/tests/obs/test_package.py +41 -0
  395. phronesis_framework-0.1.0/tests/obs/test_public_api.py +63 -0
  396. phronesis_framework-0.1.0/tests/obs/test_spans.py +202 -0
  397. phronesis_framework-0.1.0/tests/obs/test_traced.py +162 -0
  398. phronesis_framework-0.1.0/tests/observability/__init__.py +0 -0
  399. phronesis_framework-0.1.0/tests/pipelines/__init__.py +0 -0
  400. phronesis_framework-0.1.0/tests/pipelines/conftest.py +38 -0
  401. phronesis_framework-0.1.0/tests/pipelines/test_decorator.py +109 -0
  402. phronesis_framework-0.1.0/tests/pipelines/test_factory.py +78 -0
  403. phronesis_framework-0.1.0/tests/pipelines/test_ids.py +47 -0
  404. phronesis_framework-0.1.0/tests/pipelines/test_integration.py +68 -0
  405. phronesis_framework-0.1.0/tests/pipelines/test_pipeline.py +164 -0
  406. phronesis_framework-0.1.0/tests/pipelines/test_run.py +43 -0
  407. phronesis_framework-0.1.0/tests/providers/__init__.py +0 -0
  408. phronesis_framework-0.1.0/tests/providers/_common/__init__.py +0 -0
  409. phronesis_framework-0.1.0/tests/providers/anthropic/__init__.py +0 -0
  410. phronesis_framework-0.1.0/tests/providers/anthropic/test_errors.py +133 -0
  411. phronesis_framework-0.1.0/tests/providers/anthropic/test_factory.py +74 -0
  412. phronesis_framework-0.1.0/tests/providers/anthropic/test_messages.py +162 -0
  413. phronesis_framework-0.1.0/tests/providers/anthropic/test_messages_caching.py +141 -0
  414. phronesis_framework-0.1.0/tests/providers/anthropic/test_messages_multimodal.py +66 -0
  415. phronesis_framework-0.1.0/tests/providers/anthropic/test_provider.py +437 -0
  416. phronesis_framework-0.1.0/tests/providers/anthropic/test_provider_token_counting.py +117 -0
  417. phronesis_framework-0.1.0/tests/providers/anthropic/test_streaming.py +317 -0
  418. phronesis_framework-0.1.0/tests/providers/anthropic/test_tools.py +66 -0
  419. phronesis_framework-0.1.0/tests/providers/openai/__init__.py +0 -0
  420. phronesis_framework-0.1.0/tests/providers/openai/test_errors.py +125 -0
  421. phronesis_framework-0.1.0/tests/providers/openai/test_factory.py +91 -0
  422. phronesis_framework-0.1.0/tests/providers/openai/test_messages.py +168 -0
  423. phronesis_framework-0.1.0/tests/providers/openai/test_messages_multimodal.py +61 -0
  424. phronesis_framework-0.1.0/tests/providers/openai/test_oss_factories.py +185 -0
  425. phronesis_framework-0.1.0/tests/providers/openai/test_provider.py +574 -0
  426. phronesis_framework-0.1.0/tests/providers/openai/test_provider_response_format.py +86 -0
  427. phronesis_framework-0.1.0/tests/providers/openai/test_provider_token_counting.py +48 -0
  428. phronesis_framework-0.1.0/tests/providers/openai/test_streaming.py +351 -0
  429. phronesis_framework-0.1.0/tests/providers/openai/test_tools.py +76 -0
  430. phronesis_framework-0.1.0/tests/providers/test_chunks.py +93 -0
  431. phronesis_framework-0.1.0/tests/providers/test_errors.py +61 -0
  432. phronesis_framework-0.1.0/tests/providers/test_fallback.py +230 -0
  433. phronesis_framework-0.1.0/tests/providers/test_package.py +32 -0
  434. phronesis_framework-0.1.0/tests/providers/test_portability.py +386 -0
  435. phronesis_framework-0.1.0/tests/providers/test_protocol.py +89 -0
  436. phronesis_framework-0.1.0/tests/providers/test_public_api.py +120 -0
  437. phronesis_framework-0.1.0/tests/providers/test_response_format.py +52 -0
  438. phronesis_framework-0.1.0/tests/providers/test_retry_config.py +108 -0
  439. phronesis_framework-0.1.0/tests/providers/test_translation.py +95 -0
  440. phronesis_framework-0.1.0/tests/providers/test_translation_multimodal.py +56 -0
  441. phronesis_framework-0.1.0/tests/providers/test_types.py +115 -0
  442. phronesis_framework-0.1.0/tests/providers/test_usage.py +53 -0
  443. phronesis_framework-0.1.0/tests/replay/__init__.py +0 -0
  444. phronesis_framework-0.1.0/tests/replay/test_cassette.py +106 -0
  445. phronesis_framework-0.1.0/tests/replay/test_recording.py +128 -0
  446. phronesis_framework-0.1.0/tests/replay/test_replay_provider.py +141 -0
  447. phronesis_framework-0.1.0/tests/runtime/__init__.py +0 -0
  448. phronesis_framework-0.1.0/tests/runtime/conftest.py +65 -0
  449. phronesis_framework-0.1.0/tests/runtime/modes/__init__.py +0 -0
  450. phronesis_framework-0.1.0/tests/runtime/modes/test_approval.py +50 -0
  451. phronesis_framework-0.1.0/tests/runtime/modes/test_cascade.py +47 -0
  452. phronesis_framework-0.1.0/tests/runtime/modes/test_conditional.py +50 -0
  453. phronesis_framework-0.1.0/tests/runtime/modes/test_consensus.py +58 -0
  454. phronesis_framework-0.1.0/tests/runtime/modes/test_debate.py +38 -0
  455. phronesis_framework-0.1.0/tests/runtime/modes/test_fallback.py +39 -0
  456. phronesis_framework-0.1.0/tests/runtime/modes/test_handoff_chain.py +57 -0
  457. phronesis_framework-0.1.0/tests/runtime/modes/test_loop.py +45 -0
  458. phronesis_framework-0.1.0/tests/runtime/modes/test_map_reduce.py +51 -0
  459. phronesis_framework-0.1.0/tests/runtime/modes/test_parallel.py +55 -0
  460. phronesis_framework-0.1.0/tests/runtime/modes/test_plan_and_execute.py +58 -0
  461. phronesis_framework-0.1.0/tests/runtime/modes/test_race.py +49 -0
  462. phronesis_framework-0.1.0/tests/runtime/modes/test_reflexion.py +59 -0
  463. phronesis_framework-0.1.0/tests/runtime/modes/test_retry.py +65 -0
  464. phronesis_framework-0.1.0/tests/runtime/modes/test_router.py +62 -0
  465. phronesis_framework-0.1.0/tests/runtime/modes/test_sequence.py +68 -0
  466. phronesis_framework-0.1.0/tests/runtime/modes/test_supervisor.py +57 -0
  467. phronesis_framework-0.1.0/tests/runtime/modes/test_tree_search.py +43 -0
  468. phronesis_framework-0.1.0/tests/runtime/modes/test_validation.py +59 -0
  469. phronesis_framework-0.1.0/tests/runtime/test_context.py +87 -0
  470. phronesis_framework-0.1.0/tests/runtime/test_errors.py +59 -0
  471. phronesis_framework-0.1.0/tests/runtime/test_integration.py +61 -0
  472. phronesis_framework-0.1.0/tests/runtime/test_node.py +74 -0
  473. phronesis_framework-0.1.0/tests/runtime/test_obs.py +49 -0
  474. phronesis_framework-0.1.0/tests/runtime/test_outcome.py +60 -0
  475. phronesis_framework-0.1.0/tests/test_errors.py +0 -0
  476. phronesis_framework-0.1.0/tests/testing/__init__.py +0 -0
  477. phronesis_framework-0.1.0/tests/testing/test_providers.py +130 -0
  478. phronesis_framework-0.1.0/tests/tools/__init__.py +0 -0
  479. phronesis_framework-0.1.0/tests/tools/conftest.py +16 -0
  480. phronesis_framework-0.1.0/tests/tools/providers/__init__.py +0 -0
  481. phronesis_framework-0.1.0/tests/tools/providers/test_anthropic.py +73 -0
  482. phronesis_framework-0.1.0/tests/tools/providers/test_openai.py +76 -0
  483. phronesis_framework-0.1.0/tests/tools/test_cache.py +126 -0
  484. phronesis_framework-0.1.0/tests/tools/test_decorator.py +176 -0
  485. phronesis_framework-0.1.0/tests/tools/test_discover.py +115 -0
  486. phronesis_framework-0.1.0/tests/tools/test_effects.py +92 -0
  487. phronesis_framework-0.1.0/tests/tools/test_errors.py +231 -0
  488. phronesis_framework-0.1.0/tests/tools/test_injection.py +91 -0
  489. phronesis_framework-0.1.0/tests/tools/test_markers.py +59 -0
  490. phronesis_framework-0.1.0/tests/tools/test_public_api.py +183 -0
  491. phronesis_framework-0.1.0/tests/tools/test_registry.py +155 -0
  492. phronesis_framework-0.1.0/tests/tools/test_retry.py +51 -0
  493. phronesis_framework-0.1.0/tests/tools/test_schema.py +178 -0
  494. phronesis_framework-0.1.0/tests/tools/test_single_model.py +166 -0
  495. phronesis_framework-0.1.0/tests/tools/test_spec.py +275 -0
  496. phronesis_framework-0.1.0/tests/tools/test_tool.py +457 -0
  497. phronesis_framework-0.1.0/tests/tools/test_tool_cache.py +149 -0
  498. phronesis_framework-0.1.0/tests/tools/test_tool_id.py +84 -0
  499. phronesis_framework-0.1.0/tests/tools/test_validation.py +162 -0
  500. phronesis_framework-0.1.0/tests/tools/test_version.py +103 -0
  501. 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
+ [![Status](https://img.shields.io/badge/status-WIP-orange)]()
46
+ [![Python](https://img.shields.io/badge/python-3.11+-blue?logo=python&logoColor=white)]()
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,4 @@
1
+ volumes/
2
+ data/
3
+ *.log
4
+ .env
@@ -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