forked from Rhizobium-gits/seq2pipe
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlaunch.sh
More file actions
executable file
·189 lines (173 loc) · 7.51 KB
/
launch.sh
File metadata and controls
executable file
·189 lines (173 loc) · 7.51 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/bin/bash
# ============================================================
# seq2pipe — 起動スクリプト
# ============================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# .env からモデル設定を読み込む
if [[ -f "$SCRIPT_DIR/.env" ]]; then
# shellcheck disable=SC1091
source "$SCRIPT_DIR/.env"
fi
export QIIME2_AI_MODEL="${QIIME2_AI_MODEL:-qwen2.5-coder:7b}"
# カラー
CYAN='\033[0;36m'; YELLOW='\033[1;33m'; RED='\033[0;31m'
GREEN='\033[0;32m'; RESET='\033[0m'; BOLD='\033[1m'
# ============================================================
# Ollama 起動確認・自動起動
# ============================================================
if ! curl -s http://localhost:11434/api/tags &>/dev/null; then
echo -e "${YELLOW}Ollama が起動していません。自動起動を試みます...${RESET}"
if command -v ollama &>/dev/null; then
# Linux: systemctl は timeout 付きで試みる(非 systemd 環境でのハング防止)
OS_INNER="$(uname -s)"
OLLAMA_BG_PID=""
# Linux: service マネージャーを試みるが exit code は信頼しない
if [[ "$OS_INNER" == "Linux" ]]; then
if command -v systemctl &>/dev/null; then
timeout 5 sudo systemctl start ollama 2>/dev/null || \
timeout 5 systemctl --user start ollama 2>/dev/null || true
fi
if command -v service &>/dev/null; then
timeout 5 service ollama start 2>/dev/null || true
fi
fi
# API が応答しない場合は必ず nohup で直接起動(service/systemctl の exit code 不問)
if ! curl -s http://localhost:11434/api/tags &>/dev/null; then
nohup ollama serve > /tmp/ollama.log 2>&1 &
OLLAMA_BG_PID=$!
echo -e "${CYAN}Ollama をバックグラウンドで起動しました (PID: $OLLAMA_BG_PID)${RESET}"
fi
# 起動待機(最大 120 秒)
for i in {1..120}; do
sleep 1
if curl -s http://localhost:11434/api/tags &>/dev/null; then
echo -e "${GREEN}✅ Ollama 起動確認(${i} 秒)${RESET}"
break
fi
if [[ -n "${OLLAMA_BG_PID:-}" ]] && ! kill -0 "$OLLAMA_BG_PID" 2>/dev/null; then
echo -e "${RED}❌ Ollama プロセスがクラッシュしました。${RESET}"
cat /tmp/ollama.log 2>/dev/null | tail -20
exit 1
fi
if [[ $i -eq 120 ]]; then
echo -e "${RED}❌ Ollama の起動に失敗しました(120 秒タイムアウト)。${RESET}"
echo " ログ: $(cat /tmp/ollama.log 2>/dev/null | tail -5)"
echo " 手動で 'ollama serve' を別ターミナルで実行してから再試行してください。"
exit 1
fi
if (( i % 10 == 0 )); then
echo " 待機中... ${i}/120 秒"
fi
done
else
echo -e "${RED}❌ Ollama がインストールされていません。${RESET}"
echo " 先に ./setup.sh を実行してください。"
exit 1
fi
fi
# ============================================================
# モデル確認
# ============================================================
MODELS=$(curl -s http://localhost:11434/api/tags | python3 -c \
"import json,sys; d=json.load(sys.stdin); print('\n'.join(m['name'] for m in d.get('models',[])))" \
2>/dev/null || echo "")
if [[ -z "$MODELS" ]]; then
echo -e "${YELLOW}⚠️ モデルがインストールされていません。${RESET}"
echo -e " 推奨: ${CYAN}ollama pull qwen2.5-coder:7b${RESET}"
echo ""
read -rp "今すぐ qwen2.5-coder:7b をダウンロードしますか? [y/N]: " DO_PULL
if [[ "$(echo "$DO_PULL" | tr "A-Z" "a-z")" == "y" ]]; then
ollama pull qwen2.5-coder:7b
else
exit 1
fi
fi
# ============================================================
# Docker 確認(警告のみ、必須ではない)
# ============================================================
OS="$(uname -s)"
if [[ "$OS" == "Darwin" ]]; then
DOCKER_CMD="/Applications/Docker.app/Contents/Resources/bin/docker"
[[ ! -f "$DOCKER_CMD" ]] && DOCKER_CMD="$(command -v docker || echo '')"
else
DOCKER_CMD="$(command -v docker || echo '')"
fi
if [[ -n "$DOCKER_CMD" ]] && command -v "$DOCKER_CMD" &>/dev/null; then
if ! "$DOCKER_CMD" info &>/dev/null 2>&1; then
echo -e "${YELLOW}Docker が起動していません。${RESET}"
echo " QIIME2 コマンドを実行する場合は Docker を起動してください。"
echo " (会話・スクリプト生成のみなら起動不要です)"
echo ""
fi
fi
# ============================================================
# エージェント起動
# ============================================================
echo -e "${CYAN}${BOLD}seq2pipe を起動しています...${RESET}"
echo -e "${CYAN} モデル: ${QIIME2_AI_MODEL}${RESET}"
echo ""
# QIIME2 conda Python を優先(qiime2 パッケージへのアクセスのため)
QIIME2_CONDA_BIN="${QIIME2_CONDA_BIN:-}"
if [[ -z "$QIIME2_CONDA_BIN" ]]; then
for _candidate in \
"$HOME/miniforge3/envs/qiime2/bin" \
"$HOME/miniconda3/envs/qiime2/bin" \
"$HOME/anaconda3/envs/qiime2/bin" \
"$HOME/mambaforge/envs/qiime2/bin"; do
if [[ -x "$_candidate/qiime" ]]; then
QIIME2_CONDA_BIN="$_candidate"
break
fi
done
# バージョン付き環境名(例: qiime2-2024.10)も検索
if [[ -z "$QIIME2_CONDA_BIN" ]]; then
for _base in "$HOME/miniforge3" "$HOME/miniconda3" "$HOME/anaconda3" "$HOME/mambaforge"; do
if [[ -d "$_base/envs" ]]; then
for _env in $(ls -r "$_base/envs/" 2>/dev/null); do
if [[ "$_env" == qiime2* && -x "$_base/envs/$_env/bin/qiime" ]]; then
QIIME2_CONDA_BIN="$_base/envs/$_env/bin"
break 2
fi
done
fi
done
fi
fi
export QIIME2_CONDA_BIN
# QIIME2 が見つからない場合は setup.sh を実行してインストール
if [[ -z "$QIIME2_CONDA_BIN" ]]; then
echo -e "${YELLOW}⚠️ QIIME2 conda 環境が見つかりません。セットアップを実行します...${RESET}"
echo ""
bash "$SCRIPT_DIR/setup.sh"
# setup.sh 後に再検出
for _candidate in \
"$HOME/miniforge3/envs/qiime2/bin" \
"$HOME/miniconda3/envs/qiime2/bin" \
"$HOME/anaconda3/envs/qiime2/bin" \
"$HOME/mambaforge/envs/qiime2/bin"; do
if [[ -x "$_candidate/qiime" ]]; then
QIIME2_CONDA_BIN="$_candidate"
break
fi
done
if [[ -z "$QIIME2_CONDA_BIN" ]]; then
for _base in "$HOME/miniforge3" "$HOME/miniconda3" "$HOME/anaconda3" "$HOME/mambaforge"; do
if [[ -d "$_base/envs" ]]; then
for _env in $(ls -r "$_base/envs/" 2>/dev/null); do
if [[ "$_env" == qiime2* && -x "$_base/envs/$_env/bin/qiime" ]]; then
QIIME2_CONDA_BIN="$_base/envs/$_env/bin"
break 2
fi
done
fi
done
fi
export QIIME2_CONDA_BIN
fi
if [[ -n "$QIIME2_CONDA_BIN" && -x "$QIIME2_CONDA_BIN/python3" ]]; then
PYTHON="$QIIME2_CONDA_BIN/python3"
else
PYTHON="python3"
fi
exec "$PYTHON" "$SCRIPT_DIR/cli.py" "$@"