Kims12 commited on
Commit
a302432
·
verified ·
1 Parent(s): c6da03e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -28
app.py CHANGED
@@ -68,7 +68,7 @@ def get_category_prompt(category):
68
  - 팔 없는 장애인 화가의 꿈을 이뤄준 첨단 그림 도구
69
  """
70
 
71
- # 기존의 동기적 호출 대신 비동기 API 호출
72
  async def call_api_async(session, content, system_message, max_tokens, temperature, top_p):
73
  url = "https://api.openai.com/v1/chat/completions"
74
  headers = {
@@ -86,10 +86,10 @@ async def call_api_async(session, content, system_message, max_tokens, temperatu
86
  "top_p": top_p,
87
  }
88
  async with session.post(url, headers=headers, json=payload) as response:
89
- result = await response.json()
90
- return result["choices"][0]["message"]["content"]
91
 
92
- # 여러 카테고리 대해 병렬 비기 호출 (두 항목을 동시에 시작)
93
  async def generate_copywriting_async(categories, topic):
94
  max_tokens = 1000
95
  temperature = 0.8
@@ -97,32 +97,34 @@ async def generate_copywriting_async(categories, topic):
97
  results = {}
98
 
99
  async with aiohttp.ClientSession() as session:
100
- # 카테고리별로 동시에 시작할 태스크 생성
101
- tasks = {}
 
 
102
  for category in categories:
103
  prompt = get_category_prompt(category)
104
  user_content = f"주제: {topic}"
105
- tasks[category] = asyncio.create_task(
 
106
  call_api_async(session, user_content, prompt, max_tokens, temperature, top_p)
107
  )
 
 
108
 
109
- # 모든 태스크가 동시에 시작되며, 먼저 끝난 스크부터 결과 반환
110
- for done_task in asyncio.as_completed(tasks.values()):
111
- finished_category = None
112
- for cat, t in tasks.items():
113
- if t == done_task:
114
- finished_category = cat
115
- break
116
-
117
  try:
118
- results[finished_category] = await done_task
 
119
  except Exception as e:
120
  results[finished_category] = f"에러 발생: {str(e)}"
121
-
122
- # 현재까지 완료된 결과를 yield
123
  yield results
124
 
125
- # Gradio 인터페이스 부분
126
  with gr.Blocks() as iface:
127
  gr.Markdown("# AI 카피라이팅 생성기")
128
 
@@ -138,32 +140,34 @@ with gr.Blocks() as iface:
138
  output_box = gr.Textbox(label=category, visible=True)
139
  output_boxes[category] = output_box
140
 
141
- # validate_and_generate 함수를 '비동기 + 스트리밍' 형태로 작성
142
  async def validate_and_generate(topic):
143
  if not topic:
 
144
  yield [gr.update(value="주제를 입력하세요")] + [gr.update(value="") for _ in CATEGORIES]
145
  return
146
 
147
  # 초기 상태
148
  yield [gr.update(value="카피라이팅 생성 중...")] + [gr.update(value="대기중...") for _ in CATEGORIES]
149
 
150
- # 비동기로 카테고리별 카피라이팅 생성
151
  async for partial_results in generate_copywriting_async(CATEGORIES, topic):
152
- updates = []
 
153
  for cat in CATEGORIES:
154
  if cat in partial_results:
155
- updates.append(gr.update(value=partial_results[cat]))
156
  else:
157
- updates.append(gr.update(value="대기중..."))
158
 
159
- # 진행상황(완료된 카테고리 수 / 전체 카테고리 수)
160
- yield [gr.update(value=f"진행상황: {len(partial_results)}/{len(CATEGORIES)} 카테고리 완료")] + updates
161
 
162
- # 버튼 클릭 -> validate_and_generate(��동기 + 스트리밍)
163
  generate_btn.click(
164
  fn=validate_and_generate,
165
  inputs=[topic],
166
- outputs=[status] + [output_boxes[category] for category in CATEGORIES],
167
  api_name="generate_copywriting",
168
  queue=True
169
  )
 
68
  - 팔 없는 장애인 화가의 꿈을 이뤄준 첨단 그림 도구
69
  """
