brunch
매거진 NCP AI

Lab 2 . Chat completion API v3

by Master Seo

API 호출 환경 설정

⚫ Post m an 설치 혹은 웹버전 접속 : https://www.postman.com/

◼ Method : P OST

◼ url : https://clovastudio.stream.ntruss.com/testapp/v3/chat-completions/HCX-005

⚫ H eade r s 탭 클릭

◼ Authorization : Bearer < 수강생 Key 정보 입력

◼ X NCP CLOVASTUDIO REQUEST ID : 수강생 Request id 입력

◼ Content Type : application /json

⚫ B ody 탭 클릭 > raw 선택 사진 설명


{

"messages": [

{

"role": "system",

"content": "- 친절하게 답변하는 AI 어시스턴트입니다."

},

{

"role": "user",

"content": [

{

"type": "text",

"text": "이 사진에 대해서 설명해줘"

},

{

"type": "image_url",

"imageUrl": { "url": "https://kr.object.ncloudstorage.com/material/test.png"

}

}

]


}

],

"maxTokens": 100

}




https://kr.object.ncloudstorage.com/material/25%EB%85%84%20%ED%8F%AC%ED%85%90%EB%8D%B0%EC%9D%B4/%EC%9D%B4%EB%AF%B8%EC%A7%80%ED%95%B4%EC%84%9D%EB%8D%B0%EB%AA%A8.mp4




3. V LM 관련 데모 사이트 구성 O bject S tor age 버킷 생성

⚫ Object Storage > 이용 신청 > + 버킷 생성 > 버킷 이름 입력 수강생이 원하는 이름 입력 후 다음 > 모든 설정

d efault 로 둔 뒤 생성


Bucket 이름 클릭 > 새폴더 생성

4. 실습 코드 다운로드 및 코드 수정



패키지 설치

pip install boto ==1.34.108



파일 오픈 후 설정 내용 수정 : Object Storage, CLOVA Studio key 설정



OBJECT_STORAGE_ACCESS_KEY = "ACCESS_KEY"

OBJECT_STORAGE_SECRET_KEY = "SECRET_KEY"

OBJECT_STORAGE_BUCKET = "BUCKET"

OBJECT_STORAGE_REGION = "kr"

OBJECT_STORAGE_ENDPOINT = "https://kr.object.ncloudstorage.com"

OBJECT_STORAGE_FOLDER = "FOLDER"

# Clova Studio

CLOVA_API_KEY = "Bearer API_KEY"

CLOVA_HOST = "clovastudio.stream.ntruss.com"



upload_to_object_storage : 로컬에 저장된 이미지를 네이버 클라우드 Object Storage에 업로드하고, 업로드된 이미지의 공개 URL을 반환

◼ boto3 라이브러리를 사용해 S3 호환 오브젝트 스토리지 연결

◼ upload_file() 로 이미지 업로드

◼ put_object_acl() 로 해당 객체를 공개 (Public Read) 설정

◼ 최종적으로 업로드된 이미지의 URL 을 반환



def upload_to_object_storage(file_path, object_name):

session = boto3.session.Session()

s3 = session.client(

service_name="s3",

region_name=OBJECT_STORAGE_REGION,

endpoint_url=OBJECT_STORAGE_ENDPOINT,

aws_access_k ey_id=OBJECT_STORAGE_ACCESS_KEY,

aws_secret_access_key=OBJECT_STORAGE_SECRET_KEY

# 'ExtraArgs' 제거하여 ACL 관련 권한 오류 방지

s3.upload_file(file_path, OBJECT_STORAGE_BUCKET, object_name)


# 2. 업로드 후 ACL 변경

s3.put_object_acl(Bucket=OBJ ECT_STORAGE_BUCKET, Key=object_name, ACL='public read')

return f"{OBJECT_STORAGE_ENDPOINT}/{OBJECT_STORAGE_BUCKET}/{quote_plus(object_name)}"




send_clova_multimodal_prompt 업로드된 이미지 URL 을 Clova Studio 멀티모달 API 에 전달하여 , 특정 시점

(viewer_ 의 시선으로 이미지를 해석

◼ viewer_type 에 따라 시점 예 : "7 살 어린이 을 설정하여 프롬프트 생성



def send_clova_multimodal_prompt(image_url, viewer_type):

headers = {

"Content Type": "application/json",

"Authorization": CLOVA_API_

"X NCP CLOVASTUDIO REQUEST ID": str(uuid.uu id4())

body = {

"messages":

"role": "

"content": 친절하게 답변하는 AI 어시스턴트입니다

"role": "

"content":

"type": "

"text": 이 사진을 {viewer_ 의 시선으로 해석해줘 .{viewer_ 의 특징이 잘

드러나도록 사진 내용을 간단하게 50 자 내외로 해석해줘

" "image_

"imageUrl":

"url": image_url

"maxTokens": 512

try:

conn = http.client. HTTPSConnection(CLOVA_HOST)

conn.request("POST", "/testapp/v3/chat completions/HCX 005", json.dumps(body), headers)

response = conn.getresponse()

NAVER CLOUD PLATFORM NCP-AI

print("print("응답응답 상태코드상태코드:", response.status):", response.status)

print("print("응답응답 사유사유:", response.reason):", response.reason)

response_body = response.read().decode("utfresponse_body = response.read().decode("utf--8")8")

print("print("본문본문:", response_body):", response_body)

conn.close()conn.close()

if response.status != 200:if response.status != 200:

return f"return f"❌❌ Clova API Clova API 오류오류: {response.status} {response.reason}: {response.status} {response.reason}\\n{response_body}"n{response_body}"

# JSON # JSON 파싱파싱

try:try:

result = json.loads(response_body)result = json.loads(response_body)

except json.JSONDecodeError:except json.JSONDecodeError:

return "return "❌❌ 응답응답 본문이본문이 JSON JSON 형식이형식이 아닙니다아닙니다."."

return result.get("result", {}).get("message", {}).get("content", "return result.get("result", {}).get("message", {}).get("content", "응답이응답이 없습니다없습니다.").")

except Exception as eexcept Exception as e::

return f"return f"❌❌ 예외예외 발생발생: {e}": {e}"




s

streamlit run main.py




keyword
매거진의 이전글(정식) Lab1. CLOVA Studio-2025