SimplerLLM 0.3.3.3__tar.gz → 0.3.3.4__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.
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/PKG-INFO +1 -1
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/__init__.py +2 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/base.py +21 -2
- simplerllm-0.3.3.4/SimplerLLM/image/generation/providers/seedream_image.py +342 -0
- simplerllm-0.3.3.4/SimplerLLM/image/generation/wrappers/seedream_wrapper.py +517 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/flow/flow.py +76 -15
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM.egg-info/PKG-INFO +1 -1
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM.egg-info/SOURCES.txt +2 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/setup.py +1 -1
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/LICENSE +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/README.md +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/providers/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/providers/google_image.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/providers/image_response_models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/providers/openai_image.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/providers/stability_image.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/wrappers/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/wrappers/google_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/wrappers/openai_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/image/generation/wrappers/stability_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/embeddings.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/flow/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/flow/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/flow/tool_registry.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/base.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/exceptions.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/input_guardrails/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/input_guardrails/pii_detection.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/input_guardrails/prompt_injection.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/input_guardrails/topic_filter.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/output_guardrails/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/output_guardrails/content_safety.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/output_guardrails/format_validator.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/output_guardrails/length_validator.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/output_guardrails/pii_detection.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/guardrails/wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/base.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/reliable.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/wrappers/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/wrappers/anthropic_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/wrappers/cohere_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/wrappers/deepseek_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/wrappers/gemini_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/wrappers/ollama_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/wrappers/openai_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/wrappers/openrouter_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm/wrappers/perplexity_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_addons.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_brainstorm/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_brainstorm/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_brainstorm/recursive_brainstorm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_clustering/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_clustering/chunk_store.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_clustering/clusterer.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_clustering/flat_clusterer.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_clustering/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_clustering/persistence.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_clustering/tree_builder.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_feedback/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_feedback/feedback_loop.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_feedback/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_judge/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_judge/judge.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_judge/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_provider_router/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_provider_router/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_provider_router/provider_router.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_provider_router/query_classifier.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/anthropic_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/cohere_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/deepseek_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/gemini_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/llm_response_models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/ollama_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/openai_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/openrouter_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/perplexity_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_providers/voyage_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_retrieval/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_retrieval/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_retrieval/retriever.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_router/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_router/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_router/router.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_validator/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_validator/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/language/llm_validator/validator.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/prompts/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/prompts/hub/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/prompts/hub/agentic_prompts.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/prompts/hub/prompt_manager.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/prompts/messages_template.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/prompts/prompt_builder.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/apify_api.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/brainstorm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/email_functions.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/file_functions.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/file_loader.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/generic_loader.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/image_helpers.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/json_helpers.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/pandas_func.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/pattern_helpers.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/python_func.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/rapid_api.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/serp.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/text_chunker.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/tools/youtube.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/utils/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/utils/custom_verbose.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/vectors/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/vectors/local_vector_db.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/vectors/qdrant_vector_db.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/vectors/simpler_vector.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/vectors/vector_db.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/vectors/vector_providers.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/dialogue_generator/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/dialogue_generator/audio_merger.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/dialogue_generator/dialogue_generator.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/dialogue_generator/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/live_voice_chat/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/live_voice_chat/audio_player.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/live_voice_chat/audio_recorder.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/live_voice_chat/live_voice_chat.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/live_voice_chat/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/audio_utils.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/base.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/providers/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/providers/elevenlabs_convai.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/providers/openai_realtime.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/providers/realtime_response_models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/realtime_voice_chat.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/wrappers/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/wrappers/elevenlabs_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/realtime_voice/wrappers/openai_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/stt/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/stt/base.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/stt/providers/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/stt/providers/openai_stt.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/stt/providers/stt_response_models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/stt/wrappers/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/stt/wrappers/openai_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/tts/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/tts/base.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/tts/providers/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/tts/providers/elevenlabs_tts.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/tts/providers/openai_tts.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/tts/providers/tts_response_models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/tts/wrappers/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/tts/wrappers/elevenlabs_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/tts/wrappers/openai_wrapper.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_dubbing/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_dubbing/audio_sync.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_dubbing/base.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_dubbing/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_dubbing/video_processor.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_transcription/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_transcription/base.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_transcription/caption_generator.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_transcription/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_transcription/utils/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_transcription/utils/subtitle_formatter.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/video_transcription/utils/video_utils.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/voice_chat/__init__.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/voice_chat/conversation.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/voice_chat/models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM/voice/voice_chat/voice_chat.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM.egg-info/dependency_links.txt +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM.egg-info/requires.txt +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/SimplerLLM.egg-info/top_level.txt +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/setup.cfg +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_agent.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_agent_full.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_anthropic_web_search.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_arabic_validator.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_cohere.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_cohere_embeddings.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_comprehensive_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_embeddings_comprehensive.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_flow_comprehensive.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_llm_brainstorm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_llm_clustering_retrieval.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_llm_feedback.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_llm_judge.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_llm_provider_router.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_llm_providers.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_nested_models.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_openrouter.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_openrouter_full_response.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_pattern_extraction.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_pattern_helpers.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_perplexity_pydantic.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_perplexity_web_search.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_production_vector_db.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_pydantic_edge_cases.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_pydantic_edge_cases_llm.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_pydantic_structures.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_pydantic_vision.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_qdrant_comprehensive.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_qdrant_connection.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_qdrant_integration_live.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_real_llm_generation.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_reliable_fix.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_reliable_vision.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_router_simple.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_router_youtube_titles.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_unified_vector_interface.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_vision_anthropic.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_vision_openai.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_vision_quick.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_voyage_embeddings.py +0 -0
- {simplerllm-0.3.3.3 → simplerllm-0.3.3.4}/tests/test_web_search_pydantic.py +0 -0
|
@@ -8,6 +8,7 @@ from .base import ImageGenerator, ImageProvider, ImageSize
|
|
|
8
8
|
from .wrappers.openai_wrapper import OpenAIImageGenerator
|
|
9
9
|
from .wrappers.stability_wrapper import StabilityImageGenerator
|
|
10
10
|
from .wrappers.google_wrapper import GoogleImageGenerator
|
|
11
|
+
from .wrappers.seedream_wrapper import SeedreamImageGenerator
|
|
11
12
|
from .providers.image_response_models import ImageGenerationResponse
|
|
12
13
|
|
|
13
14
|
__all__ = [
|
|
@@ -17,5 +18,6 @@ __all__ = [
|
|
|
17
18
|
'OpenAIImageGenerator',
|
|
18
19
|
'StabilityImageGenerator',
|
|
19
20
|
'GoogleImageGenerator',
|
|
21
|
+
'SeedreamImageGenerator',
|
|
20
22
|
'ImageGenerationResponse',
|
|
21
23
|
]
|
|
@@ -8,9 +8,10 @@ class ImageProvider(Enum):
|
|
|
8
8
|
OPENAI_DALL_E = 1
|
|
9
9
|
STABILITY_AI = 2
|
|
10
10
|
GOOGLE_GEMINI = 3
|
|
11
|
+
SEEDREAM = 4
|
|
11
12
|
# Future providers can be added here:
|
|
12
|
-
# MIDJOURNEY =
|
|
13
|
-
# REPLICATE =
|
|
13
|
+
# MIDJOURNEY = 5
|
|
14
|
+
# REPLICATE = 6
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
class ImageSize(Enum):
|
|
@@ -97,6 +98,14 @@ class ImageGenerator:
|
|
|
97
98
|
api_key=api_key,
|
|
98
99
|
verbose=verbose,
|
|
99
100
|
)
|
|
101
|
+
elif provider == ImageProvider.SEEDREAM:
|
|
102
|
+
from .wrappers.seedream_wrapper import SeedreamImageGenerator
|
|
103
|
+
return SeedreamImageGenerator(
|
|
104
|
+
provider=provider,
|
|
105
|
+
model_name=model_name or "seedream-4-5-251128",
|
|
106
|
+
api_key=api_key,
|
|
107
|
+
verbose=verbose,
|
|
108
|
+
)
|
|
100
109
|
# Future providers can be added here
|
|
101
110
|
# elif provider == ImageProvider.MIDJOURNEY:
|
|
102
111
|
# from .wrappers.midjourney_wrapper import MidjourneyImageGenerator
|
|
@@ -180,6 +189,16 @@ class ImageGenerator:
|
|
|
180
189
|
}
|
|
181
190
|
return size_map.get(size, "1:1")
|
|
182
191
|
|
|
192
|
+
elif provider == ImageProvider.SEEDREAM:
|
|
193
|
+
# Seedream uses resolution presets (2K, 4K) rather than aspect ratios
|
|
194
|
+
size_map = {
|
|
195
|
+
ImageSize.SQUARE: "2K",
|
|
196
|
+
ImageSize.HORIZONTAL: "2K",
|
|
197
|
+
ImageSize.VERTICAL: "2K",
|
|
198
|
+
ImageSize.PORTRAIT_3_4: "2K",
|
|
199
|
+
}
|
|
200
|
+
return size_map.get(size, "2K")
|
|
201
|
+
|
|
183
202
|
# Default fallback
|
|
184
203
|
return "1024x1024"
|
|
185
204
|
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
from dotenv import load_dotenv
|
|
2
|
+
import os
|
|
3
|
+
import time
|
|
4
|
+
import requests
|
|
5
|
+
import base64
|
|
6
|
+
from .image_response_models import ImageGenerationResponse
|
|
7
|
+
|
|
8
|
+
# Load environment variables
|
|
9
|
+
load_dotenv(override=True)
|
|
10
|
+
|
|
11
|
+
MAX_RETRIES = int(os.getenv("MAX_RETRIES", 3))
|
|
12
|
+
RETRY_DELAY = int(os.getenv("RETRY_DELAY", 2))
|
|
13
|
+
|
|
14
|
+
# BytePlus Seedream API endpoint
|
|
15
|
+
SEEDREAM_API_ENDPOINT = "https://ark.ap-southeast.bytepluses.com/api/v3/images/generations"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def generate_image(
|
|
19
|
+
prompt,
|
|
20
|
+
model_name="seedream-4-5-251128",
|
|
21
|
+
size="2K",
|
|
22
|
+
watermark=False,
|
|
23
|
+
response_format="url",
|
|
24
|
+
output_path=None,
|
|
25
|
+
full_response=False,
|
|
26
|
+
api_key=None,
|
|
27
|
+
verbose=False,
|
|
28
|
+
image=None,
|
|
29
|
+
):
|
|
30
|
+
"""
|
|
31
|
+
Generate image from text prompt using BytePlus Seedream API.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
prompt: Text description of the desired image
|
|
35
|
+
model_name: Model to use (default: seedream-4-5-251128)
|
|
36
|
+
size: Image size - "2K", "4K", or custom dimensions (e.g., "2048x2048")
|
|
37
|
+
watermark: If True, adds "AI generated" watermark to bottom-right corner
|
|
38
|
+
response_format: "url" for image URL, "b64_json" for base64 encoded data
|
|
39
|
+
output_path: Optional file path to save image
|
|
40
|
+
full_response: If True, returns ImageGenerationResponse with metadata
|
|
41
|
+
api_key: BytePlus ARK API key (uses ARK_API_KEY env var if not provided)
|
|
42
|
+
verbose: If True, prints progress information
|
|
43
|
+
image: Optional URL of reference image for image-to-image generation
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
If full_response=True: ImageGenerationResponse object
|
|
47
|
+
If output_path provided: file path string
|
|
48
|
+
If response_format="url": image URL string
|
|
49
|
+
Otherwise: image bytes
|
|
50
|
+
"""
|
|
51
|
+
start_time = time.time() if full_response else None
|
|
52
|
+
|
|
53
|
+
# Get API key from parameter or environment
|
|
54
|
+
api_key = api_key or os.getenv("ARK_API_KEY", "")
|
|
55
|
+
if not api_key:
|
|
56
|
+
raise ValueError("ARK_API_KEY not found in environment variables or parameters")
|
|
57
|
+
|
|
58
|
+
if verbose:
|
|
59
|
+
print(f"[Seedream] Generating image with model={model_name}, size={size}")
|
|
60
|
+
if image:
|
|
61
|
+
print(f"[Seedream] Using reference image: {image}")
|
|
62
|
+
|
|
63
|
+
for attempt in range(MAX_RETRIES):
|
|
64
|
+
try:
|
|
65
|
+
# Build request headers
|
|
66
|
+
headers = {
|
|
67
|
+
"Content-Type": "application/json",
|
|
68
|
+
"Authorization": f"Bearer {api_key}",
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
# Build request data
|
|
72
|
+
data = {
|
|
73
|
+
"model": model_name,
|
|
74
|
+
"prompt": prompt,
|
|
75
|
+
"size": size,
|
|
76
|
+
"watermark": watermark,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
# Add reference image for image-to-image generation
|
|
80
|
+
if image:
|
|
81
|
+
data["image"] = image
|
|
82
|
+
|
|
83
|
+
# Make API request
|
|
84
|
+
response = requests.post(
|
|
85
|
+
SEEDREAM_API_ENDPOINT,
|
|
86
|
+
headers=headers,
|
|
87
|
+
json=data,
|
|
88
|
+
timeout=120
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Check for errors
|
|
92
|
+
if response.status_code != 200:
|
|
93
|
+
error_msg = f"Seedream API error (status {response.status_code})"
|
|
94
|
+
try:
|
|
95
|
+
error_data = response.json()
|
|
96
|
+
error_msg += f": {error_data}"
|
|
97
|
+
except:
|
|
98
|
+
error_msg += f": {response.text}"
|
|
99
|
+
raise Exception(error_msg)
|
|
100
|
+
|
|
101
|
+
# Parse response
|
|
102
|
+
response_data = response.json()
|
|
103
|
+
|
|
104
|
+
if verbose:
|
|
105
|
+
print(f"[Seedream] Response received: {response_data.get('model', 'unknown model')}")
|
|
106
|
+
|
|
107
|
+
# Extract image data from response
|
|
108
|
+
if "data" not in response_data or len(response_data["data"]) == 0:
|
|
109
|
+
raise Exception("No image data found in Seedream response")
|
|
110
|
+
|
|
111
|
+
image_info = response_data["data"][0]
|
|
112
|
+
image_url = image_info.get("url")
|
|
113
|
+
image_size_str = image_info.get("size", size)
|
|
114
|
+
|
|
115
|
+
if not image_url:
|
|
116
|
+
raise Exception("No image URL found in Seedream response")
|
|
117
|
+
|
|
118
|
+
# Handle output based on format and output_path
|
|
119
|
+
if output_path or response_format == "b64_json":
|
|
120
|
+
# Download the image
|
|
121
|
+
img_response = requests.get(image_url, timeout=60)
|
|
122
|
+
img_response.raise_for_status()
|
|
123
|
+
image_bytes = img_response.content
|
|
124
|
+
|
|
125
|
+
if output_path:
|
|
126
|
+
# Save to file
|
|
127
|
+
os.makedirs(os.path.dirname(output_path), exist_ok=True) if os.path.dirname(output_path) else None
|
|
128
|
+
with open(output_path, 'wb') as f:
|
|
129
|
+
f.write(image_bytes)
|
|
130
|
+
image_data = output_path
|
|
131
|
+
file_size = len(image_bytes)
|
|
132
|
+
if verbose:
|
|
133
|
+
print(f"[Seedream] Image saved to: {output_path} ({file_size} bytes)")
|
|
134
|
+
else:
|
|
135
|
+
image_data = image_bytes
|
|
136
|
+
file_size = len(image_bytes)
|
|
137
|
+
if verbose:
|
|
138
|
+
print(f"[Seedream] Image downloaded ({file_size} bytes)")
|
|
139
|
+
else:
|
|
140
|
+
# Return URL
|
|
141
|
+
image_data = image_url
|
|
142
|
+
file_size = None
|
|
143
|
+
if verbose:
|
|
144
|
+
print(f"[Seedream] Image URL received: {image_url[:50]}...")
|
|
145
|
+
|
|
146
|
+
# Return full response with metadata if requested
|
|
147
|
+
if full_response:
|
|
148
|
+
end_time = time.time()
|
|
149
|
+
process_time = end_time - start_time
|
|
150
|
+
|
|
151
|
+
# Extract usage info
|
|
152
|
+
usage = response_data.get("usage", {})
|
|
153
|
+
|
|
154
|
+
return ImageGenerationResponse(
|
|
155
|
+
image_data=image_data,
|
|
156
|
+
model=model_name,
|
|
157
|
+
prompt=prompt,
|
|
158
|
+
revised_prompt=None,
|
|
159
|
+
size=image_size_str,
|
|
160
|
+
quality=None,
|
|
161
|
+
style=None,
|
|
162
|
+
process_time=process_time,
|
|
163
|
+
provider="SEEDREAM",
|
|
164
|
+
file_size=file_size,
|
|
165
|
+
output_path=output_path,
|
|
166
|
+
llm_provider_response=response_data,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
return image_data
|
|
170
|
+
|
|
171
|
+
except Exception as e:
|
|
172
|
+
if attempt < MAX_RETRIES - 1:
|
|
173
|
+
if verbose:
|
|
174
|
+
print(f"[Seedream] Attempt {attempt + 1} failed: {e}. Retrying...")
|
|
175
|
+
time.sleep(RETRY_DELAY * (2**attempt))
|
|
176
|
+
else:
|
|
177
|
+
error_msg = f"Failed to generate image after {MAX_RETRIES} attempts due to: {e}"
|
|
178
|
+
raise Exception(error_msg)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
async def generate_image_async(
|
|
182
|
+
prompt,
|
|
183
|
+
model_name="seedream-4-5-251128",
|
|
184
|
+
size="2K",
|
|
185
|
+
watermark=False,
|
|
186
|
+
response_format="url",
|
|
187
|
+
output_path=None,
|
|
188
|
+
full_response=False,
|
|
189
|
+
api_key=None,
|
|
190
|
+
verbose=False,
|
|
191
|
+
image=None,
|
|
192
|
+
):
|
|
193
|
+
"""
|
|
194
|
+
Async version: Generate image from text prompt using BytePlus Seedream API.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
prompt: Text description of the desired image
|
|
198
|
+
model_name: Model to use (default: seedream-4-5-251128)
|
|
199
|
+
size: Image size - "2K", "4K", or custom dimensions (e.g., "2048x2048")
|
|
200
|
+
watermark: If True, adds "AI generated" watermark to bottom-right corner
|
|
201
|
+
response_format: "url" for image URL, "b64_json" for base64 encoded data
|
|
202
|
+
output_path: Optional file path to save image
|
|
203
|
+
full_response: If True, returns ImageGenerationResponse with metadata
|
|
204
|
+
api_key: BytePlus ARK API key (uses ARK_API_KEY env var if not provided)
|
|
205
|
+
verbose: If True, prints progress information
|
|
206
|
+
image: Optional URL of reference image for image-to-image generation
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
If full_response=True: ImageGenerationResponse object
|
|
210
|
+
If output_path provided: file path string
|
|
211
|
+
If response_format="url": image URL string
|
|
212
|
+
Otherwise: image bytes
|
|
213
|
+
"""
|
|
214
|
+
import asyncio
|
|
215
|
+
|
|
216
|
+
loop = asyncio.get_event_loop()
|
|
217
|
+
return await loop.run_in_executor(
|
|
218
|
+
None,
|
|
219
|
+
lambda: generate_image(
|
|
220
|
+
prompt=prompt,
|
|
221
|
+
model_name=model_name,
|
|
222
|
+
size=size,
|
|
223
|
+
watermark=watermark,
|
|
224
|
+
response_format=response_format,
|
|
225
|
+
output_path=output_path,
|
|
226
|
+
full_response=full_response,
|
|
227
|
+
api_key=api_key,
|
|
228
|
+
verbose=verbose,
|
|
229
|
+
image=image,
|
|
230
|
+
)
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def edit_image(
|
|
235
|
+
image_source,
|
|
236
|
+
edit_prompt,
|
|
237
|
+
model_name="seedream-4-5-251128",
|
|
238
|
+
size="2K",
|
|
239
|
+
watermark=False,
|
|
240
|
+
response_format="url",
|
|
241
|
+
output_path=None,
|
|
242
|
+
full_response=False,
|
|
243
|
+
api_key=None,
|
|
244
|
+
verbose=False,
|
|
245
|
+
):
|
|
246
|
+
"""
|
|
247
|
+
Edit an existing image using text instructions with BytePlus Seedream API.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
image_source: URL of the source image to edit
|
|
251
|
+
edit_prompt: Text instructions for how to edit the image
|
|
252
|
+
model_name: Model to use (default: seedream-4-5-251128)
|
|
253
|
+
size: Image size - "2K", "4K", or custom dimensions (e.g., "2048x2048")
|
|
254
|
+
watermark: If True, adds "AI generated" watermark to bottom-right corner
|
|
255
|
+
response_format: "url" for image URL, "b64_json" for base64 encoded data
|
|
256
|
+
output_path: Optional file path to save edited image
|
|
257
|
+
full_response: If True, returns ImageGenerationResponse with metadata
|
|
258
|
+
api_key: BytePlus ARK API key (uses ARK_API_KEY env var if not provided)
|
|
259
|
+
verbose: If True, prints progress information
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
If full_response=True: ImageGenerationResponse object
|
|
263
|
+
If output_path provided: file path string
|
|
264
|
+
If response_format="url": image URL string
|
|
265
|
+
Otherwise: edited image bytes
|
|
266
|
+
|
|
267
|
+
Example:
|
|
268
|
+
>>> edited_url = edit_image(
|
|
269
|
+
... image_source="https://example.com/original.jpg",
|
|
270
|
+
... edit_prompt="Change the background to a sunset sky",
|
|
271
|
+
... size="2K"
|
|
272
|
+
... )
|
|
273
|
+
"""
|
|
274
|
+
if verbose:
|
|
275
|
+
print(f"[Seedream] Editing image with prompt: {edit_prompt[:50]}...")
|
|
276
|
+
|
|
277
|
+
# Use generate_image with the image parameter for image-to-image editing
|
|
278
|
+
return generate_image(
|
|
279
|
+
prompt=edit_prompt,
|
|
280
|
+
model_name=model_name,
|
|
281
|
+
size=size,
|
|
282
|
+
watermark=watermark,
|
|
283
|
+
response_format=response_format,
|
|
284
|
+
output_path=output_path,
|
|
285
|
+
full_response=full_response,
|
|
286
|
+
api_key=api_key,
|
|
287
|
+
verbose=verbose,
|
|
288
|
+
image=image_source,
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
async def edit_image_async(
|
|
293
|
+
image_source,
|
|
294
|
+
edit_prompt,
|
|
295
|
+
model_name="seedream-4-5-251128",
|
|
296
|
+
size="2K",
|
|
297
|
+
watermark=False,
|
|
298
|
+
response_format="url",
|
|
299
|
+
output_path=None,
|
|
300
|
+
full_response=False,
|
|
301
|
+
api_key=None,
|
|
302
|
+
verbose=False,
|
|
303
|
+
):
|
|
304
|
+
"""
|
|
305
|
+
Async version: Edit an existing image using text instructions with BytePlus Seedream API.
|
|
306
|
+
|
|
307
|
+
Args:
|
|
308
|
+
image_source: URL of the source image to edit
|
|
309
|
+
edit_prompt: Text instructions for how to edit the image
|
|
310
|
+
model_name: Model to use (default: seedream-4-5-251128)
|
|
311
|
+
size: Image size - "2K", "4K", or custom dimensions (e.g., "2048x2048")
|
|
312
|
+
watermark: If True, adds "AI generated" watermark to bottom-right corner
|
|
313
|
+
response_format: "url" for image URL, "b64_json" for base64 encoded data
|
|
314
|
+
output_path: Optional file path to save edited image
|
|
315
|
+
full_response: If True, returns ImageGenerationResponse with metadata
|
|
316
|
+
api_key: BytePlus ARK API key (uses ARK_API_KEY env var if not provided)
|
|
317
|
+
verbose: If True, prints progress information
|
|
318
|
+
|
|
319
|
+
Returns:
|
|
320
|
+
If full_response=True: ImageGenerationResponse object
|
|
321
|
+
If output_path provided: file path string
|
|
322
|
+
If response_format="url": image URL string
|
|
323
|
+
Otherwise: edited image bytes
|
|
324
|
+
"""
|
|
325
|
+
import asyncio
|
|
326
|
+
|
|
327
|
+
loop = asyncio.get_event_loop()
|
|
328
|
+
return await loop.run_in_executor(
|
|
329
|
+
None,
|
|
330
|
+
lambda: edit_image(
|
|
331
|
+
image_source=image_source,
|
|
332
|
+
edit_prompt=edit_prompt,
|
|
333
|
+
model_name=model_name,
|
|
334
|
+
size=size,
|
|
335
|
+
watermark=watermark,
|
|
336
|
+
response_format=response_format,
|
|
337
|
+
output_path=output_path,
|
|
338
|
+
full_response=full_response,
|
|
339
|
+
api_key=api_key,
|
|
340
|
+
verbose=verbose,
|
|
341
|
+
)
|
|
342
|
+
)
|