diff --git a/.aider.chat.history.md b/.aider.chat.history.md new file mode 100644 index 0000000..c91011d --- /dev/null +++ b/.aider.chat.history.md @@ -0,0 +1,1192 @@ + +# aider chat started at 2025-06-14 18:21:03 + +> You can skip this check with --no-gitignore +> Add .aider* to .gitignore (recommended)? (Y)es/(N)o [Yes]: y +> Added .aider* to .gitignore +> /opt/homebrew/bin/aider +> Using openrouter/anthropic/claude-sonnet-4 model with API key from environment. +> Aider v0.84.0 +> Main model: openrouter/anthropic/claude-sonnet-4 with diff edit format +> Weak model: openrouter/anthropic/claude-3-5-haiku +> Git repo: .git with 48 files +> Repo-map: using 4096 tokens, auto refresh +> https://aider.chat/HISTORY.html#release-notes +> Would you like to see what's new in this version? (Y)es/(N)o [Yes]: y + +#### /model +> Warning for : Unknown context window size and costs, using sane defaults. +> Did you mean one of these? +> - ai21.j2-mid-v1 +> - ai21.j2-ultra-v1 +> - ai21.jamba-1-5-large-v1:0 +> - ai21.jamba-1-5-mini-v1:0 +> - ai21.jamba-instruct-v1:0 +> - ai21/jamba-1.5 +> - ai21/jamba-1.5-large +> - ai21/jamba-1.5-large@001 +> - ai21/jamba-1.5-mini +> - ai21/jamba-1.5-mini@001 +> - ai21/jamba-large-1.6 +> - ai21/jamba-mini-1.6 +> - aleph_alpha/luminous-base-control +> - aleph_alpha/luminous-extended-control +> - aleph_alpha/luminous-supreme-control +> - amazon.nova-lite-v1:0 +> - amazon.nova-micro-v1:0 +> - amazon.nova-pro-v1:0 +> - amazon.titan-text-express-v1 +> - amazon.titan-text-lite-v1 +> - amazon.titan-text-premier-v1:0 +> - anthropic.claude-3-5-haiku-20241022-v1:0 +> - anthropic.claude-3-5-sonnet-20240620-v1:0 +> - anthropic.claude-3-5-sonnet-20241022-v2:0 +> - anthropic.claude-3-7-sonnet-20250219-v1:0 +> - anthropic.claude-3-haiku-20240307-v1:0 +> - anthropic.claude-3-opus-20240229-v1:0 +> - anthropic.claude-3-sonnet-20240229-v1:0 +> - anthropic.claude-instant-v1 +> - anthropic.claude-opus-4-20250514-v1:0 +> - anthropic.claude-sonnet-4-20250514-v1:0 +> - anthropic.claude-v1 +> - anthropic.claude-v2 +> - anthropic.claude-v2:1 +> - anthropic/claude-2 +> - anthropic/claude-2.1 +> - anthropic/claude-3-5-haiku-20241022 +> - anthropic/claude-3-5-haiku-latest +> - anthropic/claude-3-5-sonnet-20240620 +> - anthropic/claude-3-5-sonnet-20241022 +> - anthropic/claude-3-5-sonnet-latest +> - anthropic/claude-3-7-sonnet-20250219 +> - anthropic/claude-3-7-sonnet-latest +> - anthropic/claude-3-haiku-20240307 +> - anthropic/claude-3-opus-20240229 +> - anthropic/claude-3-opus-latest +> - anthropic/claude-3-sonnet-20240229 +> - anthropic/claude-4-opus-20250514 +> - anthropic/claude-4-sonnet-20250514 +> - anthropic/claude-instant-1 +> - anthropic/claude-instant-1.2 +> - anthropic/claude-opus-4-20250514 +> - anthropic/claude-sonnet-4-20250514 +> - anyscale/HuggingFaceH4/zephyr-7b-beta +> - anyscale/codellama/CodeLlama-34b-Instruct-hf +> - anyscale/codellama/CodeLlama-70b-Instruct-hf +> - anyscale/google/gemma-7b-it +> - anyscale/meta-llama/Llama-2-13b-chat-hf +> - anyscale/meta-llama/Llama-2-70b-chat-hf +> - anyscale/meta-llama/Llama-2-7b-chat-hf +> - anyscale/meta-llama/Meta-Llama-3-70B-Instruct +> - anyscale/meta-llama/Meta-Llama-3-8B-Instruct +> - anyscale/mistralai/Mistral-7B-Instruct-v0.1 +> - anyscale/mistralai/Mixtral-8x22B-Instruct-v0.1 +> - anyscale/mistralai/Mixtral-8x7B-Instruct-v0.1 +> - azure/command-r-plus +> - azure/computer-use-preview +> - azure/eu/gpt-4o-2024-08-06 +> - azure/eu/gpt-4o-2024-11-20 +> - azure/eu/gpt-4o-mini-2024-07-18 +> - azure/eu/gpt-4o-mini-realtime-preview-2024-12-17 +> - azure/eu/gpt-4o-realtime-preview-2024-10-01 +> - azure/eu/gpt-4o-realtime-preview-2024-12-17 +> - azure/eu/o1-2024-12-17 +> - azure/eu/o1-mini-2024-09-12 +> - azure/eu/o1-preview-2024-09-12 +> - azure/eu/o3-mini-2025-01-31 +> - azure/global-standard/gpt-4o-2024-08-06 +> - azure/global-standard/gpt-4o-2024-11-20 +> - azure/global-standard/gpt-4o-mini +> - azure/global/gpt-4o-2024-08-06 +> - azure/global/gpt-4o-2024-11-20 +> - azure/gpt-3.5-turbo +> - azure/gpt-3.5-turbo-0125 +> - azure/gpt-35-turbo +> - azure/gpt-35-turbo-0125 +> - azure/gpt-35-turbo-0301 +> - azure/gpt-35-turbo-0613 +> - azure/gpt-35-turbo-1106 +> - azure/gpt-35-turbo-16k +> - azure/gpt-35-turbo-16k-0613 +> - azure/gpt-4 +> - azure/gpt-4-0125-preview +> - azure/gpt-4-0613 +> - azure/gpt-4-1106-preview +> - azure/gpt-4-32k +> - azure/gpt-4-32k-0613 +> - azure/gpt-4-turbo +> - azure/gpt-4-turbo-2024-04-09 +> - azure/gpt-4-turbo-vision-preview +> - azure/gpt-4.1 +> - azure/gpt-4.1-2025-04-14 +> - azure/gpt-4.1-mini +> - azure/gpt-4.1-mini-2025-04-14 +> - azure/gpt-4.1-nano +> - azure/gpt-4.1-nano-2025-04-14 +> - azure/gpt-4.5-preview +> - azure/gpt-4o +> - azure/gpt-4o-2024-05-13 +> - azure/gpt-4o-2024-08-06 +> - azure/gpt-4o-2024-11-20 +> - azure/gpt-4o-audio-preview-2024-12-17 +> - azure/gpt-4o-mini +> - azure/gpt-4o-mini-2024-07-18 +> - azure/gpt-4o-mini-audio-preview-2024-12-17 +> - azure/gpt-4o-mini-realtime-preview-2024-12-17 +> - azure/gpt-4o-realtime-preview-2024-10-01 +> - azure/gpt-4o-realtime-preview-2024-12-17 +> - azure/mistral-large-2402 +> - azure/mistral-large-latest +> - azure/o1 +> - azure/o1-2024-12-17 +> - azure/o1-mini +> - azure/o1-mini-2024-09-12 +> - azure/o1-preview +> - azure/o1-preview-2024-09-12 +> - azure/o3 +> - azure/o3-2025-04-16 +> - azure/o3-mini +> - azure/o3-mini-2025-01-31 +> - azure/o4-mini +> - azure/o4-mini-2025-04-16 +> - azure/us/gpt-4o-2024-08-06 +> - azure/us/gpt-4o-2024-11-20 +> - azure/us/gpt-4o-mini-2024-07-18 +> - azure/us/gpt-4o-mini-realtime-preview-2024-12-17 +> - azure/us/gpt-4o-realtime-preview-2024-10-01 +> - azure/us/gpt-4o-realtime-preview-2024-12-17 +> - azure/us/o1-2024-12-17 +> - azure/us/o1-mini-2024-09-12 +> - azure/us/o1-preview-2024-09-12 +> - azure/us/o3-mini-2025-01-31 +> - azure_ai/Llama-3.2-11B-Vision-Instruct +> - azure_ai/Llama-3.2-90B-Vision-Instruct +> - azure_ai/Llama-3.3-70B-Instruct +> - azure_ai/Llama-4-Maverick-17B-128E-Instruct-FP8 +> - azure_ai/Llama-4-Scout-17B-16E-Instruct +> - azure_ai/Meta-Llama-3-70B-Instruct +> - azure_ai/Meta-Llama-3.1-405B-Instruct +> - azure_ai/Meta-Llama-3.1-70B-Instruct +> - azure_ai/Meta-Llama-3.1-8B-Instruct +> - azure_ai/Phi-3-medium-128k-instruct +> - azure_ai/Phi-3-medium-4k-instruct +> - azure_ai/Phi-3-mini-128k-instruct +> - azure_ai/Phi-3-mini-4k-instruct +> - azure_ai/Phi-3-small-128k-instruct +> - azure_ai/Phi-3-small-8k-instruct +> - azure_ai/Phi-3.5-MoE-instruct +> - azure_ai/Phi-3.5-mini-instruct +> - azure_ai/Phi-3.5-vision-instruct +> - azure_ai/Phi-4 +> - azure_ai/Phi-4-mini-instruct +> - azure_ai/Phi-4-multimodal-instruct +> - azure_ai/deepseek-r1 +> - azure_ai/deepseek-v3 +> - azure_ai/deepseek-v3-0324 +> - azure_ai/jamba-instruct +> - azure_ai/ministral-3b +> - azure_ai/mistral-large +> - azure_ai/mistral-large-2407 +> - azure_ai/mistral-large-latest +> - azure_ai/mistral-medium-2505 +> - azure_ai/mistral-nemo +> - azure_ai/mistral-small +> - azure_ai/mistral-small-2503 +> - bedrock/*/1-month-commitment/cohere.command-light-text-v14 +> - bedrock/*/1-month-commitment/cohere.command-text-v14 +> - bedrock/*/6-month-commitment/cohere.command-light-text-v14 +> - bedrock/*/6-month-commitment/cohere.command-text-v14 +> - bedrock/ai21.j2-mid-v1 +> - bedrock/ai21.j2-ultra-v1 +> - bedrock/ai21.jamba-1-5-large-v1:0 +> - bedrock/ai21.jamba-1-5-mini-v1:0 +> - bedrock/ai21.jamba-instruct-v1:0 +> - bedrock/amazon.titan-text-express-v1 +> - bedrock/amazon.titan-text-lite-v1 +> - bedrock/amazon.titan-text-premier-v1:0 +> - bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 +> - bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 +> - bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 +> - bedrock/anthropic.claude-3-haiku-20240307-v1:0 +> - bedrock/anthropic.claude-3-opus-20240229-v1:0 +> - bedrock/anthropic.claude-3-sonnet-20240229-v1:0 +> - bedrock/anthropic.claude-instant-v1 +> - bedrock/anthropic.claude-v1 +> - bedrock/anthropic.claude-v2 +> - bedrock/anthropic.claude-v2:1 +> - bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-instant-v1 +> - bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v1 +> - bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v2 +> - bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v2:1 +> - bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-instant-v1 +> - bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v1 +> - bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v2 +> - bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v2:1 +> - bedrock/ap-northeast-1/anthropic.claude-instant-v1 +> - bedrock/ap-northeast-1/anthropic.claude-v1 +> - bedrock/ap-northeast-1/anthropic.claude-v2 +> - bedrock/ap-northeast-1/anthropic.claude-v2:1 +> - bedrock/ap-south-1/meta.llama3-70b-instruct-v1:0 +> - bedrock/ap-south-1/meta.llama3-8b-instruct-v1:0 +> - bedrock/ca-central-1/meta.llama3-70b-instruct-v1:0 +> - bedrock/ca-central-1/meta.llama3-8b-instruct-v1:0 +> - bedrock/cohere.command-light-text-v14 +> - bedrock/cohere.command-r-plus-v1:0 +> - bedrock/cohere.command-r-v1:0 +> - bedrock/cohere.command-text-v14 +> - bedrock/eu-central-1/1-month-commitment/anthropic.claude-instant-v1 +> - bedrock/eu-central-1/1-month-commitment/anthropic.claude-v1 +> - bedrock/eu-central-1/1-month-commitment/anthropic.claude-v2 +> - bedrock/eu-central-1/1-month-commitment/anthropic.claude-v2:1 +> - bedrock/eu-central-1/6-month-commitment/anthropic.claude-instant-v1 +> - bedrock/eu-central-1/6-month-commitment/anthropic.claude-v1 +> - bedrock/eu-central-1/6-month-commitment/anthropic.claude-v2 +> - bedrock/eu-central-1/6-month-commitment/anthropic.claude-v2:1 +> - bedrock/eu-central-1/anthropic.claude-instant-v1 +> - bedrock/eu-central-1/anthropic.claude-v1 +> - bedrock/eu-central-1/anthropic.claude-v2 +> - bedrock/eu-central-1/anthropic.claude-v2:1 +> - bedrock/eu-west-1/meta.llama3-70b-instruct-v1:0 +> - bedrock/eu-west-1/meta.llama3-8b-instruct-v1:0 +> - bedrock/eu-west-2/meta.llama3-70b-instruct-v1:0 +> - bedrock/eu-west-2/meta.llama3-8b-instruct-v1:0 +> - bedrock/eu-west-3/mistral.mistral-7b-instruct-v0:2 +> - bedrock/eu-west-3/mistral.mistral-large-2402-v1:0 +> - bedrock/eu-west-3/mistral.mixtral-8x7b-instruct-v0:1 +> - bedrock/eu.anthropic.claude-3-5-haiku-20241022-v1:0 +> - bedrock/eu.anthropic.claude-3-5-sonnet-20240620-v1:0 +> - bedrock/eu.anthropic.claude-3-5-sonnet-20241022-v2:0 +> - bedrock/eu.anthropic.claude-3-7-sonnet-20250219-v1:0 +> - bedrock/eu.anthropic.claude-3-haiku-20240307-v1:0 +> - bedrock/eu.anthropic.claude-3-opus-20240229-v1:0 +> - bedrock/eu.anthropic.claude-3-sonnet-20240229-v1:0 +> - bedrock/eu.meta.llama3-2-1b-instruct-v1:0 +> - bedrock/eu.meta.llama3-2-3b-instruct-v1:0 +> - bedrock/invoke/anthropic.claude-3-5-sonnet-20240620-v1:0 +> - bedrock/meta.llama2-13b-chat-v1 +> - bedrock/meta.llama2-70b-chat-v1 +> - bedrock/meta.llama3-1-405b-instruct-v1:0 +> - bedrock/meta.llama3-1-70b-instruct-v1:0 +> - bedrock/meta.llama3-1-8b-instruct-v1:0 +> - bedrock/meta.llama3-2-11b-instruct-v1:0 +> - bedrock/meta.llama3-2-1b-instruct-v1:0 +> - bedrock/meta.llama3-2-3b-instruct-v1:0 +> - bedrock/meta.llama3-2-90b-instruct-v1:0 +> - bedrock/meta.llama3-70b-instruct-v1:0 +> - bedrock/meta.llama3-8b-instruct-v1:0 +> - bedrock/mistral.mistral-7b-instruct-v0:2 +> - bedrock/mistral.mistral-large-2402-v1:0 +> - bedrock/mistral.mistral-large-2407-v1:0 +> - bedrock/mistral.mistral-small-2402-v1:0 +> - bedrock/mistral.mixtral-8x7b-instruct-v0:1 +> - bedrock/sa-east-1/meta.llama3-70b-instruct-v1:0 +> - bedrock/sa-east-1/meta.llama3-8b-instruct-v1:0 +> - bedrock/us-east-1/1-month-commitment/anthropic.claude-instant-v1 +> - bedrock/us-east-1/1-month-commitment/anthropic.claude-v1 +> - bedrock/us-east-1/1-month-commitment/anthropic.claude-v2 +> - bedrock/us-east-1/1-month-commitment/anthropic.claude-v2:1 +> - bedrock/us-east-1/6-month-commitment/anthropic.claude-instant-v1 +> - bedrock/us-east-1/6-month-commitment/anthropic.claude-v1 +> - bedrock/us-east-1/6-month-commitment/anthropic.claude-v2 +> - bedrock/us-east-1/6-month-commitment/anthropic.claude-v2:1 +> - bedrock/us-east-1/anthropic.claude-instant-v1 +> - bedrock/us-east-1/anthropic.claude-v1 +> - bedrock/us-east-1/anthropic.claude-v2 +> - bedrock/us-east-1/anthropic.claude-v2:1 +> - bedrock/us-east-1/meta.llama3-70b-instruct-v1:0 +> - bedrock/us-east-1/meta.llama3-8b-instruct-v1:0 +> - bedrock/us-east-1/mistral.mistral-7b-instruct-v0:2 +> - bedrock/us-east-1/mistral.mistral-large-2402-v1:0 +> - bedrock/us-east-1/mistral.mixtral-8x7b-instruct-v0:1 +> - bedrock/us-west-1/meta.llama3-70b-instruct-v1:0 +> - bedrock/us-west-1/meta.llama3-8b-instruct-v1:0 +> - bedrock/us-west-2/1-month-commitment/anthropic.claude-instant-v1 +> - bedrock/us-west-2/1-month-commitment/anthropic.claude-v1 +> - bedrock/us-west-2/1-month-commitment/anthropic.claude-v2 +> - bedrock/us-west-2/1-month-commitment/anthropic.claude-v2:1 +> - bedrock/us-west-2/6-month-commitment/anthropic.claude-instant-v1 +> - bedrock/us-west-2/6-month-commitment/anthropic.claude-v1 +> - bedrock/us-west-2/6-month-commitment/anthropic.claude-v2 +> - bedrock/us-west-2/6-month-commitment/anthropic.claude-v2:1 +> - bedrock/us-west-2/anthropic.claude-instant-v1 +> - bedrock/us-west-2/anthropic.claude-v1 +> - bedrock/us-west-2/anthropic.claude-v2 +> - bedrock/us-west-2/anthropic.claude-v2:1 +> - bedrock/us-west-2/mistral.mistral-7b-instruct-v0:2 +> - bedrock/us-west-2/mistral.mistral-large-2402-v1:0 +> - bedrock/us-west-2/mistral.mixtral-8x7b-instruct-v0:1 +> - bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0 +> - bedrock/us.anthropic.claude-3-5-sonnet-20240620-v1:0 +> - bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0 +> - bedrock/us.anthropic.claude-3-haiku-20240307-v1:0 +> - bedrock/us.anthropic.claude-3-opus-20240229-v1:0 +> - bedrock/us.anthropic.claude-3-sonnet-20240229-v1:0 +> - bedrock/us.meta.llama3-1-405b-instruct-v1:0 +> - bedrock/us.meta.llama3-1-70b-instruct-v1:0 +> - bedrock/us.meta.llama3-1-8b-instruct-v1:0 +> - bedrock/us.meta.llama3-2-11b-instruct-v1:0 +> - bedrock/us.meta.llama3-2-1b-instruct-v1:0 +> - bedrock/us.meta.llama3-2-3b-instruct-v1:0 +> - bedrock/us.meta.llama3-2-90b-instruct-v1:0 +> - bedrock_converse/amazon.nova-lite-v1:0 +> - bedrock_converse/amazon.nova-micro-v1:0 +> - bedrock_converse/amazon.nova-pro-v1:0 +> - bedrock_converse/anthropic.claude-3-7-sonnet-20250219-v1:0 +> - bedrock_converse/anthropic.claude-opus-4-20250514-v1:0 +> - bedrock_converse/anthropic.claude-sonnet-4-20250514-v1:0 +> - bedrock_converse/eu.amazon.nova-lite-v1:0 +> - bedrock_converse/eu.amazon.nova-micro-v1:0 +> - bedrock_converse/eu.amazon.nova-pro-v1:0 +> - bedrock_converse/eu.anthropic.claude-opus-4-20250514-v1:0 +> - bedrock_converse/eu.anthropic.claude-sonnet-4-20250514-v1:0 +> - bedrock_converse/meta.llama3-3-70b-instruct-v1:0 +> - bedrock_converse/meta.llama4-maverick-17b-instruct-v1:0 +> - bedrock_converse/meta.llama4-scout-17b-instruct-v1:0 +> - bedrock_converse/us.amazon.nova-lite-v1:0 +> - bedrock_converse/us.amazon.nova-micro-v1:0 +> - bedrock_converse/us.amazon.nova-premier-v1:0 +> - bedrock_converse/us.amazon.nova-pro-v1:0 +> - bedrock_converse/us.anthropic.claude-3-7-sonnet-20250219-v1:0 +> - bedrock_converse/us.anthropic.claude-opus-4-20250514-v1:0 +> - bedrock_converse/us.anthropic.claude-sonnet-4-20250514-v1:0 +> - bedrock_converse/us.deepseek.r1-v1:0 +> - bedrock_converse/us.meta.llama3-3-70b-instruct-v1:0 +> - bedrock_converse/us.meta.llama4-maverick-17b-instruct-v1:0 +> - bedrock_converse/us.meta.llama4-scout-17b-instruct-v1:0 +> - cerebras/llama-3.3-70b +> - cerebras/llama3.1-70b +> - cerebras/llama3.1-8b +> - cerebras/qwen-3-32b +> - chat-bison +> - chat-bison-32k +> - chat-bison-32k@002 +> - chat-bison@001 +> - chat-bison@002 +> - chatdolphin +> - chatgpt-4o-latest +> - claude-2 +> - claude-2.1 +> - claude-3-5-haiku-20241022 +> - claude-3-5-haiku-latest +> - claude-3-5-sonnet-20240620 +> - claude-3-5-sonnet-20241022 +> - claude-3-5-sonnet-latest +> - claude-3-7-sonnet-20250219 +> - claude-3-7-sonnet-latest +> - claude-3-haiku-20240307 +> - claude-3-opus-20240229 +> - claude-3-opus-latest +> - claude-3-sonnet-20240229 +> - claude-4-opus-20250514 +> - claude-4-sonnet-20250514 +> - claude-instant-1 +> - claude-instant-1.2 +> - claude-opus-4-20250514 +> - claude-sonnet-4-20250514 +> - cloudflare/@cf/meta/llama-2-7b-chat-fp16 +> - cloudflare/@cf/meta/llama-2-7b-chat-int8 +> - cloudflare/@cf/mistral/mistral-7b-instruct-v0.1 +> - cloudflare/@hf/thebloke/codellama-7b-instruct-awq +> - code-bison +> - codechat-bison +> - codechat-bison-32k +> - codechat-bison-32k@002 +> - codechat-bison@001 +> - codechat-bison@002 +> - codechat-bison@latest +> - codestral/codestral-2405 +> - codestral/codestral-latest +> - cohere.command-light-text-v14 +> - cohere.command-r-plus-v1:0 +> - cohere.command-r-v1:0 +> - cohere.command-text-v14 +> - cohere_chat/command-a-03-2025 +> - cohere_chat/command-light +> - cohere_chat/command-r +> - cohere_chat/command-r-08-2024 +> - cohere_chat/command-r-plus +> - cohere_chat/command-r-plus-08-2024 +> - cohere_chat/command-r7b-12-2024 +> - command-a-03-2025 +> - command-light +> - command-r +> - command-r-08-2024 +> - command-r-plus +> - command-r-plus-08-2024 +> - command-r7b-12-2024 +> - computer-use-preview +> - databricks/databricks-claude-3-7-sonnet +> - databricks/databricks-dbrx-instruct +> - databricks/databricks-llama-2-70b-chat +> - databricks/databricks-llama-4-maverick +> - databricks/databricks-meta-llama-3-1-405b-instruct +> - databricks/databricks-meta-llama-3-1-70b-instruct +> - databricks/databricks-meta-llama-3-3-70b-instruct +> - databricks/databricks-meta-llama-3-70b-instruct +> - databricks/databricks-mixtral-8x7b-instruct +> - databricks/databricks-mpt-30b-instruct +> - databricks/databricks-mpt-7b-instruct +> - deepinfra/01-ai/Yi-34B-Chat +> - deepinfra/Gryphe/MythoMax-L2-13b +> - deepinfra/Phind/Phind-CodeLlama-34B-v2 +> - deepinfra/amazon/MistralLite +> - deepinfra/codellama/CodeLlama-34b-Instruct-hf +> - deepinfra/cognitivecomputations/dolphin-2.6-mixtral-8x7b +> - deepinfra/deepinfra/airoboros-70b +> - deepinfra/jondurbin/airoboros-l2-70b-gpt4-1.4.1 +> - deepinfra/lizpreciatior/lzlv_70b_fp16_hf +> - deepinfra/meta-llama/Llama-2-13b-chat-hf +> - deepinfra/meta-llama/Llama-2-70b-chat-hf +> - deepinfra/meta-llama/Llama-2-7b-chat-hf +> - deepinfra/meta-llama/Meta-Llama-3-70B-Instruct +> - deepinfra/meta-llama/Meta-Llama-3-8B-Instruct +> - deepinfra/meta-llama/Meta-Llama-3.1-405B-Instruct +> - deepinfra/mistralai/Mistral-7B-Instruct-v0.1 +> - deepinfra/mistralai/Mixtral-8x7B-Instruct-v0.1 +> - deepinfra/openchat/openchat_3.5 +> - deepseek-reasoner +> - deepseek/deepseek-chat +> - deepseek/deepseek-coder +> - deepseek/deepseek-reasoner +> - eu.amazon.nova-lite-v1:0 +> - eu.amazon.nova-micro-v1:0 +> - eu.amazon.nova-pro-v1:0 +> - eu.anthropic.claude-3-5-haiku-20241022-v1:0 +> - eu.anthropic.claude-3-5-sonnet-20240620-v1:0 +> - eu.anthropic.claude-3-5-sonnet-20241022-v2:0 +> - eu.anthropic.claude-3-7-sonnet-20250219-v1:0 +> - eu.anthropic.claude-3-haiku-20240307-v1:0 +> - eu.anthropic.claude-3-opus-20240229-v1:0 +> - eu.anthropic.claude-3-sonnet-20240229-v1:0 +> - eu.anthropic.claude-opus-4-20250514-v1:0 +> - eu.anthropic.claude-sonnet-4-20250514-v1:0 +> - eu.meta.llama3-2-1b-instruct-v1:0 +> - eu.meta.llama3-2-3b-instruct-v1:0 +> - featherless_ai/featherless-ai/Qwerky-72B +> - featherless_ai/featherless-ai/Qwerky-QwQ-32B +> - fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-instruct +> - fireworks_ai/accounts/fireworks/models/deepseek-r1 +> - fireworks_ai/accounts/fireworks/models/deepseek-r1-0528 +> - fireworks_ai/accounts/fireworks/models/deepseek-r1-basic +> - fireworks_ai/accounts/fireworks/models/deepseek-v3 +> - fireworks_ai/accounts/fireworks/models/deepseek-v3-0324 +> - fireworks_ai/accounts/fireworks/models/firefunction-v2 +> - fireworks_ai/accounts/fireworks/models/llama-v3p1-405b-instruct +> - fireworks_ai/accounts/fireworks/models/llama-v3p1-8b-instruct +> - fireworks_ai/accounts/fireworks/models/llama-v3p2-11b-vision-instruct +> - fireworks_ai/accounts/fireworks/models/llama-v3p2-1b-instruct +> - fireworks_ai/accounts/fireworks/models/llama-v3p2-3b-instruct +> - fireworks_ai/accounts/fireworks/models/llama-v3p2-90b-vision-instruct +> - fireworks_ai/accounts/fireworks/models/llama4-maverick-instruct-basic +> - fireworks_ai/accounts/fireworks/models/llama4-scout-instruct-basic +> - fireworks_ai/accounts/fireworks/models/mixtral-8x22b-instruct-hf +> - fireworks_ai/accounts/fireworks/models/qwen2-72b-instruct +> - fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct +> - fireworks_ai/accounts/fireworks/models/yi-large +> - friendliai/meta-llama-3.1-70b-instruct +> - friendliai/meta-llama-3.1-8b-instruct +> - ft:gpt-3.5-turbo +> - ft:gpt-3.5-turbo-0125 +> - ft:gpt-3.5-turbo-0613 +> - ft:gpt-3.5-turbo-1106 +> - ft:gpt-4-0613 +> - ft:gpt-4o-2024-08-06 +> - ft:gpt-4o-2024-11-20 +> - ft:gpt-4o-mini-2024-07-18 +> - gemini-1.0-pro +> - gemini-1.0-pro-001 +> - gemini-1.0-pro-002 +> - gemini-1.0-pro-vision +> - gemini-1.0-pro-vision-001 +> - gemini-1.0-ultra +> - gemini-1.0-ultra-001 +> - gemini-1.5-flash +> - gemini-1.5-flash-001 +> - gemini-1.5-flash-002 +> - gemini-1.5-flash-exp-0827 +> - gemini-1.5-flash-preview-0514 +> - gemini-1.5-pro +> - gemini-1.5-pro-001 +> - gemini-1.5-pro-002 +> - gemini-1.5-pro-preview-0215 +> - gemini-1.5-pro-preview-0409 +> - gemini-1.5-pro-preview-0514 +> - gemini-2.0-flash +> - gemini-2.0-flash-001 +> - gemini-2.0-flash-exp +> - gemini-2.0-flash-lite +> - gemini-2.0-flash-lite-001 +> - gemini-2.0-flash-preview-image-generation +> - gemini-2.0-flash-thinking-exp +> - gemini-2.0-flash-thinking-exp-01-21 +> - gemini-2.0-pro-exp-02-05 +> - gemini-2.5-flash-preview-04-17 +> - gemini-2.5-flash-preview-05-20 +> - gemini-2.5-pro-exp-03-25 +> - gemini-2.5-pro-preview-03-25 +> - gemini-2.5-pro-preview-05-06 +> - gemini-2.5-pro-preview-06-05 +> - gemini-2.5-pro-preview-tts +> - gemini-flash-experimental +> - gemini-pro +> - gemini-pro-experimental +> - gemini-pro-vision +> - gemini/gemini-1.5-flash +> - gemini/gemini-1.5-flash-001 +> - gemini/gemini-1.5-flash-002 +> - gemini/gemini-1.5-flash-8b +> - gemini/gemini-1.5-flash-8b-exp-0827 +> - gemini/gemini-1.5-flash-8b-exp-0924 +> - gemini/gemini-1.5-flash-exp-0827 +> - gemini/gemini-1.5-flash-latest +> - gemini/gemini-1.5-pro +> - gemini/gemini-1.5-pro-001 +> - gemini/gemini-1.5-pro-002 +> - gemini/gemini-1.5-pro-exp-0801 +> - gemini/gemini-1.5-pro-exp-0827 +> - gemini/gemini-1.5-pro-latest +> - gemini/gemini-2.0-flash +> - gemini/gemini-2.0-flash-001 +> - gemini/gemini-2.0-flash-exp +> - gemini/gemini-2.0-flash-lite +> - gemini/gemini-2.0-flash-lite-preview-02-05 +> - gemini/gemini-2.0-flash-preview-image-generation +> - gemini/gemini-2.0-flash-thinking-exp +> - gemini/gemini-2.0-flash-thinking-exp-01-21 +> - gemini/gemini-2.0-pro-exp-02-05 +> - gemini/gemini-2.5-flash-preview-04-17 +> - gemini/gemini-2.5-flash-preview-05-20 +> - gemini/gemini-2.5-flash-preview-tts +> - gemini/gemini-2.5-pro-exp-03-25 +> - gemini/gemini-2.5-pro-preview-03-25 +> - gemini/gemini-2.5-pro-preview-05-06 +> - gemini/gemini-2.5-pro-preview-06-05 +> - gemini/gemini-2.5-pro-preview-tts +> - gemini/gemini-exp-1114 +> - gemini/gemini-exp-1206 +> - gemini/gemini-gemma-2-27b-it +> - gemini/gemini-gemma-2-9b-it +> - gemini/gemini-pro +> - gemini/gemini-pro-vision +> - gemini/gemma-3-27b-it +> - gemini/learnlm-1.5-pro-experimental +> - gpt-3.5-turbo +> - gpt-3.5-turbo-0125 +> - gpt-3.5-turbo-0301 +> - gpt-3.5-turbo-0613 +> - gpt-3.5-turbo-1106 +> - gpt-3.5-turbo-16k +> - gpt-3.5-turbo-16k-0613 +> - gpt-4 +> - gpt-4-0125-preview +> - gpt-4-0314 +> - gpt-4-0613 +> - gpt-4-1106-preview +> - gpt-4-1106-vision-preview +> - gpt-4-32k +> - gpt-4-32k-0314 +> - gpt-4-32k-0613 +> - gpt-4-turbo +> - gpt-4-turbo-2024-04-09 +> - gpt-4-turbo-preview +> - gpt-4-vision-preview +> - gpt-4.1 +> - gpt-4.1-2025-04-14 +> - gpt-4.1-mini +> - gpt-4.1-mini-2025-04-14 +> - gpt-4.1-nano +> - gpt-4.1-nano-2025-04-14 +> - gpt-4.5-preview +> - gpt-4.5-preview-2025-02-27 +> - gpt-4o +> - gpt-4o-2024-05-13 +> - gpt-4o-2024-08-06 +> - gpt-4o-2024-11-20 +> - gpt-4o-audio-preview +> - gpt-4o-audio-preview-2024-10-01 +> - gpt-4o-audio-preview-2024-12-17 +> - gpt-4o-audio-preview-2025-06-03 +> - gpt-4o-mini +> - gpt-4o-mini-2024-07-18 +> - gpt-4o-mini-audio-preview +> - gpt-4o-mini-audio-preview-2024-12-17 +> - gpt-4o-mini-realtime-preview +> - gpt-4o-mini-realtime-preview-2024-12-17 +> - gpt-4o-mini-search-preview +> - gpt-4o-mini-search-preview-2025-03-11 +> - gpt-4o-realtime-preview +> - gpt-4o-realtime-preview-2024-10-01 +> - gpt-4o-realtime-preview-2024-12-17 +> - gpt-4o-search-preview +> - gpt-4o-search-preview-2025-03-11 +> - groq/deepseek-r1-distill-llama-70b +> - groq/gemma-7b-it +> - groq/gemma2-9b-it +> - groq/llama-3.1-405b-reasoning +> - groq/llama-3.1-70b-versatile +> - groq/llama-3.1-8b-instant +> - groq/llama-3.2-11b-text-preview +> - groq/llama-3.2-11b-vision-preview +> - groq/llama-3.2-1b-preview +> - groq/llama-3.2-3b-preview +> - groq/llama-3.2-90b-text-preview +> - groq/llama-3.2-90b-vision-preview +> - groq/llama-3.3-70b-specdec +> - groq/llama-3.3-70b-versatile +> - groq/llama-guard-3-8b +> - groq/llama2-70b-4096 +> - groq/llama3-70b-8192 +> - groq/llama3-8b-8192 +> - groq/llama3-groq-70b-8192-tool-use-preview +> - groq/llama3-groq-8b-8192-tool-use-preview +> - groq/meta-llama/llama-4-maverick-17b-128e-instruct +> - groq/meta-llama/llama-4-scout-17b-16e-instruct +> - groq/mistral-saba-24b +> - groq/mixtral-8x7b-32768 +> - groq/qwen-qwq-32b +> - jamba-1.5 +> - jamba-1.5-large +> - jamba-1.5-large@001 +> - jamba-1.5-mini +> - jamba-1.5-mini@001 +> - jamba-large-1.6 +> - jamba-mini-1.6 +> - luminous-base-control +> - luminous-extended-control +> - luminous-supreme-control +> - medlm-large +> - medlm-medium +> - meta.llama2-13b-chat-v1 +> - meta.llama2-70b-chat-v1 +> - meta.llama3-1-405b-instruct-v1:0 +> - meta.llama3-1-70b-instruct-v1:0 +> - meta.llama3-1-8b-instruct-v1:0 +> - meta.llama3-2-11b-instruct-v1:0 +> - meta.llama3-2-1b-instruct-v1:0 +> - meta.llama3-2-3b-instruct-v1:0 +> - meta.llama3-2-90b-instruct-v1:0 +> - meta.llama3-3-70b-instruct-v1:0 +> - meta.llama3-70b-instruct-v1:0 +> - meta.llama3-8b-instruct-v1:0 +> - meta.llama4-maverick-17b-instruct-v1:0 +> - meta.llama4-scout-17b-instruct-v1:0 +> - meta_llama/Llama-3.3-70B-Instruct +> - meta_llama/Llama-3.3-8B-Instruct +> - meta_llama/Llama-4-Maverick-17B-128E-Instruct-FP8 +> - meta_llama/Llama-4-Scout-17B-16E-Instruct-FP8 +> - mistral.mistral-7b-instruct-v0:2 +> - mistral.mistral-large-2402-v1:0 +> - mistral.mistral-large-2407-v1:0 +> - mistral.mistral-small-2402-v1:0 +> - mistral.mixtral-8x7b-instruct-v0:1 +> - mistral/codestral-2405 +> - mistral/codestral-latest +> - mistral/codestral-mamba-latest +> - mistral/devstral-small-2505 +> - mistral/magistral-medium-2506 +> - mistral/magistral-small-2506 +> - mistral/mistral-large-2402 +> - mistral/mistral-large-2407 +> - mistral/mistral-large-2411 +> - mistral/mistral-large-latest +> - mistral/mistral-medium +> - mistral/mistral-medium-2312 +> - mistral/mistral-medium-2505 +> - mistral/mistral-medium-latest +> - mistral/mistral-small +> - mistral/mistral-small-latest +> - mistral/mistral-tiny +> - mistral/open-codestral-mamba +> - mistral/open-mistral-7b +> - mistral/open-mistral-nemo +> - mistral/open-mistral-nemo-2407 +> - mistral/open-mixtral-8x22b +> - mistral/open-mixtral-8x7b +> - mistral/pixtral-12b-2409 +> - mistral/pixtral-large-2411 +> - mistral/pixtral-large-latest +> - mistralai/mistral-small-3.1-24b-instruct +> - nlp_cloud/chatdolphin +> - nscale/Qwen/QwQ-32B +> - nscale/Qwen/Qwen2.5-Coder-32B-Instruct +> - nscale/Qwen/Qwen2.5-Coder-3B-Instruct +> - nscale/Qwen/Qwen2.5-Coder-7B-Instruct +> - nscale/deepseek-ai/DeepSeek-R1-Distill-Llama-70B +> - nscale/deepseek-ai/DeepSeek-R1-Distill-Llama-8B +> - nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B +> - nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B +> - nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B +> - nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B +> - nscale/meta-llama/Llama-3.1-8B-Instruct +> - nscale/meta-llama/Llama-3.3-70B-Instruct +> - nscale/meta-llama/Llama-4-Scout-17B-16E-Instruct +> - nscale/mistralai/mixtral-8x22b-instruct-v0.1 +> - o1 +> - o1-2024-12-17 +> - o1-mini +> - o1-mini-2024-09-12 +> - o1-preview +> - o1-preview-2024-09-12 +> - o3 +> - o3-2025-04-16 +> - o3-mini +> - o3-mini-2025-01-31 +> - o4-mini +> - o4-mini-2025-04-16 +> - ollama/codegeex4 +> - ollama/deepseek-coder-v2-instruct +> - ollama/deepseek-coder-v2-lite-instruct +> - ollama/internlm2_5-20b-chat +> - ollama/llama2 +> - ollama/llama2:13b +> - ollama/llama2:70b +> - ollama/llama2:7b +> - ollama/llama3 +> - ollama/llama3.1 +> - ollama/llama3:70b +> - ollama/llama3:8b +> - ollama/mistral-7B-Instruct-v0.1 +> - ollama/mistral-7B-Instruct-v0.2 +> - ollama/mistral-large-instruct-2407 +> - ollama/mixtral-8x22B-Instruct-v0.1 +> - ollama/mixtral-8x7B-Instruct-v0.1 +> - openai/chatgpt-4o-latest +> - openai/ft:gpt-3.5-turbo +> - openai/ft:gpt-3.5-turbo-0125 +> - openai/ft:gpt-3.5-turbo-0613 +> - openai/ft:gpt-3.5-turbo-1106 +> - openai/ft:gpt-4-0613 +> - openai/ft:gpt-4o-2024-08-06 +> - openai/ft:gpt-4o-2024-11-20 +> - openai/ft:gpt-4o-mini-2024-07-18 +> - openai/gpt-3.5-turbo +> - openai/gpt-3.5-turbo-0125 +> - openai/gpt-3.5-turbo-0301 +> - openai/gpt-3.5-turbo-0613 +> - openai/gpt-3.5-turbo-1106 +> - openai/gpt-3.5-turbo-16k +> - openai/gpt-3.5-turbo-16k-0613 +> - openai/gpt-4 +> - openai/gpt-4-0125-preview +> - openai/gpt-4-0314 +> - openai/gpt-4-0613 +> - openai/gpt-4-1106-preview +> - openai/gpt-4-1106-vision-preview +> - openai/gpt-4-32k +> - openai/gpt-4-32k-0314 +> - openai/gpt-4-32k-0613 +> - openai/gpt-4-turbo +> - openai/gpt-4-turbo-2024-04-09 +> - openai/gpt-4-turbo-preview +> - openai/gpt-4-vision-preview +> - openai/gpt-4.1 +> - openai/gpt-4.1-2025-04-14 +> - openai/gpt-4.1-mini +> - openai/gpt-4.1-mini-2025-04-14 +> - openai/gpt-4.1-nano +> - openai/gpt-4.1-nano-2025-04-14 +> - openai/gpt-4.5-preview +> - openai/gpt-4.5-preview-2025-02-27 +> - openai/gpt-4o +> - openai/gpt-4o-2024-05-13 +> - openai/gpt-4o-2024-08-06 +> - openai/gpt-4o-2024-11-20 +> - openai/gpt-4o-audio-preview +> - openai/gpt-4o-audio-preview-2024-10-01 +> - openai/gpt-4o-audio-preview-2024-12-17 +> - openai/gpt-4o-audio-preview-2025-06-03 +> - openai/gpt-4o-mini +> - openai/gpt-4o-mini-2024-07-18 +> - openai/gpt-4o-mini-audio-preview +> - openai/gpt-4o-mini-audio-preview-2024-12-17 +> - openai/gpt-4o-mini-realtime-preview +> - openai/gpt-4o-mini-realtime-preview-2024-12-17 +> - openai/gpt-4o-mini-search-preview +> - openai/gpt-4o-mini-search-preview-2025-03-11 +> - openai/gpt-4o-realtime-preview +> - openai/gpt-4o-realtime-preview-2024-10-01 +> - openai/gpt-4o-realtime-preview-2024-12-17 +> - openai/gpt-4o-search-preview +> - openai/gpt-4o-search-preview-2025-03-11 +> - openai/o1 +> - openai/o1-2024-12-17 +> - openai/o1-mini +> - openai/o1-mini-2024-09-12 +> - openai/o1-preview +> - openai/o1-preview-2024-09-12 +> - openai/o3 +> - openai/o3-2025-04-16 +> - openai/o3-mini +> - openai/o3-mini-2025-01-31 +> - openai/o4-mini +> - openai/o4-mini-2025-04-16 +> - openrouter/anthropic/claude-2 +> - openrouter/anthropic/claude-3-5-haiku +> - openrouter/anthropic/claude-3-5-haiku-20241022 +> - openrouter/anthropic/claude-3-haiku +> - openrouter/anthropic/claude-3-haiku-20240307 +> - openrouter/anthropic/claude-3-opus +> - openrouter/anthropic/claude-3-sonnet +> - openrouter/anthropic/claude-3.5-sonnet +> - openrouter/anthropic/claude-3.5-sonnet:beta +> - openrouter/anthropic/claude-3.7-sonnet +> - openrouter/anthropic/claude-3.7-sonnet:beta +> - openrouter/anthropic/claude-instant-v1 +> - openrouter/cognitivecomputations/dolphin-mixtral-8x7b +> - openrouter/cohere/command-r-plus +> - openrouter/databricks/dbrx-instruct +> - openrouter/deepseek/deepseek-chat +> - openrouter/deepseek/deepseek-chat-v3-0324 +> - openrouter/deepseek/deepseek-chat-v3-0324:free +> - openrouter/deepseek/deepseek-chat:free +> - openrouter/deepseek/deepseek-coder +> - openrouter/deepseek/deepseek-r1 +> - openrouter/deepseek/deepseek-r1:free +> - openrouter/fireworks/firellava-13b +> - openrouter/google/gemini-2.0-flash-001 +> - openrouter/google/gemini-2.0-flash-exp:free +> - openrouter/google/gemini-2.5-pro-exp-03-25 +> - openrouter/google/gemini-2.5-pro-preview-03-25 +> - openrouter/google/gemini-pro-1.5 +> - openrouter/google/gemini-pro-vision +> - openrouter/google/palm-2-chat-bison +> - openrouter/google/palm-2-codechat-bison +> - openrouter/gryphe/mythomax-l2-13b +> - openrouter/jondurbin/airoboros-l2-70b-2.1 +> - openrouter/mancer/weaver +> - openrouter/meta-llama/codellama-34b-instruct +> - openrouter/meta-llama/llama-2-13b-chat +> - openrouter/meta-llama/llama-2-70b-chat +> - openrouter/meta-llama/llama-3-70b-instruct +> - openrouter/meta-llama/llama-3-70b-instruct:nitro +> - openrouter/meta-llama/llama-3-8b-instruct:extended +> - openrouter/meta-llama/llama-3-8b-instruct:free +> - openrouter/microsoft/wizardlm-2-8x22b:nitro +> - openrouter/mistralai/mistral-7b-instruct +> - openrouter/mistralai/mistral-7b-instruct:free +> - openrouter/mistralai/mistral-large +> - openrouter/mistralai/mistral-small-3.1-24b-instruct +> - openrouter/mistralai/mixtral-8x22b-instruct +> - openrouter/nousresearch/nous-hermes-llama2-13b +> - openrouter/openai/gpt-3.5-turbo +> - openrouter/openai/gpt-3.5-turbo-16k +> - openrouter/openai/gpt-4 +> - openrouter/openai/gpt-4-vision-preview +> - openrouter/openai/gpt-4o +> - openrouter/openai/gpt-4o-2024-05-13 +> - openrouter/openai/gpt-4o-mini +> - openrouter/openai/o1 +> - openrouter/openai/o1-mini +> - openrouter/openai/o1-mini-2024-09-12 +> - openrouter/openai/o1-preview +> - openrouter/openai/o1-preview-2024-09-12 +> - openrouter/openai/o3-mini +> - openrouter/openai/o3-mini-high +> - openrouter/openrouter/optimus-alpha +> - openrouter/openrouter/quasar-alpha +> - openrouter/pygmalionai/mythalion-13b +> - openrouter/qwen/qwen-2.5-coder-32b-instruct +> - openrouter/undi95/remm-slerp-l2-13b +> - openrouter/x-ai/grok-3-beta +> - openrouter/x-ai/grok-3-fast-beta +> - openrouter/x-ai/grok-3-mini-beta +> - openrouter/x-ai/grok-3-mini-fast-beta +> - palm/chat-bison +> - palm/chat-bison-001 +> - perplexity/codellama-34b-instruct +> - perplexity/codellama-70b-instruct +> - perplexity/llama-2-70b-chat +> - perplexity/llama-3.1-70b-instruct +> - perplexity/llama-3.1-8b-instruct +> - perplexity/llama-3.1-sonar-huge-128k-online +> - perplexity/llama-3.1-sonar-large-128k-chat +> - perplexity/llama-3.1-sonar-large-128k-online +> - perplexity/llama-3.1-sonar-small-128k-chat +> - perplexity/llama-3.1-sonar-small-128k-online +> - perplexity/mistral-7b-instruct +> - perplexity/mixtral-8x7b-instruct +> - perplexity/pplx-70b-chat +> - perplexity/pplx-70b-online +> - perplexity/pplx-7b-chat +> - perplexity/pplx-7b-online +> - perplexity/sonar +> - perplexity/sonar-deep-research +> - perplexity/sonar-medium-chat +> - perplexity/sonar-medium-online +> - perplexity/sonar-pro +> - perplexity/sonar-reasoning +> - perplexity/sonar-reasoning-pro +> - perplexity/sonar-small-chat +> - perplexity/sonar-small-online +> - replicate/meta/llama-2-13b +> - replicate/meta/llama-2-13b-chat +> - replicate/meta/llama-2-70b +> - replicate/meta/llama-2-70b-chat +> - replicate/meta/llama-2-7b +> - replicate/meta/llama-2-7b-chat +> - replicate/meta/llama-3-70b +> - replicate/meta/llama-3-70b-instruct +> - replicate/meta/llama-3-8b +> - replicate/meta/llama-3-8b-instruct +> - replicate/mistralai/mistral-7b-instruct-v0.2 +> - replicate/mistralai/mistral-7b-v0.1 +> - replicate/mistralai/mixtral-8x7b-instruct-v0.1 +> - sagemaker/meta-textgeneration-llama-2-13b-f +> - sagemaker/meta-textgeneration-llama-2-70b-b-f +> - sagemaker/meta-textgeneration-llama-2-7b-f +> - sambanova/DeepSeek-R1 +> - sambanova/DeepSeek-R1-Distill-Llama-70B +> - sambanova/DeepSeek-V3-0324 +> - sambanova/Llama-4-Maverick-17B-128E-Instruct +> - sambanova/Llama-4-Scout-17B-16E-Instruct +> - sambanova/Meta-Llama-3.1-405B-Instruct +> - sambanova/Meta-Llama-3.1-8B-Instruct +> - sambanova/Meta-Llama-3.2-1B-Instruct +> - sambanova/Meta-Llama-3.2-3B-Instruct +> - sambanova/Meta-Llama-3.3-70B-Instruct +> - sambanova/Meta-Llama-Guard-3-8B +> - sambanova/QwQ-32B +> - sambanova/Qwen2-Audio-7B-Instruct +> - sambanova/Qwen3-32B +> - snowflake/claude-3-5-sonnet +> - snowflake/deepseek-r1 +> - snowflake/gemma-7b +> - snowflake/jamba-1.5-large +> - snowflake/jamba-1.5-mini +> - snowflake/jamba-instruct +> - snowflake/llama2-70b-chat +> - snowflake/llama3-70b +> - snowflake/llama3-8b +> - snowflake/llama3.1-405b +> - snowflake/llama3.1-70b +> - snowflake/llama3.1-8b +> - snowflake/llama3.2-1b +> - snowflake/llama3.2-3b +> - snowflake/llama3.3-70b +> - snowflake/mistral-7b +> - snowflake/mistral-large +> - snowflake/mistral-large2 +> - snowflake/mixtral-8x7b +> - snowflake/reka-core +> - snowflake/reka-flash +> - snowflake/snowflake-arctic +> - snowflake/snowflake-llama-3.1-405b +> - snowflake/snowflake-llama-3.3-70b +> - together-ai-21.1b-41b +> - together-ai-4.1b-8b +> - together-ai-41.1b-80b +> - together-ai-8.1b-21b +> - together-ai-81.1b-110b +> - together-ai-up-to-4b +> - together_ai/Qwen/Qwen2.5-72B-Instruct-Turbo +> - together_ai/Qwen/Qwen2.5-7B-Instruct-Turbo +> - together_ai/deepseek-ai/DeepSeek-V3 +> - together_ai/meta-llama/Llama-3.2-3B-Instruct-Turbo +> - together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo +> - together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free +> - together_ai/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8 +> - together_ai/meta-llama/Llama-4-Scout-17B-16E-Instruct +> - together_ai/meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo +> - together_ai/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo +> - together_ai/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo +> - together_ai/mistralai/Mistral-7B-Instruct-v0.1 +> - together_ai/mistralai/Mistral-Small-24B-Instruct-2501 +> - together_ai/mistralai/Mixtral-8x7B-Instruct-v0.1 +> - together_ai/together-ai-21.1b-41b +> - together_ai/together-ai-4.1b-8b +> - together_ai/together-ai-41.1b-80b +> - together_ai/together-ai-8.1b-21b +> - together_ai/together-ai-81.1b-110b +> - together_ai/together-ai-up-to-4b +> - together_ai/togethercomputer/CodeLlama-34b-Instruct +> - us.amazon.nova-lite-v1:0 +> - us.amazon.nova-micro-v1:0 +> - us.amazon.nova-premier-v1:0 +> - us.amazon.nova-pro-v1:0 +> - us.anthropic.claude-3-5-haiku-20241022-v1:0 +> - us.anthropic.claude-3-5-sonnet-20240620-v1:0 +> - us.anthropic.claude-3-5-sonnet-20241022-v2:0 +> - us.anthropic.claude-3-7-sonnet-20250219-v1:0 +> - us.anthropic.claude-3-haiku-20240307-v1:0 +> - us.anthropic.claude-3-opus-20240229-v1:0 +> - us.anthropic.claude-3-sonnet-20240229-v1:0 +> - us.anthropic.claude-opus-4-20250514-v1:0 +> - us.anthropic.claude-sonnet-4-20250514-v1:0 +> - us.deepseek.r1-v1:0 +> - us.meta.llama3-1-405b-instruct-v1:0 +> - us.meta.llama3-1-70b-instruct-v1:0 +> - us.meta.llama3-1-8b-instruct-v1:0 +> - us.meta.llama3-2-11b-instruct-v1:0 +> - us.meta.llama3-2-1b-instruct-v1:0 +> - us.meta.llama3-2-3b-instruct-v1:0 +> - us.meta.llama3-2-90b-instruct-v1:0 +> - us.meta.llama3-3-70b-instruct-v1:0 +> - us.meta.llama4-maverick-17b-instruct-v1:0 +> - us.meta.llama4-scout-17b-instruct-v1:0 +> - vertex_ai-ai21_models/vertex_ai/jamba-1.5 +> - vertex_ai-ai21_models/vertex_ai/jamba-1.5-large +> - vertex_ai-ai21_models/vertex_ai/jamba-1.5-large@001 +> - vertex_ai-ai21_models/vertex_ai/jamba-1.5-mini +> - vertex_ai-ai21_models/vertex_ai/jamba-1.5-mini@001 +> - vertex_ai-anthropic_models/vertex_ai/claude-3-5-haiku +> - vertex_ai-anthropic_models/vertex_ai/claude-3-5-haiku@20241022 +> - vertex_ai-anthropic_models/vertex_ai/claude-3-5-sonnet +> - vertex_ai-anthropic_models/vertex_ai/claude-3-5-sonnet-v2 +> - vertex_ai-anthropic_models/vertex_ai/claude-3-5-sonnet-v2@20241022 +> - vertex_ai-anthropic_models/vertex_ai/claude-3-5-sonnet@20240620 +> - vertex_ai-anthropic_models/vertex_ai/claude-3-7-sonnet@20250219 +> - vertex_ai-anthropic_models/vertex_ai/claude-3-haiku +> - vertex_ai-anthropic_models/vertex_ai/claude-3-haiku@20240307 +> - vertex_ai-anthropic_models/vertex_ai/claude-3-opus +> - vertex_ai-anthropic_models/vertex_ai/claude-3-opus@20240229 +> - vertex_ai-anthropic_models/vertex_ai/claude-3-sonnet +> - vertex_ai-anthropic_models/vertex_ai/claude-3-sonnet@20240229 +> - vertex_ai-anthropic_models/vertex_ai/claude-opus-4 +> - vertex_ai-anthropic_models/vertex_ai/claude-opus-4@20250514 +> - vertex_ai-anthropic_models/vertex_ai/claude-sonnet-4 +> - vertex_ai-anthropic_models/vertex_ai/claude-sonnet-4@20250514 +> - vertex_ai-chat-models/chat-bison +> - vertex_ai-chat-models/chat-bison-32k +> - vertex_ai-chat-models/chat-bison-32k@002 +> - vertex_ai-chat-models/chat-bison@001 +> - vertex_ai-chat-models/chat-bison@002 +> - vertex_ai-code-chat-models/codechat-bison +> - vertex_ai-code-chat-models/codechat-bison-32k +> - vertex_ai-code-chat-models/codechat-bison-32k@002 +> - vertex_ai-code-chat-models/codechat-bison@001 +> - vertex_ai-code-chat-models/codechat-bison@002 +> - vertex_ai-code-chat-models/codechat-bison@latest +> - vertex_ai-code-text-models/code-bison +> - vertex_ai-language-models/gemini-1.0-pro +> - vertex_ai-language-models/gemini-1.0-pro-001 +> - vertex_ai-language-models/gemini-1.0-pro-002 +> - vertex_ai-language-models/gemini-1.0-ultra +> - vertex_ai-language-models/gemini-1.0-ultra-001 +> - vertex_ai-language-models/gemini-1.5-flash +> - vertex_ai-language-models/gemini-1.5-flash-001 +> - vertex_ai-language-models/gemini-1.5-flash-002 +> - vertex_ai-language-models/gemini-1.5-flash-exp-0827 +> - vertex_ai-language-models/gemini-1.5-flash-preview-0514 +> - vertex_ai-language-models/gemini-1.5-pro +> - vertex_ai-language-models/gemini-1.5-pro-001 +> - vertex_ai-language-models/gemini-1.5-pro-002 +> - vertex_ai-language-models/gemini-1.5-pro-preview-0215 +> - vertex_ai-language-models/gemini-1.5-pro-preview-0409 +> - vertex_ai-language-models/gemini-1.5-pro-preview-0514 +> - vertex_ai-language-models/gemini-2.0-flash +> - vertex_ai-language-models/gemini-2.0-flash-001 +> - vertex_ai-language-models/gemini-2.0-flash-exp +> - vertex_ai-language-models/gemini-2.0-flash-lite +> - vertex_ai-language-models/gemini-2.0-flash-lite-001 +> - vertex_ai-language-models/gemini-2.0-flash-preview-image-generation +> - vertex_ai-language-models/gemini-2.0-flash-thinking-exp +> - vertex_ai-language-models/gemini-2.0-flash-thinking-exp-01-21 +> - vertex_ai-language-models/gemini-2.0-pro-exp-02-05 +> - vertex_ai-language-models/gemini-2.5-flash-preview-04-17 +> - vertex_ai-language-models/gemini-2.5-flash-preview-05-20 +> - vertex_ai-language-models/gemini-2.5-pro-exp-03-25 +> - vertex_ai-language-models/gemini-2.5-pro-preview-03-25 +> - vertex_ai-language-models/gemini-2.5-pro-preview-05-06 +> - vertex_ai-language-models/gemini-2.5-pro-preview-06-05 +> - vertex_ai-language-models/gemini-2.5-pro-preview-tts +> - vertex_ai-language-models/gemini-flash-experimental +> - vertex_ai-language-models/gemini-pro +> - vertex_ai-language-models/gemini-pro-experimental +> - vertex_ai-language-models/medlm-large +> - vertex_ai-language-models/medlm-medium +> - vertex_ai-language-models/openrouter/google/gemini-2.5-pro-preview-03-25 +> - vertex_ai-language-models/vertex_ai/gemini-2.5-pro-exp-03-25 +> - vertex_ai-language-models/vertex_ai/gemini-2.5-pro-preview-03-25 +> - vertex_ai-llama_models/vertex_ai/meta/llama-3.2-90b-vision-instruct-maas +> - vertex_ai-llama_models/vertex_ai/meta/llama-4-maverick-17b-128e-instruct-maas +> - vertex_ai-llama_models/vertex_ai/meta/llama-4-maverick-17b-16e-instruct-maas +> - vertex_ai-llama_models/vertex_ai/meta/llama-4-scout-17b-128e-instruct-maas +> - vertex_ai-llama_models/vertex_ai/meta/llama-4-scout-17b-16e-instruct-maas +> - vertex_ai-llama_models/vertex_ai/meta/llama3-405b-instruct-maas +> - vertex_ai-llama_models/vertex_ai/meta/llama3-70b-instruct-maas +> - vertex_ai-llama_models/vertex_ai/meta/llama3-8b-instruct-maas +> - vertex_ai-mistral_models/vertex_ai/codestral-2501 +> - vertex_ai-mistral_models/vertex_ai/codestral@2405 +> - vertex_ai-mistral_models/vertex_ai/codestral@latest +> - vertex_ai-mistral_models/vertex_ai/mistral-large-2411 +> - vertex_ai-mistral_models/vertex_ai/mistral-large@2407 +> - vertex_ai-mistral_models/vertex_ai/mistral-large@2411-001 +> - vertex_ai-mistral_models/vertex_ai/mistral-large@latest +> - vertex_ai-mistral_models/vertex_ai/mistral-nemo@2407 +> - vertex_ai-mistral_models/vertex_ai/mistral-nemo@latest +> - vertex_ai-mistral_models/vertex_ai/mistral-small-2503 +> - vertex_ai-mistral_models/vertex_ai/mistral-small-2503@001 +> - vertex_ai-vision-models/gemini-1.0-pro-vision +> - vertex_ai-vision-models/gemini-1.0-pro-vision-001 +> - vertex_ai-vision-models/gemini-pro-vision +> - vertex_ai/claude-3-5-haiku +> - vertex_ai/claude-3-5-haiku@20241022 +> - vertex_ai/claude-3-5-sonnet +> - vertex_ai/claude-3-5-sonnet-v2 +> - vertex_ai/claude-3-5-sonnet-v2@20241022 +> - vertex_ai/claude-3-5-sonnet@20240620 +> - vertex_ai/claude-3-7-sonnet@20250219 +> - vertex_ai/claude-3-haiku +> - vertex_ai/claude-3-haiku@20240307 +> - vertex_ai/claude-3-opus +> - vertex_ai/claude-3-opus@20240229 +> - vertex_ai/claude-3-sonnet +> - vertex_ai/claude-3-sonnet@20240229 +> - vertex_ai/claude-opus-4 +> - vertex_ai/claude-opus-4@20250514 +> - vertex_ai/claude-sonnet-4 +> - vertex_ai/claude-sonnet-4@20250514 +> - vertex_ai/codestral-2501 +> - vertex_ai/codestral@2405 +> - vertex_ai/codestral@latest +> - vertex_ai/gemini-2.5-pro-exp-03-25 +> - vertex_ai/gemini-2.5-pro-preview-03-25 +> - vertex_ai/jamba-1.5 +> - vertex_ai/jamba-1.5-large +> - vertex_ai/jamba-1.5-large@001 +> - vertex_ai/jamba-1.5-mini +> - vertex_ai/jamba-1.5-mini@001 +> - vertex_ai/meta/llama-3.2-90b-vision-instruct-maas +> - vertex_ai/meta/llama-4-maverick-17b-128e-instruct-maas +> - vertex_ai/meta/llama-4-maverick-17b-16e-instruct-maas +> - vertex_ai/meta/llama-4-scout-17b-128e-instruct-maas +> - vertex_ai/meta/llama-4-scout-17b-16e-instruct-maas +> - vertex_ai/meta/llama3-405b-instruct-maas +> - vertex_ai/meta/llama3-70b-instruct-maas +> - vertex_ai/meta/llama3-8b-instruct-maas +> - vertex_ai/mistral-large-2411 +> - vertex_ai/mistral-large@2407 +> - vertex_ai/mistral-large@2411-001 +> - vertex_ai/mistral-large@latest +> - vertex_ai/mistral-nemo@2407 +> - vertex_ai/mistral-nemo@latest +> - vertex_ai/mistral-small-2503 +> - vertex_ai/mistral-small-2503@001 +> - watsonx/ibm/granite-3-8b-instruct +> - xai/grok-2 +> - xai/grok-2-1212 +> - xai/grok-2-latest +> - xai/grok-2-vision +> - xai/grok-2-vision-1212 +> - xai/grok-2-vision-latest +> - xai/grok-3 +> - xai/grok-3-beta +> - xai/grok-3-fast-beta +> - xai/grok-3-fast-latest +> - xai/grok-3-latest +> - xai/grok-3-mini +> - xai/grok-3-mini-beta +> - xai/grok-3-mini-fast +> - xai/grok-3-mini-fast-beta +> - xai/grok-3-mini-fast-latest +> - xai/grok-3-mini-latest +> - xai/grok-beta +> - xai/grok-vision-beta +> Aider v0.84.0 +> Main model: with whole edit format +> Weak model: openrouter/anthropic/claude-3-5-haiku +> Git repo: .git with 48 files +> Repo-map: using 4096 tokens, auto refresh +> Warning: map-tokens > 2048 is not recommended. Too much irrelevant code can confuse LLMs. + +#### /exit diff --git a/.aider.input.history b/.aider.input.history new file mode 100644 index 0000000..14d5e14 --- /dev/null +++ b/.aider.input.history @@ -0,0 +1,9 @@ + +# 2025-06-14 18:21:08.215816 ++yes + +# 2025-06-14 18:21:29.450580 ++/model + +# 2025-06-14 18:22:01.292648 ++/exit diff --git a/.aider.tags.cache.v4/cache.db b/.aider.tags.cache.v4/cache.db new file mode 100644 index 0000000..0df0c13 Binary files /dev/null and b/.aider.tags.cache.v4/cache.db differ diff --git a/.opencode/init b/.opencode/init new file mode 100644 index 0000000..e69de29 diff --git a/.opencode/opencode.db b/.opencode/opencode.db new file mode 100644 index 0000000..4e86411 Binary files /dev/null and b/.opencode/opencode.db differ diff --git a/.opencode/opencode.db-shm b/.opencode/opencode.db-shm new file mode 100644 index 0000000..8f8dfc6 Binary files /dev/null and b/.opencode/opencode.db-shm differ diff --git a/.opencode/opencode.db-wal b/.opencode/opencode.db-wal new file mode 100644 index 0000000..6dcc324 Binary files /dev/null and b/.opencode/opencode.db-wal differ diff --git a/OpenCode.md b/OpenCode.md new file mode 100644 index 0000000..9689283 --- /dev/null +++ b/OpenCode.md @@ -0,0 +1,36 @@ +# OpenCode.md + +## Build/Test Commands +```bash +# Backend setup and run (from project root) +pip install -r backend/requirements.txt +uvicorn backend.app.main:app --reload --host 0.0.0.0 --port 8000 + +# Frontend tests +npm test # Run all Jest tests +npm test -- --testNamePattern="getSpeakers" # Run single test + +# Backend API test +python backend/run_api_test.py + +# Alternative interface +python gradio_app.py +``` + +## Code Style Guidelines + +### Python (Backend) +- **Imports**: Standard library first, third-party, then local imports with blank lines between groups +- **Types**: Use type hints extensively (`List[Speaker]`, `Optional[str]`, `Dict[str, Any]`) +- **Classes**: PascalCase (`SpeakerManagementService`, `DialogRequest`) +- **Functions/Variables**: snake_case (`get_speakers`, `speaker_id`, `audio_url`) +- **Error Handling**: Use FastAPI `HTTPException` with descriptive messages +- **Models**: Pydantic models with Field descriptions and validators + +### JavaScript (Frontend) +- **Modules**: ES6 modules with explicit imports/exports +- **Functions**: camelCase with JSDoc comments (`getSpeakers`, `addSpeaker`) +- **Constants**: UPPER_SNAKE_CASE (`API_BASE_URL`) +- **Error Handling**: Comprehensive try/catch with detailed error messages +- **Async**: Use async/await consistently, handle response.ok checks +- **Testing**: Jest with descriptive test names and comprehensive mocking \ No newline at end of file diff --git a/backend/app/main.py b/backend/app/main.py index 7b57297..ff795c6 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -4,6 +4,7 @@ from fastapi.middleware.cors import CORSMiddleware from pathlib import Path from app.routers import speakers, dialog # Import the routers from app import config +from app.services.tts_service import get_global_tts_service app = FastAPI( title="Chatterbox TTS API", @@ -37,4 +38,21 @@ config.DIALOG_GENERATED_DIR.mkdir(parents=True, exist_ok=True) # Mount StaticFiles to serve generated dialogs app.mount("/generated_audio", StaticFiles(directory=config.DIALOG_GENERATED_DIR), name="generated_audio") +# Application lifecycle events for TTS model management +@app.on_event("startup") +async def startup_event(): + """Load TTS model on application startup.""" + print("🚀 Starting Chatterbox TTS API...") + tts_service = get_global_tts_service() + tts_service.load_model() + print("✅ TTS model loaded and ready!") + +@app.on_event("shutdown") +async def shutdown_event(): + """Unload TTS model on application shutdown.""" + print("🔄 Shutting down Chatterbox TTS API...") + tts_service = get_global_tts_service() + tts_service.unload_model() + print("✅ TTS model unloaded. Goodbye!") + # Further endpoints for speakers, dialog generation, etc., will be added here. diff --git a/backend/app/routers/dialog.py b/backend/app/routers/dialog.py index adb0508..a4e4b78 100644 --- a/backend/app/routers/dialog.py +++ b/backend/app/routers/dialog.py @@ -4,7 +4,7 @@ import shutil import os from app.models.dialog_models import DialogRequest, DialogResponse -from app.services.tts_service import TTSService +from app.services.tts_service import TTSService, get_global_tts_service from app.services.speaker_service import SpeakerManagementService from app.services.dialog_processor_service import DialogProcessorService from app.services.audio_manipulation_service import AudioManipulationService @@ -17,8 +17,8 @@ router = APIRouter() # For now, direct instantiation or simple Depends is fine. def get_tts_service(): - # Consider making device configurable - return TTSService(device="mps") + # Return the global singleton instance + return get_global_tts_service(device="mps") def get_speaker_management_service(): return SpeakerManagementService() @@ -128,19 +128,7 @@ async def generate_line( detail=error_detail ) -async def manage_tts_model_lifecycle(tts_service: TTSService, task_function, *args, **kwargs): - """Loads TTS model, executes task, then unloads model.""" - try: - print("API: Loading TTS model...") - tts_service.load_model() - return await task_function(*args, **kwargs) - except Exception as e: - # Log or handle specific exceptions if needed before re-raising - print(f"API: Error during TTS model lifecycle or task execution: {e}") - raise - finally: - print("API: Unloading TTS model...") - tts_service.unload_model() +# Note: manage_tts_model_lifecycle function removed - model lifecycle now managed at application startup/shutdown async def process_dialog_flow( request: DialogRequest, @@ -274,10 +262,8 @@ async def generate_dialog_endpoint( - Concatenates all audio segments into a single file. - Creates a ZIP archive of all individual segments and the concatenated file. """ - # Wrap the core processing logic with model loading/unloading - return await manage_tts_model_lifecycle( - tts_service, - process_dialog_flow, + # Model is now loaded at startup and kept loaded - no per-request lifecycle management needed + return await process_dialog_flow( request=request, dialog_processor=dialog_processor, audio_manipulator=audio_manipulator, diff --git a/backend/app/services/tts_service.py b/backend/app/services/tts_service.py index 2a34469..5cf928a 100644 --- a/backend/app/services/tts_service.py +++ b/backend/app/services/tts_service.py @@ -41,10 +41,22 @@ def safe_load_chatterbox_tts(device): return ChatterboxTTS.from_pretrained(device=device) class TTSService: + _instance = None + _initialized = False + + def __new__(cls, device: str = "mps"): + """Singleton pattern - ensures only one instance exists.""" + if cls._instance is None: + cls._instance = super(TTSService, cls).__new__(cls) + return cls._instance + def __init__(self, device: str = "mps"): # Default to MPS for Macs, can be "cpu" or "cuda" - self.device = device - self.model = None - self._ensure_output_dir_exists() + # Only initialize once to prevent resetting the model + if not self._initialized: + self.device = device + self.model = None + self._ensure_output_dir_exists() + TTSService._initialized = True def _ensure_output_dir_exists(self): """Ensures the TTS output directory exists.""" @@ -62,12 +74,12 @@ class TTSService: # Potentially raise an exception or handle appropriately raise else: - print("ChatterboxTTS model already loaded.") + print("[Singleton] ChatterboxTTS model already loaded.") def unload_model(self): """Unloads the model and clears memory.""" if self.model is not None: - print("Unloading ChatterboxTTS model and clearing cache...") + print("[Singleton] Unloading ChatterboxTTS model and clearing cache...") del self.model self.model = None if self.device == "cuda": @@ -76,7 +88,9 @@ class TTSService: if hasattr(torch.mps, "empty_cache"): # Check if empty_cache is available for MPS torch.mps.empty_cache() gc.collect() # Explicitly run garbage collection - print("Model unloaded and memory cleared.") + print("[Singleton] Model unloaded and memory cleared.") + else: + print("[Singleton] Model was not loaded, nothing to unload.") async def generate_speech( self, @@ -94,10 +108,7 @@ class TTSService: Saves the output to a .wav file. """ if self.model is None: - self.load_model() - - if self.model is None: # Check again if loading failed - raise RuntimeError("TTS model is not loaded. Cannot generate speech.") + raise RuntimeError("TTS model is not loaded. Model should be loaded at application startup.") # Ensure speaker_sample_path is valid speaker_sample_p = Path(speaker_sample_path) @@ -130,10 +141,20 @@ class TTSService: # For now, we keep it loaded. Memory management might need refinement. pass +# Global singleton instance access +_global_tts_service = None + +def get_global_tts_service(device: str = "mps") -> TTSService: + """Get the global singleton TTS service instance.""" + global _global_tts_service + if _global_tts_service is None: + _global_tts_service = TTSService(device=device) + return _global_tts_service + # Example usage (for testing, not part of the service itself) if __name__ == "__main__": async def main_test(): - tts_service = TTSService(device="mps") + tts_service = get_global_tts_service(device="mps") try: tts_service.load_model() diff --git a/speaker_data/speakers.yaml b/speaker_data/speakers.yaml index 2c608f1..2eeff64 100644 --- a/speaker_data/speakers.yaml +++ b/speaker_data/speakers.yaml @@ -28,3 +28,15 @@ dd3552d9-f4e8-49ed-9892-f9e67afcf23c: 2cdd6d3d-c533-44bf-a5f6-cc83bd089d32: name: Grace sample_path: speaker_samples/2cdd6d3d-c533-44bf-a5f6-cc83bd089d32.wav +fdbfa71b-7647-4574-a1c0-31350348b434: + name: Elthea + sample_path: speaker_samples/fdbfa71b-7647-4574-a1c0-31350348b434.wav +44cfc6c1-78ec-4278-920a-8ad067cd1eba: + name: Eddie + sample_path: speaker_samples/44cfc6c1-78ec-4278-920a-8ad067cd1eba.wav +a25c52cc-ad56-46d2-9209-62fa7aebb150: + name: Charlotte + sample_path: speaker_samples/a25c52cc-ad56-46d2-9209-62fa7aebb150.wav +aeb43113-586c-4ab8-86e6-3b26737b9816: + name: Announcer1 + sample_path: speaker_samples/aeb43113-586c-4ab8-86e6-3b26737b9816.wav diff --git a/start_servers.py b/start_servers.py index cf908c7..bc8dbfe 100755 --- a/start_servers.py +++ b/start_servers.py @@ -1,4 +1,4 @@ -#!/Users/stwhite/CODE/chatterbox-ui/.venv/bin/python +#!/Volumes/SAM2/CODE/chatterbox-test/.venv/bin/python """ Startup script that launches both the backend and frontend servers concurrently. """