pilot.linkstec 0.0.17__py3-none-any.whl → 0.0.19__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pilot.linkstec might be problematic. Click here for more details.

@@ -14,8 +14,6 @@ class ConfigDTO:
14
14
  runsteps: list[str]
15
15
  multisteps: list[str]
16
16
 
17
-
18
-
19
17
  class ConfigReader:
20
18
  def __init__(self, filename = None):
21
19
  filepath = None
@@ -1,3 +1,4 @@
1
+ import re
1
2
  import threading
2
3
  from typing import Dict, Any, Optional
3
4
 
@@ -11,7 +12,13 @@ class VertexAISingleton:
11
12
  _tokenizer_cache = {}
12
13
  encoding = None
13
14
 
14
- def __new__(cls, model_name: str = "gemini-2.5-pro"):
15
+ SQL_SYSTEM_PROMPT_EN = (
16
+ "If there is any SQL-related processing \n"
17
+ "1. If there is an SQL statement like \"SELECT COUNT(X) INTO :COLUMN FROM TABLE_NAME;\" please recognize TABLE_NAME as a table."
18
+ )
19
+
20
+
21
+ def __new__(cls, model_name: str = "gemini-2.5-pro", system_prompt: Optional[str] = None):
15
22
  if cls._instance is None:
16
23
  with cls._lock:
17
24
  if cls._instance is None:
@@ -19,18 +26,38 @@ class VertexAISingleton:
19
26
  cls._instance._initialized = False
20
27
  return cls._instance
21
28
 
22
- def __init__(self, model_name: str = "gemini-2.5-pro"):
29
+ def __init__(self, model_name: str = "gemini-2.5-pro", system_prompt: Optional[str] = None):
23
30
  if not self._initialized:
24
31
  with self._lock:
25
32
  if not self._initialized:
26
33
  self.model = GenerativeModel(model_name)
27
34
  self.encoding = tiktoken.get_encoding("cl100k_base")
35
+ # system_promptにSQL_SYSTEM_PROMPT_ENを追加
36
+ if system_prompt:
37
+ self.system_prompt = f"{system_prompt.rstrip()}\n\n{self.SQL_SYSTEM_PROMPT_EN}"
38
+ else:
39
+ self.system_prompt = self.SQL_SYSTEM_PROMPT_EN
28
40
  self._initialized = True
41
+ else:
42
+ # 既存インスタンスでもsystem_promptを更新可能に
43
+ if system_prompt is not None:
44
+ self.system_prompt = f"{system_prompt.rstrip()}\n\n{self.SQL_SYSTEM_PROMPT_EN}" if system_prompt else self.SQL_SYSTEM_PROMPT_EN
29
45
 
30
46
  def generate_content(self, prompt: str) -> Dict[str, Any]:
31
47
  """複数スレッドから安全に呼び出し可能"""
32
48
  try:
