effgen 0.2.2__tar.gz → 0.2.3__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 (258) hide show
  1. {effgen-0.2.2/effgen.egg-info → effgen-0.2.3}/PKG-INFO +16 -1
  2. {effgen-0.2.2 → effgen-0.2.3}/README.md +63 -10
  3. {effgen-0.2.2 → effgen-0.2.3}/effgen/__init__.py +99 -2
  4. {effgen-0.2.2 → effgen-0.2.3}/effgen/cli.py +106 -2
  5. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/__init__.py +44 -1
  6. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/_cost.py +88 -0
  7. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/anthropic_adapter.py +28 -0
  8. effgen-0.2.3/effgen/models/auth.py +56 -0
  9. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/cerebras_adapter.py +82 -33
  10. effgen-0.2.3/effgen/models/errors.py +177 -0
  11. effgen-0.2.3/effgen/models/fireworks_adapter.py +685 -0
  12. effgen-0.2.3/effgen/models/fireworks_models.py +1379 -0
  13. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/gemini_adapter.py +47 -1
  14. effgen-0.2.3/effgen/models/groq_adapter.py +640 -0
  15. effgen-0.2.3/effgen/models/groq_models.py +281 -0
  16. effgen-0.2.3/effgen/models/hf_inference_adapter.py +833 -0
  17. effgen-0.2.3/effgen/models/hf_inference_models.py +382 -0
  18. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/model_loader.py +135 -0
  19. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/openai_adapter.py +26 -1
  20. effgen-0.2.3/effgen/models/registry.py +199 -0
  21. effgen-0.2.3/effgen/models/replicate_adapter.py +857 -0
  22. effgen-0.2.3/effgen/models/replicate_models.py +836 -0
  23. effgen-0.2.3/effgen/models/together_adapter.py +679 -0
  24. effgen-0.2.3/effgen/models/together_models.py +2637 -0
  25. {effgen-0.2.2 → effgen-0.2.3/effgen.egg-info}/PKG-INFO +16 -1
  26. {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/SOURCES.txt +12 -0
  27. {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/requires.txt +20 -0
  28. {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/top_level.txt +0 -1
  29. {effgen-0.2.2 → effgen-0.2.3}/pyproject.toml +20 -1
  30. effgen-0.2.2/effgen/models/errors.py +0 -50
  31. {effgen-0.2.2 → effgen-0.2.3}/LICENSE +0 -0
  32. {effgen-0.2.2 → effgen-0.2.3}/README_PYPI.md +0 -0
  33. {effgen-0.2.2 → effgen-0.2.3}/effgen/api/__init__.py +0 -0
  34. {effgen-0.2.2 → effgen-0.2.3}/effgen/api/embeddings.py +0 -0
  35. {effgen-0.2.2 → effgen-0.2.3}/effgen/api/middleware.py +0 -0
  36. {effgen-0.2.2 → effgen-0.2.3}/effgen/api/openai_compat.py +0 -0
  37. {effgen-0.2.2 → effgen-0.2.3}/effgen/api/pool.py +0 -0
  38. {effgen-0.2.2 → effgen-0.2.3}/effgen/api/queue.py +0 -0
  39. {effgen-0.2.2 → effgen-0.2.3}/effgen/api/tenancy.py +0 -0
  40. {effgen-0.2.2 → effgen-0.2.3}/effgen/cache/__init__.py +0 -0
  41. {effgen-0.2.2 → effgen-0.2.3}/effgen/cache/prompt_cache.py +0 -0
  42. {effgen-0.2.2 → effgen-0.2.3}/effgen/cache/result_cache.py +0 -0
  43. {effgen-0.2.2 → effgen-0.2.3}/effgen/client/__init__.py +0 -0
  44. {effgen-0.2.2 → effgen-0.2.3}/effgen/client/client.py +0 -0
  45. {effgen-0.2.2 → effgen-0.2.3}/effgen/client/exceptions.py +0 -0
  46. {effgen-0.2.2 → effgen-0.2.3}/effgen/completion.py +0 -0
  47. {effgen-0.2.2 → effgen-0.2.3}/effgen/config/__init__.py +0 -0
  48. {effgen-0.2.2 → effgen-0.2.3}/effgen/config/loader.py +0 -0
  49. {effgen-0.2.2 → effgen-0.2.3}/effgen/config/schemas/agent_config.schema.json +0 -0
  50. {effgen-0.2.2 → effgen-0.2.3}/effgen/config/schemas/model_config.schema.json +0 -0
  51. {effgen-0.2.2 → effgen-0.2.3}/effgen/config/schemas/tool_config.schema.json +0 -0
  52. {effgen-0.2.2 → effgen-0.2.3}/effgen/config/validator.py +0 -0
  53. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/__init__.py +0 -0
  54. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/agent.py +0 -0
  55. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/aggregation.py +0 -0
  56. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/background.py +0 -0
  57. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/batch.py +0 -0
  58. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/checkpoint.py +0 -0
  59. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/clarification.py +0 -0
  60. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/complexity_analyzer.py +0 -0
  61. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/decomposition_engine.py +0 -0
  62. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/execution_tracker.py +0 -0
  63. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/feedback.py +0 -0
  64. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/human_loop.py +0 -0
  65. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/lifecycle.py +0 -0
  66. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/message_bus.py +0 -0
  67. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/orchestrator.py +0 -0
  68. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/router.py +0 -0
  69. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/session.py +0 -0
  70. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/shared_state.py +0 -0
  71. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/state.py +0 -0
  72. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/structured_output.py +0 -0
  73. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/sub_agent_manager.py +0 -0
  74. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/task.py +0 -0
  75. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/tool_calling.py +0 -0
  76. {effgen-0.2.2 → effgen-0.2.3}/effgen/core/workflow.py +0 -0
  77. {effgen-0.2.2 → effgen-0.2.3}/effgen/debug/__init__.py +0 -0
  78. {effgen-0.2.2 → effgen-0.2.3}/effgen/debug/inspector.py +0 -0
  79. {effgen-0.2.2 → effgen-0.2.3}/effgen/domains/__init__.py +0 -0
  80. {effgen-0.2.2 → effgen-0.2.3}/effgen/domains/base.py +0 -0
  81. {effgen-0.2.2 → effgen-0.2.3}/effgen/domains/expander.py +0 -0
  82. {effgen-0.2.2 → effgen-0.2.3}/effgen/domains/presets.py +0 -0
  83. {effgen-0.2.2 → effgen-0.2.3}/effgen/eval/__init__.py +0 -0
  84. {effgen-0.2.2 → effgen-0.2.3}/effgen/eval/comparison.py +0 -0
  85. {effgen-0.2.2 → effgen-0.2.3}/effgen/eval/evaluator.py +0 -0
  86. {effgen-0.2.2 → effgen-0.2.3}/effgen/eval/regression.py +0 -0
  87. {effgen-0.2.2 → effgen-0.2.3}/effgen/eval/suites.py +0 -0
  88. {effgen-0.2.2 → effgen-0.2.3}/effgen/execution/__init__.py +0 -0
  89. {effgen-0.2.2 → effgen-0.2.3}/effgen/execution/docker_sandbox.py +0 -0
  90. {effgen-0.2.2 → effgen-0.2.3}/effgen/execution/sandbox.py +0 -0
  91. {effgen-0.2.2 → effgen-0.2.3}/effgen/execution/validators.py +0 -0
  92. {effgen-0.2.2 → effgen-0.2.3}/effgen/gpu/__init__.py +0 -0
  93. {effgen-0.2.2 → effgen-0.2.3}/effgen/gpu/allocator.py +0 -0
  94. {effgen-0.2.2 → effgen-0.2.3}/effgen/gpu/monitor.py +0 -0
  95. {effgen-0.2.2 → effgen-0.2.3}/effgen/gpu/utils.py +0 -0
  96. {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/__init__.py +0 -0
  97. {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/base.py +0 -0
  98. {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/content.py +0 -0
  99. {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/injection.py +0 -0
  100. {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/presets.py +0 -0
  101. {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/tool_safety.py +0 -0
  102. {effgen-0.2.2 → effgen-0.2.3}/effgen/hardware/__init__.py +0 -0
  103. {effgen-0.2.2 → effgen-0.2.3}/effgen/hardware/platform.py +0 -0
  104. {effgen-0.2.2 → effgen-0.2.3}/effgen/memory/__init__.py +0 -0
  105. {effgen-0.2.2 → effgen-0.2.3}/effgen/memory/long_term.py +0 -0
  106. {effgen-0.2.2 → effgen-0.2.3}/effgen/memory/short_term.py +0 -0
  107. {effgen-0.2.2 → effgen-0.2.3}/effgen/memory/token_budget.py +0 -0
  108. {effgen-0.2.2 → effgen-0.2.3}/effgen/memory/vector_store.py +0 -0
  109. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/_rate_limit.py +0 -0
  110. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/anthropic_cache.py +0 -0
  111. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/anthropic_models.py +0 -0
  112. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/base.py +0 -0
  113. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/batching.py +0 -0
  114. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/capabilities.py +0 -0
  115. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/cerebras_models.py +0 -0
  116. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/gemini_files.py +0 -0
  117. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/gemini_models.py +0 -0
  118. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/gguf_engine.py +0 -0
  119. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/lazy.py +0 -0
  120. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/mlx_engine.py +0 -0
  121. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/mlx_vlm_engine.py +0 -0
  122. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/openai_models.py +0 -0
  123. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/openai_schema.py +0 -0
  124. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/pool.py +0 -0
  125. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/router.py +0 -0
  126. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/transformers_engine.py +0 -0
  127. {effgen-0.2.2 → effgen-0.2.3}/effgen/models/vllm_engine.py +0 -0
  128. {effgen-0.2.2 → effgen-0.2.3}/effgen/presets/__init__.py +0 -0
  129. {effgen-0.2.2 → effgen-0.2.3}/effgen/presets/registry.py +0 -0
  130. {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/__init__.py +0 -0
  131. {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/agent_system_prompt.py +0 -0
  132. {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/chain_manager.py +0 -0
  133. {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/optimizer.py +0 -0
  134. {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/template_manager.py +0 -0
  135. {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/templates/analysis.yaml +0 -0
  136. {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/templates/coding.yaml +0 -0
  137. {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/templates/general.yaml +0 -0
  138. {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/templates/reasoning.yaml +0 -0
  139. {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/tool_prompt_generator.py +0 -0
  140. {effgen-0.2.2 → effgen-0.2.3}/effgen/py.typed +0 -0
  141. {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/__init__.py +0 -0
  142. {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/attribution.py +0 -0
  143. {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/chunking.py +0 -0
  144. {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/context_builder.py +0 -0
  145. {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/ingest.py +0 -0
  146. {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/reranker.py +0 -0
  147. {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/search.py +0 -0
  148. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/__init__.py +0 -0
  149. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/base_tool.py +0 -0
  150. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/__init__.py +0 -0
  151. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/agentic_search.py +0 -0
  152. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/anthropic_native.py +0 -0
  153. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/bash_tool.py +0 -0
  154. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/calculator.py +0 -0
  155. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/code_executor.py +0 -0
  156. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/communication.py +0 -0
  157. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/data_analysis.py +0 -0
  158. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/datetime_tool.py +0 -0
  159. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/devops.py +0 -0
  160. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/file_ops.py +0 -0
  161. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/finance.py +0 -0
  162. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/gemini_native.py +0 -0
  163. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/json_tool.py +0 -0
  164. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/knowledge.py +0 -0
  165. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/openai_native.py +0 -0
  166. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/python_repl.py +0 -0
  167. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/retrieval.py +0 -0
  168. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/text_processing.py +0 -0
  169. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/url_fetch.py +0 -0
  170. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/weather.py +0 -0
  171. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/web_search.py +0 -0
  172. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/wikipedia_tool.py +0 -0
  173. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/fallback.py +0 -0
  174. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/plugin.py +0 -0
  175. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/__init__.py +0 -0
  176. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/a2a/__init__.py +0 -0
  177. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/a2a/agent_card.py +0 -0
  178. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/a2a/client.py +0 -0
  179. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/a2a/protocol.py +0 -0
  180. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/acp/__init__.py +0 -0
  181. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/acp/client.py +0 -0
  182. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/acp/protocol.py +0 -0
  183. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/acp/server.py +0 -0
  184. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp/__init__.py +0 -0
  185. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp/client.py +0 -0
  186. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp/protocol.py +0 -0
  187. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp/server.py +0 -0
  188. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp_official/__init__.py +0 -0
  189. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp_official/client.py +0 -0
  190. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp_official/server.py +0 -0
  191. {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/registry.py +0 -0
  192. {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/__init__.py +0 -0
  193. {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/circuit_breaker.py +0 -0
  194. {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/health.py +0 -0
  195. {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/logging.py +0 -0
  196. {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/metrics.py +0 -0
  197. {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/prometheus_metrics.py +0 -0
  198. {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/structured_logging.py +0 -0
  199. {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/tracing.py +0 -0
  200. {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/validators.py +0 -0
  201. {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/dependency_links.txt +0 -0
  202. {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/entry_points.txt +0 -0
  203. {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/not-zip-safe +0 -0
  204. {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/advanced_streaming_agent.py +0 -0
  205. {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/agent_communication.py +0 -0
  206. {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/async_concurrent_agent.py +0 -0
  207. {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/conversational_agent.py +0 -0
  208. {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/data_processing_agent.py +0 -0
  209. {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/error_recovery_agent.py +0 -0
  210. {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/multi_agent_pipeline.py +0 -0
  211. {effgen-0.2.2 → effgen-0.2.3}/examples/basic/agent_viz_mlx.py +0 -0
  212. {effgen-0.2.2 → effgen-0.2.3}/examples/basic/basic_agent.py +0 -0
  213. {effgen-0.2.2 → effgen-0.2.3}/examples/basic/basic_agent_mlx.py +0 -0
  214. {effgen-0.2.2 → effgen-0.2.3}/examples/basic/basic_agent_vllm.py +0 -0
  215. {effgen-0.2.2 → effgen-0.2.3}/examples/basic/calculator_agent.py +0 -0
  216. {effgen-0.2.2 → effgen-0.2.3}/examples/basic/chat_gui_mlx.py +0 -0
  217. {effgen-0.2.2 → effgen-0.2.3}/examples/basic/qa_agent.py +0 -0
  218. {effgen-0.2.2 → effgen-0.2.3}/examples/basic/tool_builder_gui.py +0 -0
  219. {effgen-0.2.2 → effgen-0.2.3}/examples/basic/tool_tester_gui.py +0 -0
  220. {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/basic_cerebras.py +0 -0
  221. {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_agent.py +0 -0
  222. {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_all_models.py +0 -0
  223. {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_cost_tracker.py +0 -0
  224. {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_hard_agent.py +0 -0
  225. {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_load_model.py +0 -0
  226. {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_multi_turn.py +0 -0
  227. {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_rate_limits.py +0 -0
  228. {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_streaming.py +0 -0
  229. {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_tool_calling.py +0 -0
  230. {effgen-0.2.2 → effgen-0.2.3}/examples/data/download_arc.py +0 -0
  231. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/__init__.py +0 -0
  232. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/basic_chat.py +0 -0
  233. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/caching_and_structured_agent.py +0 -0
  234. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/multi_turn_chat.py +0 -0
  235. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/native_tools_code_interpreter.py +0 -0
  236. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/native_tools_file_search.py +0 -0
  237. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/native_tools_hybrid_agent.py +0 -0
  238. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/native_tools_web_search.py +0 -0
  239. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/openai_agent.py +0 -0
  240. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/prompt_caching.py +0 -0
  241. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/reasoning_models.py +0 -0
  242. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/structured_outputs.py +0 -0
  243. {effgen-0.2.2 → effgen-0.2.3}/examples/openai/tool_calling.py +0 -0
  244. {effgen-0.2.2 → effgen-0.2.3}/examples/plugins_presets/plugin_example.py +0 -0
  245. {effgen-0.2.2 → effgen-0.2.3}/examples/plugins_presets/preset_agents.py +0 -0
  246. {effgen-0.2.2 → effgen-0.2.3}/examples/tools/advanced_multi_tool_agent.py +0 -0
  247. {effgen-0.2.2 → effgen-0.2.3}/examples/tools/coding_agent.py +0 -0
  248. {effgen-0.2.2 → effgen-0.2.3}/examples/tools/file_operations_agent.py +0 -0
  249. {effgen-0.2.2 → effgen-0.2.3}/examples/tools/multi_tool_agent.py +0 -0
  250. {effgen-0.2.2 → effgen-0.2.3}/examples/utils/sweep_model.py +0 -0
  251. {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/agentic_search_agent.py +0 -0
  252. {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/memory_agent.py +0 -0
  253. {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/retrieval_agent.py +0 -0
  254. {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/streaming_agent.py +0 -0
  255. {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/weather_agent.py +0 -0
  256. {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/web_agent.py +0 -0
  257. {effgen-0.2.2 → effgen-0.2.3}/setup.cfg +0 -0
  258. {effgen-0.2.2 → effgen-0.2.3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: effgen
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: A comprehensive framework for building agents with Small Language Models
5
5
  Home-page: https://github.com/ctrl-gaurav/effGen
6
6
  Author: Gaurav Srivastava
@@ -108,6 +108,16 @@ Provides-Extra: gguf
108
108
  Requires-Dist: llama-cpp-python>=0.2.0; extra == "gguf"
109
109
  Provides-Extra: cerebras
110
110
  Requires-Dist: cerebras-cloud-sdk>=1.0; extra == "cerebras"
111
+ Provides-Extra: groq
112
+ Requires-Dist: groq>=0.15; extra == "groq"
113
+ Provides-Extra: together
114
+ Requires-Dist: together>=1.3; extra == "together"
115
+ Provides-Extra: fireworks
116
+ Requires-Dist: fireworks-ai>=0.15; extra == "fireworks"
117
+ Provides-Extra: replicate
118
+ Requires-Dist: replicate>=1.0; extra == "replicate"
119
+ Provides-Extra: hf
120
+ Requires-Dist: huggingface_hub>=0.26; extra == "hf"
111
121
  Provides-Extra: flash-attn
112
122
  Requires-Dist: flash-attn>=2.3.0; extra == "flash-attn"
113
123
  Provides-Extra: vector-db
@@ -148,6 +158,11 @@ Requires-Dist: rouge-score>=0.1.2; extra == "all"
148
158
  Requires-Dist: nltk>=3.8.0; extra == "all"
149
159
  Requires-Dist: llama-cpp-python>=0.2.0; extra == "all"
150
160
  Requires-Dist: cerebras-cloud-sdk>=1.0; extra == "all"
161
+ Requires-Dist: groq>=0.15; extra == "all"
162
+ Requires-Dist: together>=1.3; extra == "all"
163
+ Requires-Dist: fireworks-ai>=0.15; extra == "all"
164
+ Requires-Dist: replicate>=1.0; extra == "all"
165
+ Requires-Dist: huggingface_hub>=0.26; extra == "all"
151
166
  Requires-Dist: bitsandbytes>=0.46.1; extra == "all"
152
167
  Requires-Dist: datasets>=2.14.0; extra == "all"
153
168
  Dynamic: author
@@ -36,6 +36,7 @@
36
36
 
37
37
  | | Date | Update |
38
38
  |:---:|:---|:---|
39
+ | 🚀 | **4 May 2026** | **v0.2.3 Released**: 5 new cloud backends (Groq, Together AI, Fireworks, Replicate, HuggingFace Inference) — 9 providers total. Unified ProviderRegistry, `effgen doctor` auth check, backend parity matrix. [See changelog](CHANGELOG.md#023---2026-05-04) |
39
40
  | 🚀 | **28 Apr 2026** | **v0.2.2 Released**: Gemini 3.x/2.5/2.0 registry, `thinking_budget`, Google Search grounding, Files API, Gemini native tools (GoogleSearch, UrlContext, CodeExecution). Anthropic Claude 4.7 registry, extended thinking, prompt caching (`cache_control`), streaming polish, experimental native tools. [See changelog](CHANGELOG.md#022---2026-04-28) |
40
41
  | 🚀 | **25 Apr 2026** | **v0.2.1 Released**: Cerebras backend (4 free-tier models, streaming, native tool-calling, rate-limit coordinator, cost tracking) + OpenAI gpt-5/gpt-5.4-nano/o-series with `reasoning_effort`, prompt caching, structured outputs v2, and OpenAI native tools (web_search, code_interpreter, file_search). [See changelog](CHANGELOG.md#021---2026-04-25) |
41
42
  | 🚀 | **9 Apr 2026** | **v0.2.0 Released**: Major release — native tool calling, guardrails, multi-agent orchestration, RAG pipeline, 31 tools, eval framework, production API server, MLX Apple Silicon support, Python & TypeScript SDKs. [See changelog](CHANGELOG.md#020---2026-04-09) |
@@ -270,10 +271,30 @@ Production API<br/>
270
271
 
271
272
  ---
272
273
 
273
- ## 🆕 What's New in v0.2.2
274
+ ## 🆕 What's New in v0.2.3
274
275
 
275
276
  <details open>
276
- <summary><b>Top 5 features in v0.2.2</b></summary>
277
+ <summary><b>Top 5 features in v0.2.3</b></summary>
278
+
279
+ 1. **5 new cloud backends** — `GroqAdapter`, `TogetherAdapter`, `FireworksAdapter`, `ReplicateAdapter`, `HFInferenceAdapter` — each with streaming, native tools, rate-limit coordination, and cost tracking. 9 providers total.
280
+
281
+ ```python
282
+ model = load_model("llama-3.1-8b-instant", provider="groq")
283
+ model = load_model("Qwen/Qwen2.5-72B-Instruct", provider="hf")
284
+ ```
285
+
286
+ 2. **Unified ProviderRegistry** — `list_providers()`, `list_models(provider)`, `lookup(model_id)` consolidated across all 9 adapters. `AmbiguousModelError` on bare IDs shared across providers.
287
+
288
+ 3. **`effgen doctor`** — new CLI command showing which providers have API keys configured.
289
+
290
+ 4. **Backend parity matrix** — canonical agentic task ("(17 × 23) + sqrt(144) = 403") runs identically across all providers; streaming and error surfaces verified uniform. See `docs/providers/parity.md`.
291
+
292
+ 5. **HuggingFace Router support** — `HFInferenceAdapter` with 124-model dynamic catalog, `refresh_models()` + `check_drift()`, `ModelUnavailableError` with `suggest_alternatives()`, and custom Inference Endpoint URL.
293
+
294
+ </details>
295
+
296
+ <details>
297
+ <summary><b>Top 5 features from v0.2.2</b></summary>
277
298
 
278
299
  1. **Gemini 3.x/2.5/2.0 + Gemma families** — full model registry with correct context windows, output limits, and feature flags; SDK migrated to `google-genai>=1.0.0`.
279
300
 
@@ -586,15 +607,47 @@ result = agent.run("What does the documentation say about configuration?")
586
607
 
587
608
  ## 🤖 Multi-Model Support
588
609
 
589
- effGen supports **7 inference backends** and is tested across 11+ model families:
610
+ effGen supports **9 cloud inference providers** + 4 local backends, tested across 11+ model families:
611
+
612
+ | Backend | Platform | Install | Best For |
613
+ |---------|----------|---------|----------|
614
+ | **MLX** | Apple Silicon (M1/M2/M3/M4) | `effgen[mlx]` | Native Metal GPU, unified memory, 4/8-bit quantization |
615
+ | **MLX-VLM** | Apple Silicon | `effgen[mlx-vlm]` | Vision-Language models (Qwen2-VL, LLaVA, Phi-3 Vision, 30+ architectures) |
616
+ | **vLLM** | NVIDIA GPU | `effgen[vllm]` | High-throughput batch inference |
617
+ | **Transformers** | Any (CPU/GPU) | *(bundled)* | Universal compatibility, local models |
618
+ | **OpenAI** | Cloud API | *(bundled)* | gpt-5/gpt-5.4/o-series, reasoning_effort, structured outputs, native tools |
619
+ | **Anthropic** | Cloud API | *(bundled)* | Claude 4.7/4.x, extended thinking, prompt caching, native tools |
620
+ | **Google Gemini** | Cloud API | *(bundled)* | Gemini 3.x/2.5/2.0, thinking_budget, grounding, Files API, native tools |
621
+ | **Cerebras** | Cloud API | `effgen[cerebras]` | 4 free-tier models (llama3.1-8b, qwen-3-235b), ultra-low latency |
622
+ | **Groq** | Cloud API | `effgen[groq]` | 16 models (llama-3.3-70b, mixtral, qwen3-32b), ultra-fast free-tier inference |
623
+ | **Together AI** | Cloud API | `effgen[together]` | 163-model catalog (llama, deepseek, qwen, mistral), per-model pricing |
624
+ | **Fireworks** | Cloud API | `effgen[fireworks]` | 80 chat models (54 tool-capable), serverless + dedicated |
625
+ | **Replicate** | Cloud API | `effgen[replicate]` | 38 models, async run-poll, SSE streaming, compute-second billing |
626
+ | **HuggingFace** | Cloud API | `effgen[hf]` | 124-model HF Router catalog, custom Inference Endpoints, free serverless tier |
627
+
628
+ ### Provider Auth Check
629
+
630
+ ```bash
631
+ # See which API keys are configured
632
+ effgen doctor
633
+ ```
634
+
635
+ ### Quick Cloud Start
590
636
 
591
- | Backend | Platform | Best For |
592
- |---------|----------|----------|
593
- | **MLX** | Apple Silicon (M1/M2/M3/M4) | Native Metal GPU, unified memory, 4/8-bit quantization |
594
- | **MLX-VLM** | Apple Silicon | Vision-Language models (Qwen2-VL, LLaVA, Phi-3 Vision, 30+ architectures) |
595
- | **vLLM** | NVIDIA GPU | High-throughput batch inference |
596
- | **Transformers** | Any (CPU/GPU) | Universal compatibility |
597
- | **API** | Cloud | OpenAI (gpt-5/gpt-5.4/o-series + reasoning_effort), Anthropic (Claude 4.7/4.x + thinking + caching), Google Gemini (3.x/2.5/2.0 + thinking_budget + grounding + Files API + native tools), Cerebras (4 free-tier models, streaming + native tools) |
637
+ ```python
638
+ from effgen import load_model, Agent
639
+ from effgen.core.agent import AgentConfig
640
+ from effgen.tools.builtin import Calculator
641
+
642
+ # Any of the 9 cloud providers
643
+ model = load_model("llama-3.1-8b-instant", provider="groq") # Groq
644
+ # model = load_model("meta-llama/Llama-3.3-70B-Instruct-Turbo", provider="together")
645
+ # model = load_model("Qwen/Qwen2.5-72B-Instruct", provider="hf")
646
+
647
+ agent = Agent(config=AgentConfig(name="agent", model=model, tools=[Calculator()]))
648
+ result = agent.run("What is (17 * 23) + sqrt(144)?")
649
+ print(result.output) # → 403
650
+ ```
598
651
 
599
652
  ### Top Recommended Models
600
653
 
@@ -9,7 +9,7 @@ This framework enables SLMs to function as powerful agentic systems through:
9
9
  - Comprehensive configuration management
10
10
  """
11
11
 
12
- __version__ = "0.2.2"
12
+ __version__ = "0.2.3"
13
13
  __author__ = "effGen Team"
14
14
  __license__ = "Apache-2.0"
15
15
 
@@ -74,30 +74,75 @@ from effgen.models import (
74
74
  AnthropicAdapter,
75
75
  BaseModel,
76
76
  CerebrasAdapter,
77
+ FireworksAdapter,
77
78
  GeminiAdapter,
78
79
  GenerationConfig,
79
80
  GenerationResult,
81
+ GroqAdapter,
82
+ HFInferenceAdapter,
80
83
  ModelLoader,
81
84
  OpenAIAdapter,
85
+ ReplicateAdapter,
82
86
  StreamChunk,
87
+ TogetherAdapter,
83
88
  TransformersEngine,
84
89
  VLLMEngine,
85
90
  load_model,
86
91
  )
87
92
  from effgen.models._rate_limit import RateLimitCoordinator, RateLimitExceeded # noqa: I001
93
+ from effgen.models.auth import check_keys
88
94
  from effgen.models.cerebras_models import available_models as cerebras_available_models
89
95
  from effgen.models.cerebras_models import free_tier_models as cerebras_free_tier_models
90
96
  from effgen.models.cerebras_models import model_info as cerebras_model_info
91
- from effgen.models.errors import ModelRefusalError, ToolIncompatibleError
97
+ from effgen.models.errors import (
98
+ AmbiguousModelError,
99
+ ModelAuthError,
100
+ ModelNotFoundError,
101
+ ModelRefusalError,
102
+ ModelTimeoutError,
103
+ ModelUnavailableError,
104
+ ToolIncompatibleError,
105
+ )
106
+ from effgen.models.fireworks_models import available_models as fireworks_available_models
107
+ from effgen.models.fireworks_models import chat_models as fireworks_chat_models
108
+ from effgen.models.fireworks_models import pricing_table as fireworks_pricing_table
109
+ from effgen.models.fireworks_models import refresh_models as fireworks_refresh_models
110
+ from effgen.models.fireworks_models import tool_capable_models as fireworks_tool_capable_models
92
111
  from effgen.models.gemini_models import available_models as gemini_available_models
93
112
  from effgen.models.gemini_models import free_tier_models as gemini_free_tier_models
94
113
  from effgen.models.gemini_models import model_info as gemini_model_info
95
114
  from effgen.models.gemini_models import recommended_models as gemini_recommended_models
115
+ from effgen.models.groq_models import available_models as groq_available_models
116
+ from effgen.models.groq_models import chat_models as groq_chat_models
117
+ from effgen.models.groq_models import tool_capable_models as groq_tool_capable_models
118
+ from effgen.models.hf_inference_models import available_models as hf_available_models
119
+ from effgen.models.hf_inference_models import catalog_summary as hf_catalog_summary
120
+ from effgen.models.hf_inference_models import chat_models as hf_chat_models
121
+ from effgen.models.hf_inference_models import cheapest_provider as hf_cheapest_provider
122
+ from effgen.models.hf_inference_models import check_drift as hf_check_drift
123
+ from effgen.models.hf_inference_models import get_model_info as hf_get_model_info
124
+ from effgen.models.hf_inference_models import list_providers_for as hf_list_providers_for
125
+ from effgen.models.hf_inference_models import refresh_models as hf_refresh_models
126
+ from effgen.models.hf_inference_models import serverless_models as hf_serverless_models
127
+ from effgen.models.hf_inference_models import suggest_alternatives as hf_suggest_alternatives
128
+ from effgen.models.hf_inference_models import tool_capable_models as hf_tool_capable_models
96
129
  from effgen.models.openai_models import available_models as openai_available_models
97
130
  from effgen.models.openai_models import chat_models as openai_chat_models
98
131
  from effgen.models.openai_models import model_info as openai_model_info
99
132
  from effgen.models.openai_models import reasoning_models as openai_reasoning_models # noqa: I001
100
133
  from effgen.models.openai_schema import to_openai_schema
134
+ from effgen.models.registry import ProviderRegistry, list_models, list_providers, lookup
135
+ from effgen.models.replicate_models import available_models as replicate_available_models
136
+ from effgen.models.replicate_models import get_model_info as replicate_get_model_info
137
+ from effgen.models.replicate_models import refresh_models as replicate_refresh_models
138
+ from effgen.models.replicate_models import streaming_models as replicate_streaming_models
139
+ from effgen.models.replicate_models import tool_capable_models as replicate_tool_capable_models
140
+ from effgen.models.together_models import available_models as together_available_models
141
+ from effgen.models.together_models import chat_models as together_chat_models
142
+ from effgen.models.together_models import pricing_table as together_pricing_table
143
+ from effgen.models.together_models import refresh_models as together_refresh_models
144
+ from effgen.models.together_models import serverless_models as together_serverless_models
145
+ from effgen.models.together_models import tool_capable_models as together_tool_capable_models
101
146
 
102
147
  # Preset imports
103
148
  from effgen.presets import create_agent, list_presets
@@ -204,17 +249,38 @@ __all__ = [
204
249
  "StreamChunk",
205
250
  "GeminiAdapter",
206
251
  "CerebrasAdapter",
252
+ "GroqAdapter",
253
+ "TogetherAdapter",
254
+ "FireworksAdapter",
255
+ "ReplicateAdapter",
256
+ "HFInferenceAdapter",
207
257
  "ModelLoader",
208
258
  "GenerationConfig",
209
259
  "GenerationResult",
210
260
  "RateLimitCoordinator",
211
261
  "RateLimitExceeded",
212
262
  "ModelRefusalError",
263
+ "ModelAuthError",
264
+ "ModelTimeoutError",
265
+ "ModelUnavailableError",
266
+ "ModelNotFoundError",
267
+ "AmbiguousModelError",
268
+ "ToolIncompatibleError",
213
269
  "to_openai_schema",
270
+ # Provider registry + auth
271
+ "ProviderRegistry",
272
+ "list_providers",
273
+ "list_models",
274
+ "lookup",
275
+ "check_keys",
214
276
  # Cerebras helpers
215
277
  "cerebras_available_models",
216
278
  "cerebras_free_tier_models",
217
279
  "cerebras_model_info",
280
+ # Groq helpers
281
+ "groq_available_models",
282
+ "groq_chat_models",
283
+ "groq_tool_capable_models",
218
284
  # OpenAI helpers
219
285
  "openai_available_models",
220
286
  "openai_chat_models",
@@ -225,6 +291,37 @@ __all__ = [
225
291
  "gemini_free_tier_models",
226
292
  "gemini_model_info",
227
293
  "gemini_recommended_models",
294
+ # Together helpers
295
+ "together_available_models",
296
+ "together_chat_models",
297
+ "together_tool_capable_models",
298
+ "together_pricing_table",
299
+ "together_refresh_models",
300
+ "together_serverless_models",
301
+ # Fireworks helpers
302
+ "fireworks_available_models",
303
+ "fireworks_chat_models",
304
+ "fireworks_tool_capable_models",
305
+ "fireworks_pricing_table",
306
+ "fireworks_refresh_models",
307
+ # Replicate helpers
308
+ "replicate_available_models",
309
+ "replicate_streaming_models",
310
+ "replicate_tool_capable_models",
311
+ "replicate_refresh_models",
312
+ "replicate_get_model_info",
313
+ # HF Inference helpers
314
+ "hf_available_models",
315
+ "hf_chat_models",
316
+ "hf_tool_capable_models",
317
+ "hf_serverless_models",
318
+ "hf_suggest_alternatives",
319
+ "hf_get_model_info",
320
+ "hf_refresh_models",
321
+ "hf_check_drift",
322
+ "hf_catalog_summary",
323
+ "hf_list_providers_for",
324
+ "hf_cheapest_provider",
228
325
 
229
326
  # Tools
230
327
  "BaseTool",
@@ -1832,6 +1832,13 @@ Examples:
1832
1832
  # Health check command
1833
1833
  subparsers.add_parser('health', help='Check effGen infrastructure health')
1834
1834
 
1835
+ # Doctor command — API key availability check
1836
+ doctor_parser = subparsers.add_parser('doctor', help='Check provider API key availability')
1837
+ doctor_parser.add_argument('--json', dest='output_json', action='store_true',
1838
+ help='Output as JSON')
1839
+ doctor_parser.add_argument('--provider', dest='doctor_provider',
1840
+ help='Check a specific provider only')
1841
+
1835
1842
  # Plugin commands
1836
1843
  plugin_parser = subparsers.add_parser('create-plugin', help='Generate a plugin project scaffold')
1837
1844
  plugin_parser.add_argument('plugin_name', help='Plugin name (e.g. my_tools)')
@@ -2007,6 +2014,101 @@ dependencies = ["effgen"]
2007
2014
  return 0
2008
2015
 
2009
2016
 
2017
+ def _handle_doctor_command(args) -> int:
2018
+ """Handle the 'effgen doctor' subcommand — check API key availability."""
2019
+ import json as _json
2020
+
2021
+ # Load .env from standard locations before checking keys (all, non-overriding)
2022
+ try:
2023
+ from dotenv import load_dotenv
2024
+ for _env_path in [
2025
+ Path.home() / ".effgen" / ".env",
2026
+ Path(".env"),
2027
+ Path(__file__).parent.parent / ".env",
2028
+ ]:
2029
+ if _env_path.exists():
2030
+ load_dotenv(_env_path, override=False)
2031
+ except ImportError:
2032
+ pass
2033
+
2034
+ from effgen.models.auth import check_keys
2035
+ from effgen.models.registry import ProviderRegistry
2036
+
2037
+ # Ensure all adapters are imported so they self-register
2038
+ try:
2039
+ import effgen.models.anthropic_adapter # noqa: F401
2040
+ import effgen.models.cerebras_adapter # noqa: F401
2041
+ import effgen.models.fireworks_adapter # noqa: F401
2042
+ import effgen.models.gemini_adapter # noqa: F401
2043
+ import effgen.models.groq_adapter # noqa: F401
2044
+ import effgen.models.hf_inference_adapter # noqa: F401
2045
+ import effgen.models.openai_adapter # noqa: F401
2046
+ import effgen.models.replicate_adapter # noqa: F401
2047
+ import effgen.models.together_adapter # noqa: F401
2048
+ except Exception:
2049
+ pass
2050
+
2051
+ provider_filter = getattr(args, 'doctor_provider', None)
2052
+ providers_to_check = [provider_filter] if provider_filter else None
2053
+
2054
+ results = check_keys(providers_to_check)
2055
+
2056
+ if getattr(args, 'output_json', False):
2057
+ print(_json.dumps(results, indent=2))
2058
+ return 0
2059
+
2060
+ # Pretty-print
2061
+ if RICH_AVAILABLE:
2062
+ console = Console()
2063
+ table = Table(title="effgen doctor — Provider API Key Status")
2064
+ table.add_column("Provider", style="cyan", no_wrap=True)
2065
+ table.add_column("Status", style="white")
2066
+ table.add_column("Env Key Found", style="dim")
2067
+ table.add_column("Models", style="dim", justify="right")
2068
+
2069
+ for prov in sorted(results):
2070
+ info = results[prov]
2071
+ available = info.get("available", False)
2072
+ env_key = info.get("env_key") or "—"
2073
+ status = "[green]READY[/green]" if available else "[red]MISSING KEY[/red]"
2074
+ try:
2075
+ n_models = str(len(ProviderRegistry.list_models(prov)))
2076
+ except Exception:
2077
+ n_models = "?"
2078
+ table.add_row(prov, status, env_key, n_models)
2079
+
2080
+ console.print(table)
2081
+
2082
+ # Print hints for missing keys
2083
+ missing = [p for p, i in results.items() if not i.get("available")]
2084
+ if missing:
2085
+ console.print("\n[yellow]Missing keys — set in ~/.effgen/.env or export:[/yellow]")
2086
+ for prov in missing:
2087
+ keys = results[prov].get("env_keys_checked", [])
2088
+ key_str = " or ".join(keys) if keys else f"{prov.upper()}_API_KEY"
2089
+ console.print(f" export {key_str}=<your-key>")
2090
+ else:
2091
+ console.print("\n[green]All providers ready![/green]")
2092
+ else:
2093
+ print("effgen doctor — Provider API Key Status")
2094
+ print("-" * 50)
2095
+ for prov in sorted(results):
2096
+ info = results[prov]
2097
+ available = info.get("available", False)
2098
+ env_key = info.get("env_key") or "not set"
2099
+ status = "READY" if available else "MISSING KEY"
2100
+ print(f" {prov:15s} {status:12s} (key: {env_key})")
2101
+ missing = [p for p, i in results.items() if not i.get("available")]
2102
+ if missing:
2103
+ print("\nMissing keys — set in ~/.effgen/.env or export:")
2104
+ for prov in missing:
2105
+ keys = results[prov].get("env_keys_checked", [])
2106
+ key_str = " or ".join(keys) if keys else f"{prov.upper()}_API_KEY"
2107
+ print(f" export {key_str}=<your-key>")
2108
+
2109
+ return 0
2110
+
2111
+
2010
2112
  def _handle_workflow_command(args, cli) -> int:
2011
2113
  """Handle the 'workflow' CLI subcommand."""
2012
2114
  from effgen.core.workflow import WorkflowDAG
@@ -2100,7 +2202,7 @@ def _handle_batch_command(args, cli) -> int:
2100
2202
  config = AgentConfig(name="batch-agent", model=model, max_iterations=5)
2101
2203
  agent = Agent(config)
2102
2204
 
2103
- config = BatchConfig(
2205
+ batch_config = BatchConfig(
2104
2206
  max_concurrency=args.concurrency,
2105
2207
  batch_size=args.batch_size,
2106
2208
  retry_failed=args.retries,
@@ -2109,7 +2211,7 @@ def _handle_batch_command(args, cli) -> int:
2109
2211
 
2110
2212
  runner = BatchRunner(agent)
2111
2213
  cli.print(f"Loading queries from {input_path}...")
2112
- result = runner.run_from_file(input_path, config=config, query_field=query_field)
2214
+ result = runner.run_from_file(input_path, config=batch_config, query_field=query_field)
2113
2215
 
2114
2216
  cli.print(
2115
2217
  f"\nBatch complete: {result.succeeded}/{result.total} succeeded "
@@ -2405,6 +2507,8 @@ def main():
2405
2507
  checker = HealthChecker()
2406
2508
  all_passed = checker.print_results()
2407
2509
  exit_code = 0 if all_passed else 1
2510
+ elif args.command == 'doctor':
2511
+ exit_code = _handle_doctor_command(args)
2408
2512
  elif args.command == 'resume':
2409
2513
  exit_code = _handle_resume_command(args, cli)
2410
2514
  elif args.command == 'sessions':
@@ -33,6 +33,7 @@ from effgen.models.anthropic_cache import (
33
33
  )
34
34
  from effgen.models.anthropic_models import ANTHROPIC_MODELS
35
35
  from effgen.models.anthropic_models import get_model_info as get_anthropic_model_info
36
+ from effgen.models.auth import check_keys
36
37
  from effgen.models.base import (
37
38
  BaseModel,
38
39
  BatchModel,
@@ -52,14 +53,30 @@ from effgen.models.capabilities import (
52
53
  register_model_capability,
53
54
  )
54
55
  from effgen.models.cerebras_adapter import CerebrasAdapter
55
- from effgen.models.errors import ModelRefusalError
56
+ from effgen.models.errors import (
57
+ AmbiguousModelError,
58
+ ModelAuthError,
59
+ ModelNotFoundError,
60
+ ModelRefusalError,
61
+ ModelTimeoutError,
62
+ ModelUnavailableError,
63
+ )
64
+ from effgen.models.fireworks_adapter import FireworksAdapter
65
+ from effgen.models.fireworks_models import FIREWORKS_MODELS
56
66
  from effgen.models.gemini_adapter import GeminiAdapter
57
67
  from effgen.models.gemini_files import FileRef, upload_file
68
+ from effgen.models.groq_adapter import GroqAdapter
69
+ from effgen.models.groq_models import GROQ_MODELS
70
+ from effgen.models.hf_inference_adapter import HFInferenceAdapter
71
+ from effgen.models.hf_inference_models import HF_MODELS
58
72
  from effgen.models.lazy import LazyModel
59
73
  from effgen.models.model_loader import ModelLoader, load_model
60
74
  from effgen.models.openai_adapter import OpenAIAdapter
61
75
  from effgen.models.openai_schema import to_openai_schema
62
76
  from effgen.models.pool import ModelPool, PoolConfig
77
+ from effgen.models.registry import ProviderRegistry, list_models, list_providers, lookup
78
+ from effgen.models.replicate_adapter import ReplicateAdapter
79
+ from effgen.models.replicate_models import REPLICATE_MODELS
63
80
  from effgen.models.router import (
64
81
  ComplexityEstimate,
65
82
  ComplexityLevel,
@@ -68,6 +85,8 @@ from effgen.models.router import (
68
85
  RoutingDecision,
69
86
  estimate_complexity,
70
87
  )
88
+ from effgen.models.together_adapter import TogetherAdapter
89
+ from effgen.models.together_models import TOGETHER_MODELS
71
90
  from effgen.models.transformers_engine import TransformersEngine
72
91
  from effgen.models.vllm_engine import VLLMEngine
73
92
 
@@ -105,6 +124,18 @@ __all__ = [
105
124
  "AnthropicAdapter",
106
125
  "GeminiAdapter",
107
126
  "CerebrasAdapter",
127
+ "GroqAdapter",
128
+ "TogetherAdapter",
129
+ "FireworksAdapter",
130
+ "ReplicateAdapter",
131
+ "HFInferenceAdapter",
132
+
133
+ # Model registries
134
+ "GROQ_MODELS",
135
+ "TOGETHER_MODELS",
136
+ "FIREWORKS_MODELS",
137
+ "REPLICATE_MODELS",
138
+ "HF_MODELS",
108
139
 
109
140
  # Anthropic streaming
110
141
  "StreamChunk",
@@ -138,6 +169,18 @@ __all__ = [
138
169
 
139
170
  # Errors
140
171
  "ModelRefusalError",
172
+ "ModelAuthError",
173
+ "ModelTimeoutError",
174
+ "ModelUnavailableError",
175
+ "ModelNotFoundError",
176
+ "AmbiguousModelError",
177
+
178
+ # Provider registry + auth
179
+ "ProviderRegistry",
180
+ "list_providers",
181
+ "list_models",
182
+ "lookup",
183
+ "check_keys",
141
184
 
142
185
  # Schema helpers
143
186
  "to_openai_schema",
@@ -63,11 +63,99 @@ _RATES: dict[str, dict[str, tuple[float, float]]] = {
63
63
  "gemini-1.5-pro": (3.50, 10.50),
64
64
  "*": (1.00, 3.00),
65
65
  },
66
+ "groq": {
67
+ # OFFICIAL: Groq free tier = $0 for all models (2026-04-28)
68
+ "*": (0.0, 0.0),
69
+ },
70
+ "together": {
71
+ # OFFICIAL rates from Together AI pricing page (2026-04-28).
72
+ # Per million tokens: (input, output)
73
+ "meta-llama/Llama-3.3-70B-Instruct-Turbo": (0.88, 0.88),
74
+ "meta-llama/Meta-Llama-3-8B-Instruct-Lite": (0.10, 0.10),
75
+ "meta-llama/Meta-Llama-3-8B-Instruct": (0.20, 0.20),
76
+ "meta-llama/Llama-4-Scout-17B-16E-Instruct": (0.18, 0.59),
77
+ "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": (0.27, 0.85),
78
+ "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo": (0.18, 0.18),
79
+ "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo": (0.88, 0.88),
80
+ "meta-llama/Meta-Llama-3-70B-Instruct-Turbo": (0.88, 0.88),
81
+ "meta-llama/Meta-Llama-3.1-405B-Instruct": (3.50, 3.50),
82
+ "meta-llama/Llama-3.2-1B-Instruct": (0.06, 0.06),
83
+ "meta-llama/Llama-3-8b-chat-hf": (0.20, 0.20),
84
+ "Qwen/Qwen2.5-7B-Instruct-Turbo": (0.30, 0.30),
85
+ "Qwen/Qwen2.5-72B-Instruct-Turbo": (1.20, 1.20),
86
+ "Qwen/Qwen2.5-72B-Instruct": (1.20, 1.20),
87
+ "Qwen/Qwen2.5-14B-Instruct": (0.80, 0.80),
88
+ "Qwen/Qwen2.5-Coder-32B-Instruct": (0.80, 0.80),
89
+ "Qwen/QwQ-32B": (1.20, 1.20),
90
+ "Qwen/Qwen3.5-9B": (0.10, 0.15),
91
+ "Qwen/Qwen3.5-397B-A17B": (0.60, 3.60),
92
+ "Qwen/Qwen3-235B-A22B-Instruct-2507-tput": (0.20, 0.60),
93
+ "Qwen/Qwen3-Coder-Next-FP8": (0.50, 1.20),
94
+ "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": (2.00, 2.00),
95
+ "Qwen/Qwen3-235B-A22B-Thinking-2507": (0.65, 3.00),
96
+ "Qwen/Qwen3-Next-80B-A3B-Instruct": (0.15, 1.50),
97
+ "Qwen/Qwen3-Next-80B-A3B-Thinking": (0.15, 1.50),
98
+ "Qwen/Qwen3-VL-8B-Instruct": (0.18, 0.68),
99
+ "Qwen/Qwen3-VL-32B-Instruct": (0.50, 1.50),
100
+ "Qwen/Qwen2-VL-72B-Instruct": (1.20, 1.20),
101
+ "Qwen/Qwen2.5-VL-72B-Instruct": (1.95, 8.00),
102
+ "deepseek-ai/DeepSeek-V3.1": (0.60, 1.70),
103
+ "deepseek-ai/DeepSeek-V3-0324": (1.25, 1.25),
104
+ "deepseek-ai/DeepSeek-V4-Pro": (2.10, 4.40),
105
+ "deepseek-ai/DeepSeek-R1": (3.00, 7.00),
106
+ "deepseek-ai/DeepSeek-R1-0528": (3.00, 7.00),
107
+ "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B": (0.18, 0.18),
108
+ "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B": (0.00, 0.00),
109
+ "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B": (1.60, 1.60),
110
+ "deepseek-ai/DeepSeek-R1-Distill-Llama-70B": (2.00, 2.00),
111
+ "mistralai/Mixtral-8x7B-Instruct-v0.1": (0.60, 0.60),
112
+ "mistralai/Mistral-7B-Instruct-v0.3": (0.20, 0.20),
113
+ "mistralai/Mistral-7B-Instruct-v0.1": (0.20, 0.20),
114
+ "mistralai/Mistral-Small-24B-Instruct-2501": (0.10, 0.30),
115
+ "mistralai/Ministral-3-14B-Instruct-2512": (0.20, 0.20),
116
+ "openai/gpt-oss-20b": (0.05, 0.20),
117
+ "openai/gpt-oss-120b": (0.15, 0.60),
118
+ "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF": (0.88, 0.88),
119
+ "nvidia/NVIDIA-Nemotron-Nano-9B-v2": (0.06, 0.25),
120
+ "moonshotai/Kimi-K2.5": (0.50, 2.80),
121
+ "moonshotai/Kimi-K2.6": (1.20, 4.50),
122
+ "moonshotai/Kimi-K2-Thinking": (1.20, 4.00),
123
+ "MiniMaxAI/MiniMax-M2.5": (0.30, 1.20),
124
+ "MiniMaxAI/MiniMax-M2.7": (0.30, 1.20),
125
+ "MiniMaxAI/MiniMax-M2": (0.00, 0.00),
126
+ "zai-org/GLM-4.5-Air-FP8": (0.20, 1.10),
127
+ "zai-org/GLM-4.6": (0.60, 2.20),
128
+ "zai-org/GLM-4.7": (0.45, 2.00),
129
+ "zai-org/GLM-5": (1.00, 3.20),
130
+ "zai-org/GLM-5.1": (1.40, 4.40),
131
+ "google/gemma-4-31B-it": (0.20, 0.50),
132
+ "google/gemma-3n-E4B-it": (0.06, 0.12),
133
+ "LiquidAI/LFM2-24B-A2B": (0.03, 0.12),
134
+ "arize-ai/qwen-2-1.5b-instruct": (0.10, 0.10),
135
+ "essentialai/rnj-1-instruct": (0.15, 0.15),
136
+ "deepcogito/cogito-v2-1-671b": (1.25, 1.25),
137
+ "Qwen/Qwen2-1.5B-Instruct": (0.02, 0.02),
138
+ # Free / dedicated-endpoint models → $0 in tracker
139
+ "*": (0.0, 0.0),
140
+ },
66
141
  }
67
142
 
68
143
 
69
144
  def _rate(provider: str, model: str) -> tuple[float, float]:
70
145
  """Lookup (input_per_M, output_per_M) rate for provider/model."""
146
+ if provider.lower() == "fireworks":
147
+ try:
148
+ from effgen.models.fireworks_models import FIREWORKS_MODELS
149
+ info = FIREWORKS_MODELS.get(model)
150
+ if info is not None:
151
+ return (
152
+ float(info.get("pricing_per_1m_input", 0.0)),
153
+ float(info.get("pricing_per_1m_output", 0.0)),
154
+ )
155
+ except Exception:
156
+ pass
157
+ return (0.0, 0.0)
158
+
71
159
  provider_rates = _RATES.get(provider.lower(), {})
72
160
  # Exact match first, then prefix match, then wildcard
73
161
  if model in provider_rates:
@@ -33,6 +33,7 @@ from effgen.models.base import (
33
33
  ModelType,
34
34
  TokenCount,
35
35
  )
36
+ from effgen.models.errors import ModelAuthError, ModelNotFoundError
36
37
 
37
38
  logger = logging.getLogger(__name__)
38
39
 
@@ -391,8 +392,15 @@ class AnthropicAdapter(FunctionCallingModel):
391
392
  metadata=metadata,
392
393
  )
393
394
 
395
+ except (ModelAuthError, ModelNotFoundError):
396
+ raise
394
397
  except Exception as e:
395
398
  logger.error(f"Anthropic API call failed: {e}")
399
+ msg = str(e)
400
+ if "401" in msg or "authentication_error" in msg.lower() or "invalid x-api-key" in msg.lower():
401
+ raise ModelAuthError("anthropic", self.model_name, msg) from e
402
+ if "404" in msg or "not_found_error" in msg.lower():
403
+ raise ModelNotFoundError("anthropic", self.model_name, msg) from e
396
404
  raise RuntimeError(f"Generation failed: {e}") from e
397
405
 
398
406
  # ── Generate stream ───────────────────────────────────────────────────
@@ -802,3 +810,23 @@ class AnthropicAdapter(FunctionCallingModel):
802
810
  self.total_cost = 0.0
803
811
  self.total_tokens = 0
804
812
  logger.info("Usage statistics reset")
813
+
814
+
815
+ # ---------------------------------------------------------------------------
816
+ # Self-register with the ProviderRegistry on first import (idempotent)
817
+ # ---------------------------------------------------------------------------
818
+ def _register() -> None:
819
+ try:
820
+ from effgen.models.anthropic_models import ANTHROPIC_MODELS
821
+ from effgen.models.registry import ProviderRegistry
822
+ ProviderRegistry.register(
823
+ "anthropic",
824
+ AnthropicAdapter,
825
+ ANTHROPIC_MODELS,
826
+ env_keys=["ANTHROPIC_API_KEY"],
827
+ )
828
+ except Exception:
829
+ pass
830
+
831
+
832
+ _register()