| import os |
| import asyncio |
| import streamlit as st |
| from openai import AsyncOpenAI |
|
|
| |
| api_key = os.environ.get("OPENAI_API_KEY") |
| if not api_key: |
| st.error("OpenAI API key not found. Please set the OPENAI_API_KEY environment variable.") |
| st.stop() |
|
|
| client = AsyncOpenAI(api_key=api_key) |
|
|
| async def generate_stream(prompt, model="gpt-4o", max_tokens=2048): |
| """ |
| 非同期ストリーミングを行い、 |
| レスポンスをチャンクごとに返すジェネレータ。 |
| """ |
| response = await client.chat.completions.create( |
| model=model, |
| messages=[{"role": "user", "content": prompt}], |
| max_tokens=max_tokens, |
| stream=True |
| ) |
| async for chunk in response: |
| |
| delta_obj = chunk.choices[0].delta |
| if hasattr(delta_obj, "content") and delta_obj.content: |
| yield delta_obj.content |
|
|
| async def generate_content(prompt, model="gpt-4o", max_tokens=2048): |
| """ |
| 全文を組み立てつつストリーミングで返す。 |
| """ |
| content = "" |
| placeholder = st.empty() |
| async for delta in generate_stream(prompt, model, max_tokens): |
| content += delta |
| placeholder.write(content) |
| return content |
|
|
| async def generate_context(summaries, system_prompt_prefix, system_prompt_suffix): |
| prompt = f"{system_prompt_prefix}\n\n{summaries}\n\n{system_prompt_suffix}" |
| st.subheader("Context Generation") |
| return await generate_content(prompt) |
|
|
| async def generate_script(context, heading, system_prompt_prefix, system_prompt_suffix): |
| prompt = f"{system_prompt_prefix}\n\n{context}\n\nHeading: {heading}\n\n{system_prompt_suffix}" |
| st.subheader(f"Script for: {heading}") |
| return await generate_content(prompt, max_tokens=4000) |
|
|
| def main(): |
| st.title("Script Generator (Streaming & Async)") |
|
|
| |
| context_system_prompt_prefix = st.text_input( |
| "Context Prompt Prefix:", |
| value="You are an AI assistant. Provide a concise context from the summary." |
| ) |
| summaries = st.text_area("Document Summary:", height=150) |
| context_system_prompt_suffix = st.text_input( |
| "Context Prompt Suffix:", |
| value="Focus on key points and present clearly." |
| ) |
|
|
| |
| outline = st.text_area("Content Outline (one heading per line):", height=150) |
| script_system_prompt_prefix = st.text_input( |
| "Script Prompt Prefix:", |
| value="You are an AI scriptwriter. Generate a detailed script." |
| ) |
| script_system_prompt_suffix = st.text_input( |
| "Script Prompt Suffix:", |
| value="Make it informative, engaging, >600 characters." |
| ) |
|
|
| if st.button("Generate (Streaming)"): |
| if not summaries or not outline: |
| st.error("Please enter both the summary and the outline.") |
| return |
|
|
| |
| context = asyncio.run(generate_context( |
| summaries, |
| context_system_prompt_prefix, |
| context_system_prompt_suffix |
| )) |
|
|
| if context: |
| st.markdown("**Generated Context:**") |
| st.write(context) |
|
|
| headings = [h.strip() for h in outline.split("\n") if h.strip()] |
| for heading in headings: |
| _ = asyncio.run(generate_script( |
| context, |
| heading, |
| script_system_prompt_prefix, |
| script_system_prompt_suffix |
| )) |
|
|
| if __name__ == "__main__": |
| main() |
|
|