33
- response = self.model.generate_content(prompt)
49
+ # システムプロンプトをconfigとして渡す
50
+ genai_config = None
51
+ if getattr(self, "system_prompt", None):
52
+ # Vertex AI SDK公式: config引数にsystem_instructionを指定
53
+ genai_config = {
54
+ "system_instruction": self.system_prompt
55
+ }
56
+ newprompt = self.exchange_prompt(prompt)
57
+ response = self.model.generate_content(
58
+ contents=newprompt, # 引数名を明示
59
+ generation_config=genai_config # 正しい名前で渡す
60
+ )
34
61
  return {
35
62
  "prompt": prompt,
36
63
  "response": self._remove_code_fence(response.text),
@@ -66,7 +93,62 @@ class VertexAISingleton:
66
93
  lines = lines[:-1]
67
94
  return "\n".join(lines)
68
95
 
96
+
97
+ def exchange_prompt(self, prompt: str) -> str:
98
+ # EXEC SQL ... END-EXEC. のSQL部分を抽出してフラット化
99
+ rtn_prompt = ""
100
+ rtn_prompt = self.fix_initialize(rtn_prompt)
101
+ rtn_prompt = self.extract_and_flatten_sql(rtn_prompt)
102
+ return rtn_prompt
103
+
104
+ def fix_initialize(self, text: str) -> str:
105
+ # SECTION ... EXIT. ブロック内のINITIALIZE文を処理
106
+ def process_section_block(match):
107
+ section_content = match.group(0)
108
+
109
+ # INITIALIZE の行を結合する(SECTION-EXIT間のみ)
110
+ # INITIALIZEで始まる行の次の行が空白+文字列の場合に結合
111
+ pattern_init = r'^(\s*INITIALIZE\s+[^\n]*)\n(\s+[^\n]+(?:\s+[^\n]+)*)'
112
+
113
+ def repl_init(m):
114
+ init_line = m.group(1).rstrip()
115
+ next_lines = m.group(2).strip()
116
+ return f'{init_line} {next_lines}'
117
+
118
+ section_content = re.sub(pattern_init, repl_init, section_content, flags=re.MULTILINE)
119
+
120
+ # ブロック内 COUNT(*) → COUNT(1) へ置換する
121
+ section_content = re.sub(r'COUNT\(\s*\*\s*\)', 'COUNT(1)', section_content, flags=re.IGNORECASE)
122
+
123
+ return section_content
124
+
125
+ # SECTION から EXIT. までのブロックを検索して処理
126
+ section_pattern = r'(\w+\s+SECTION\s*\..*?EXIT\s*\.)'
127
+ text = re.sub(section_pattern, process_section_block, text, flags=re.DOTALL | re.IGNORECASE)
128
+
129
+ return text
130
+
131
+
132
+ def extract_and_flatten_sql(self, code):
133
+ # EXEC SQL ... END-EXEC. にマッチ
134
+ pattern = r"EXEC SQL(.*?)END-EXEC\.?"
135
+
136
+ def repl(m):
137
+ # .*?でSQL部分取得
138
+ raw_sql = m.group(1)
139
+ # コメント(*以降)除去(複数行まとめてOK)
140
+ no_comment = re.sub(r"\*.*", "", raw_sql)
141
+ # 改行/連続スペースを単一スペースに
142
+ flattened = re.sub(r"\s+", " ", no_comment).strip()
143
+ # 置換内容
144
+ return f"EXEC SQL {flattened} END-EXEC."
145
+
146
+ # 全て置換
147
+ result = re.sub(pattern, repl, code, flags=re.DOTALL | re.IGNORECASE)
148
+ return result
149
+
150
+
69
151
  @classmethod
70
- def get_instance(cls, model_name: str = "gemini-2.5-pro") -> 'VertexAISingleton':
152
+ def get_instance(cls, model_name: str = "gemini-2.5-pro", system_prompt: Optional[str] = None) -> 'VertexAISingleton':
71
153
  """インスタンスを取得"""
72
- return cls(model_name)
154
+ return cls(model_name, system_prompt)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pilot.linkstec
3
- Version: 0.0.17
3
+ Version: 0.0.19
4
4
  Summary: pilot of the ship, a tool for managing and deploying Python projects.
5
5
  Author-email: wanglr <wanglr1980@gmail.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  pilot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  pilot/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- pilot/config/config_reader.py,sha256=zG_CFIgeTvrcXCtKmOgXC39625XFFIPGuw4u9lzkeEs,3754
3
+ pilot/config/config_reader.py,sha256=MchG-9j-Xfy8AquL_6tlvqQR65MFJ3c3hwWBl6IF2jw,3750
4
4
  pilot/control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  pilot/control/control_interface.py,sha256=zGv380oQgAKPAIHDHeFdPYzhj2Ngo2T66NWlNloA7vY,124
6
6
  pilot/control/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -9,7 +9,7 @@ pilot/conver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  pilot/conver/converfileEncodding.py,sha256=UqjcWO0bzkuTRHLEWrWJkeo3p-P7WuYE7jFKveyPekA,2781
10
10
  pilot/conver/nkf_converter.py,sha256=JqgThmXcdnTGMsLIHUEwe8sc0VGMqDaKCIQTg-UE3WE,1148
11
11
  pilot/generater/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- pilot/generater/vertexai.py,sha256=v-hEvPwsUtrxP57yu9f5pUBj7BGImegO4lv10QWM1XA,2591
12
+ pilot/generater/vertexai.py,sha256=6jYfYuNj5hLaYXtm5GQpTOfJwXhdgkhDbw-8fVW-_kU,6353
13
13
  pilot/job/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  pilot/job/job_interface.py,sha256=LL0hfuFfnKnkpQD99jv1hkaAIAFM-JJPrX3PFxN6O_A,120
15
15
  pilot/job/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -27,8 +27,8 @@ pilot/unit/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  pilot/unit/impl/base_unit.py,sha256=LsFPpL28aSNv5rsZhfKv6CWhAw1XR4n-A6FOn2RBrZo,1272
28
28
  pilot/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  pilot/util/files.py,sha256=v9uzfzo3Aq4xgnUIASEZeBJoA2nD9Qz_EA3P-FwzGFQ,1896
30
- pilot_linkstec-0.0.17.dist-info/licenses/LICENSE,sha256=6kbiFSfobTZ7beWiKnHpN902HgBx-Jzgcme0SvKqhKY,1091
31
- pilot_linkstec-0.0.17.dist-info/METADATA,sha256=I1C8EXOcmoJ4Pz2Hx-K_RSpzo94SpjUoXone8hbVkO0,679
32
- pilot_linkstec-0.0.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
33
- pilot_linkstec-0.0.17.dist-info/top_level.txt,sha256=BijnVJdXnIPxxx3s60M848seL4Z12gNUPod6KPJxK9c,6
34
- pilot_linkstec-0.0.17.dist-info/RECORD,,
30
+ pilot_linkstec-0.0.19.dist-info/licenses/LICENSE,sha256=6kbiFSfobTZ7beWiKnHpN902HgBx-Jzgcme0SvKqhKY,1091
31
+ pilot_linkstec-0.0.19.dist-info/METADATA,sha256=oAYLNwMjJVqZdT23O7QasoGgJC-SDRx71c6wId9FVr4,679
32
+ pilot_linkstec-0.0.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
33
+ pilot_linkstec-0.0.19.dist-info/top_level.txt,sha256=BijnVJdXnIPxxx3s60M848seL4Z12gNUPod6KPJxK9c,6
34
+ pilot_linkstec-0.0.19.dist-info/RECORD,,