3
File size: 2,975 Bytes
f469bad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import os
from typing import List, Dict, Any
from openai import OpenAI

class OpenAILLM:
    def __init__(self,model_chat:str = "gpt-4o",model_translate:str = "gpt-4o", model_summarize:str = "gpt-4o"):
        api_key = os.environ.get("OPENAI_API_KEY2")
        if not api_key:
            raise RuntimeError("OPENAI_API_KEY2 is not set in environment variables.")
        self.client = OpenAI(api_key=api_key)
        self.model_chat = model_chat
        self.model_translate = model_translate
        self.model_summarize = model_summarize

    def generate_ceo_message(self,meta, kpi:Dict[str,float],esg_row:List[Dict[str,Any]])->str:
        prompt = (
            "以下の企業情報・KPI・ESG指標をもとに、日本語で200字程度のCEOメッセージ草案を出力してください。"
            "投資家に伝わる簡潔なトーンで、過度な形容表現は避けてください。\n\n"
            f"企業情報: {meta.model_dump()}\n"
            f"KPI: {kpi}\n"
            f"ESG指標: {esg_row}\n"
        )
        rsp = self.client.chat.completions.create(
            model=self.model_chat,
            messages=[{"role": "user", "content": prompt}],
            temperature=0.3,
        )
        return rsp.choices[0].message.content.strip()

    def generate_risk_opportunity(self,meta,kpi:Dict[str,float],esg_row:List[Dict[str,Any]])->str:
        prompt = (
            "以下の情報から、日本語で200字程度のリスクと機会の草案を出力してください。"
            "定量/定性のバランスを取り、具体的な観点を1-2点挙げてください。\n\n"
            f"企業情報: {meta.model_dump()}\n"
            f"KPI: {kpi}\n"
            f"ESG: {esg_row}\n"
        )
        rsp = self.client.chat.completions.create(
            model=self.model_chat,
            messages=[{"role": "user", "content": prompt}],
            temperature=0.3,
        )
        return rsp.choices[0].message.content.strip()

    def translate_text(self, texts:List[str], target_language: str) -> List[str]:
        if not texts:
            return texts
        system=(
            "You are precise financial/ESG translator.Preserve numbers,units,and proper nouns."
            "Keep tone concise,suitable for investor reports."
        )
        SEP = "\n<<<SEP>>>\n"
        joined = SEP.join(texts)
        prompt = f"Translate the following content to {target_language}.Keep layout minimal.\n\n{joined}"
        rsp = self.client.chat.completions.create(
            model=self.model_translate,
            messages=[
                {"role": "user", "content": system},{"role": "user", "content": prompt}
            ],
            temperature=0.2,
        )
        out = rsp.choices[0].message.content
        parts = [p.strip() for p in out.split("<<<SEP>>>")]
        if len(parts) != len(texts):
            parts = [out]+texts[1:]
            parts = parts[:len(texts)]
        return parts