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.
- {effgen-0.2.2/effgen.egg-info → effgen-0.2.3}/PKG-INFO +16 -1
- {effgen-0.2.2 → effgen-0.2.3}/README.md +63 -10
- {effgen-0.2.2 → effgen-0.2.3}/effgen/__init__.py +99 -2
- {effgen-0.2.2 → effgen-0.2.3}/effgen/cli.py +106 -2
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/__init__.py +44 -1
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/_cost.py +88 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/anthropic_adapter.py +28 -0
- effgen-0.2.3/effgen/models/auth.py +56 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/cerebras_adapter.py +82 -33
- effgen-0.2.3/effgen/models/errors.py +177 -0
- effgen-0.2.3/effgen/models/fireworks_adapter.py +685 -0
- effgen-0.2.3/effgen/models/fireworks_models.py +1379 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/gemini_adapter.py +47 -1
- effgen-0.2.3/effgen/models/groq_adapter.py +640 -0
- effgen-0.2.3/effgen/models/groq_models.py +281 -0
- effgen-0.2.3/effgen/models/hf_inference_adapter.py +833 -0
- effgen-0.2.3/effgen/models/hf_inference_models.py +382 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/model_loader.py +135 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/openai_adapter.py +26 -1
- effgen-0.2.3/effgen/models/registry.py +199 -0
- effgen-0.2.3/effgen/models/replicate_adapter.py +857 -0
- effgen-0.2.3/effgen/models/replicate_models.py +836 -0
- effgen-0.2.3/effgen/models/together_adapter.py +679 -0
- effgen-0.2.3/effgen/models/together_models.py +2637 -0
- {effgen-0.2.2 → effgen-0.2.3/effgen.egg-info}/PKG-INFO +16 -1
- {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/SOURCES.txt +12 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/requires.txt +20 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/top_level.txt +0 -1
- {effgen-0.2.2 → effgen-0.2.3}/pyproject.toml +20 -1
- effgen-0.2.2/effgen/models/errors.py +0 -50
- {effgen-0.2.2 → effgen-0.2.3}/LICENSE +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/README_PYPI.md +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/api/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/api/embeddings.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/api/middleware.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/api/openai_compat.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/api/pool.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/api/queue.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/api/tenancy.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/cache/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/cache/prompt_cache.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/cache/result_cache.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/client/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/client/client.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/client/exceptions.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/completion.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/config/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/config/loader.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/config/schemas/agent_config.schema.json +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/config/schemas/model_config.schema.json +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/config/schemas/tool_config.schema.json +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/config/validator.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/aggregation.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/background.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/batch.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/checkpoint.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/clarification.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/complexity_analyzer.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/decomposition_engine.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/execution_tracker.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/feedback.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/human_loop.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/lifecycle.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/message_bus.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/orchestrator.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/router.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/session.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/shared_state.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/state.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/structured_output.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/sub_agent_manager.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/task.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/tool_calling.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/core/workflow.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/debug/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/debug/inspector.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/domains/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/domains/base.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/domains/expander.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/domains/presets.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/eval/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/eval/comparison.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/eval/evaluator.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/eval/regression.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/eval/suites.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/execution/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/execution/docker_sandbox.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/execution/sandbox.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/execution/validators.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/gpu/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/gpu/allocator.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/gpu/monitor.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/gpu/utils.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/base.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/content.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/injection.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/presets.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/guardrails/tool_safety.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/hardware/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/hardware/platform.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/memory/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/memory/long_term.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/memory/short_term.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/memory/token_budget.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/memory/vector_store.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/_rate_limit.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/anthropic_cache.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/anthropic_models.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/base.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/batching.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/capabilities.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/cerebras_models.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/gemini_files.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/gemini_models.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/gguf_engine.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/lazy.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/mlx_engine.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/mlx_vlm_engine.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/openai_models.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/openai_schema.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/pool.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/router.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/transformers_engine.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/models/vllm_engine.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/presets/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/presets/registry.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/agent_system_prompt.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/chain_manager.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/optimizer.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/template_manager.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/templates/analysis.yaml +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/templates/coding.yaml +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/templates/general.yaml +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/templates/reasoning.yaml +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/prompts/tool_prompt_generator.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/py.typed +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/attribution.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/chunking.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/context_builder.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/ingest.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/reranker.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/rag/search.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/base_tool.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/agentic_search.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/anthropic_native.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/bash_tool.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/calculator.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/code_executor.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/communication.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/data_analysis.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/datetime_tool.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/devops.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/file_ops.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/finance.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/gemini_native.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/json_tool.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/knowledge.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/openai_native.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/python_repl.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/retrieval.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/text_processing.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/url_fetch.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/weather.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/web_search.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/builtin/wikipedia_tool.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/fallback.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/plugin.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/a2a/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/a2a/agent_card.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/a2a/client.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/a2a/protocol.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/acp/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/acp/client.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/acp/protocol.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/acp/server.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp/client.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp/protocol.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp/server.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp_official/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp_official/client.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/protocols/mcp_official/server.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/tools/registry.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/circuit_breaker.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/health.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/logging.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/metrics.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/prometheus_metrics.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/structured_logging.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/tracing.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen/utils/validators.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/dependency_links.txt +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/entry_points.txt +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/effgen.egg-info/not-zip-safe +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/advanced_streaming_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/agent_communication.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/async_concurrent_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/conversational_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/data_processing_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/error_recovery_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/advanced/multi_agent_pipeline.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/basic/agent_viz_mlx.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/basic/basic_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/basic/basic_agent_mlx.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/basic/basic_agent_vllm.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/basic/calculator_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/basic/chat_gui_mlx.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/basic/qa_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/basic/tool_builder_gui.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/basic/tool_tester_gui.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/basic_cerebras.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_all_models.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_cost_tracker.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_hard_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_load_model.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_multi_turn.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_rate_limits.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_streaming.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/cerebras/cerebras_tool_calling.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/data/download_arc.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/__init__.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/basic_chat.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/caching_and_structured_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/multi_turn_chat.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/native_tools_code_interpreter.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/native_tools_file_search.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/native_tools_hybrid_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/native_tools_web_search.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/openai_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/prompt_caching.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/reasoning_models.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/structured_outputs.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/openai/tool_calling.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/plugins_presets/plugin_example.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/plugins_presets/preset_agents.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/tools/advanced_multi_tool_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/tools/coding_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/tools/file_operations_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/tools/multi_tool_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/utils/sweep_model.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/agentic_search_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/memory_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/retrieval_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/streaming_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/weather_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/examples/web_retrieval/web_agent.py +0 -0
- {effgen-0.2.2 → effgen-0.2.3}/setup.cfg +0 -0
- {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.
|
|
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.
|
|
274
|
+
## 🆕 What's New in v0.2.3
|
|
274
275
|
|
|
275
276
|
<details open>
|
|
276
|
-
<summary><b>Top 5 features in v0.2.
|
|
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 **
|
|
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
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
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=
|
|
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
|
|
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()
|