70
 
71
+ # 비동기 API 호출 함수
72
  async def call_api_async(session, content, system_message, max_tokens, temperature, top_p):
73
  url = "https://api.openai.com/v1/chat/completions"
74
  headers = {
 
86
  "top_p": top_p,
87
  }
88
  async with session.post(url, headers=headers, json=payload) as response:
89
+ response_json = await response.json()
90
+ return response_json["choices"][0]["message"]["content"]
91
 
92
+ # 여러 카테고리 "동시에" 요청 보내기
93
  async def generate_copywriting_async(categories, topic):
94
  max_tokens = 1000
95
  temperature = 0.8
 
97
  results = {}
98
 
99
  async with aiohttp.ClientSession() as session:
100
+ # 카테고리별로 태스크 만들어 "동시에" 실행
101
+ tasks = []
102
+ cat_map = {}
103
+
104
  for category in categories:
105
  prompt = get_category_prompt(category)
106
  user_content = f"주제: {topic}"
107
+ # create_task를 통해 태스크 생성 후 배열에 담음
108
+ task = asyncio.create_task(
109
  call_api_async(session, user_content, prompt, max_tokens, temperature, top_p)
110
  )
111
+ tasks.append(task)
112
+ cat_map[task] = category
113
 
114
+ # 모든 태스크가 한꺼번에 시작 에서,
115
+ # 먼저 끝나는 태스크부터 결과를 얻어옴 (as_completed)
116
+ for done_task in asyncio.as_completed(tasks):
117
+ finished_category = cat_map[done_task]
 
 
 
 
118
  try:
119
+ result = await done_task
120
+ results[finished_category] = result
121
  except Exception as e:
122
  results[finished_category] = f"에러 발생: {str(e)}"
123
+
124
+ # 현재까지 완료된 카테고리 결과를 yield (부분완료 상태 반환)
125
  yield results
126
 
127
+ # Gradio 인터페이스
128
  with gr.Blocks() as iface:
129
  gr.Markdown("# AI 카피라이팅 생성기")
130
 
 
140
  output_box = gr.Textbox(label=category, visible=True)
141
  output_boxes[category] = output_box
142
 
143
+ # validate_and_generate: 비동기 + 스트리밍
144
  async def validate_and_generate(topic):
145
  if not topic:
146
+ # 주제가 비어있을 경우
147
  yield [gr.update(value="주제를 입력하세요")] + [gr.update(value="") for _ in CATEGORIES]
148
  return
149
 
150
  # 초기 상태
151
  yield [gr.update(value="카피라이팅 생성 중...")] + [gr.update(value="대기중...") for _ in CATEGORIES]
152
 
153
+ # 'generate_copywriting_async'에서 완료될 때마다 partial_results를 yield
154
  async for partial_results in generate_copywriting_async(CATEGORIES, topic):
155
+ # partial_results에는 지금까지 완료된 카테고리들의 결과가 담김
156
+ box_updates = []
157
  for cat in CATEGORIES:
158
  if cat in partial_results:
159
+ box_updates.append(gr.update(value=partial_results[cat]))
160
  else:
161
+ box_updates.append(gr.update(value="대기중..."))
162
 
163
+ # 진행상황 안내 (완료된 카테고리 수 / 전체)
164
+ yield [gr.update(value=f"진행상황: {len(partial_results)}/{len(CATEGORIES)} 카테고리 완료")] + box_updates
165
 
166
+ # 버튼 클릭 validate_and_generate 호출 (동기 + 스트리밍)
167
  generate_btn.click(
168
  fn=validate_and_generate,
169
  inputs=[topic],
170
+ outputs=[status] + [output_boxes[cat] for cat in CATEGORIES],
171
  api_name="generate_copywriting",
172
  queue=True
173
  )