ai-consultants 2.10.1
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.
- package/.claude/commands/ai-consultants:consult.md +94 -0
- package/.claude/commands/ai-consultants:debate.md +103 -0
- package/.claude/commands/ai-consultants:help.md +30 -0
- package/CLAUDE.md +839 -0
- package/LICENSE +21 -0
- package/README.md +758 -0
- package/SKILL.md +156 -0
- package/bin/ai-consultants +96 -0
- package/docs/COST_RATES.md +172 -0
- package/docs/JSON_SCHEMA.md +305 -0
- package/docs/SETUP.md +879 -0
- package/docs/SMART_ROUTING.md +219 -0
- package/docs/cost_rates.json +143 -0
- package/package.json +47 -0
- package/references/configuration.md +141 -0
- package/references/details.md +60 -0
- package/scripts/build_context.sh +562 -0
- package/scripts/classify_question.sh +148 -0
- package/scripts/config.sh +753 -0
- package/scripts/configure.sh +1093 -0
- package/scripts/consult_all.sh +934 -0
- package/scripts/debate_round.sh +421 -0
- package/scripts/doctor.sh +642 -0
- package/scripts/followup.sh +197 -0
- package/scripts/install.sh +319 -0
- package/scripts/lib/api.sh +640 -0
- package/scripts/lib/api_query.sh +228 -0
- package/scripts/lib/cache.sh +338 -0
- package/scripts/lib/chunking.sh +880 -0
- package/scripts/lib/code_optimizer.sh +671 -0
- package/scripts/lib/common.sh +1088 -0
- package/scripts/lib/costs.sh +674 -0
- package/scripts/lib/personas.sh +372 -0
- package/scripts/lib/progress.sh +251 -0
- package/scripts/lib/reflection.sh +447 -0
- package/scripts/lib/routing.sh +566 -0
- package/scripts/lib/schema.json +165 -0
- package/scripts/lib/session.sh +327 -0
- package/scripts/lib/symbol_map.sh +445 -0
- package/scripts/lib/voting.sh +495 -0
- package/scripts/peer_review.sh +460 -0
- package/scripts/preflight_check.sh +452 -0
- package/scripts/query_aider.sh +83 -0
- package/scripts/query_amp.sh +67 -0
- package/scripts/query_claude.sh +99 -0
- package/scripts/query_codex.sh +92 -0
- package/scripts/query_cursor.sh +72 -0
- package/scripts/query_deepseek.sh +17 -0
- package/scripts/query_gemini.sh +85 -0
- package/scripts/query_glm.sh +17 -0
- package/scripts/query_grok.sh +17 -0
- package/scripts/query_kilo.sh +140 -0
- package/scripts/query_kimi.sh +67 -0
- package/scripts/query_minimax.sh +17 -0
- package/scripts/query_mistral.sh +97 -0
- package/scripts/query_ollama.sh +328 -0
- package/scripts/query_qwen3.sh +93 -0
- package/scripts/setup_wizard.sh +367 -0
- package/scripts/skillport-install.sh +196 -0
- package/scripts/synthesize.sh +332 -0
- package/templates/consultation_report.md +323 -0
- package/templates/synthesis_prompt.md +120 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# query_claude.sh - Query Claude CLI or API
|
|
3
|
+
#
|
|
4
|
+
# Usage: ./query_claude.sh "question" [context_file] [output_file]
|
|
5
|
+
#
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# CLAUDE_MODEL - Model to use (default: opus-4.6)
|
|
8
|
+
# CLAUDE_TIMEOUT - Timeout in seconds (default: 240)
|
|
9
|
+
# CLAUDE_USE_API - Use API mode instead of CLI (default: false)
|
|
10
|
+
# ANTHROPIC_API_KEY - API key for API mode
|
|
11
|
+
# ENABLE_PERSONA - Enable "The Synthesizer" persona (default: true)
|
|
12
|
+
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
16
|
+
source "$SCRIPT_DIR/lib/common.sh"
|
|
17
|
+
source "$SCRIPT_DIR/lib/personas.sh"
|
|
18
|
+
|
|
19
|
+
# --- Parameters ---
|
|
20
|
+
QUERY="${1:-}"
|
|
21
|
+
CONTEXT_FILE="${2:-}"
|
|
22
|
+
OUTPUT_FILE="${3:-/tmp/claude_response.json}"
|
|
23
|
+
|
|
24
|
+
# --- Configuration ---
|
|
25
|
+
ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
|
|
26
|
+
CONSULTANT_NAME="Claude"
|
|
27
|
+
CLAUDE_CMD="${CLAUDE_CMD:-claude}"
|
|
28
|
+
MODEL_USED="${CLAUDE_MODEL:-opus-4.6}"
|
|
29
|
+
|
|
30
|
+
# --- Build query ---
|
|
31
|
+
FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
|
|
32
|
+
validate_query "$FULL_QUERY" "Claude" || exit 1
|
|
33
|
+
|
|
34
|
+
# --- Add persona if enabled ---
|
|
35
|
+
if [[ "$ENABLE_PERSONA" == "true" ]]; then
|
|
36
|
+
FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# --- Timestamp for metadata ---
|
|
40
|
+
START_TIME=$(get_timestamp_ms)
|
|
41
|
+
|
|
42
|
+
# --- Execution (CLI or API mode) ---
|
|
43
|
+
TEMP_OUTPUT=$(mktemp)
|
|
44
|
+
|
|
45
|
+
if is_api_mode "claude"; then
|
|
46
|
+
# --- API Mode ---
|
|
47
|
+
log_api_mode_status "claude"
|
|
48
|
+
validate_api_mode "claude" || exit 1
|
|
49
|
+
|
|
50
|
+
source "$SCRIPT_DIR/lib/api_query.sh"
|
|
51
|
+
|
|
52
|
+
run_api_mode_query \
|
|
53
|
+
"$CONSULTANT_NAME" \
|
|
54
|
+
"$MODEL_USED" \
|
|
55
|
+
"$FULL_QUERY" \
|
|
56
|
+
"$TEMP_OUTPUT" \
|
|
57
|
+
"$CLAUDE_TIMEOUT_SECONDS"
|
|
58
|
+
|
|
59
|
+
exit_code=$?
|
|
60
|
+
else
|
|
61
|
+
# --- CLI Mode ---
|
|
62
|
+
log_api_mode_status "claude"
|
|
63
|
+
check_command "$CLAUDE_CMD" "Claude CLI" "Visit https://docs.anthropic.com/en/docs/claude-code" || exit 1
|
|
64
|
+
|
|
65
|
+
# Claude CLI uses --print for non-interactive mode
|
|
66
|
+
echo "$FULL_QUERY" | run_query \
|
|
67
|
+
"Claude" \
|
|
68
|
+
"$TEMP_OUTPUT" \
|
|
69
|
+
"$CLAUDE_TIMEOUT_SECONDS" \
|
|
70
|
+
"$CLAUDE_CMD" --print --model "$MODEL_USED"
|
|
71
|
+
|
|
72
|
+
exit_code=$?
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
# --- Calculate latency ---
|
|
76
|
+
END_TIME=$(get_timestamp_ms)
|
|
77
|
+
LATENCY_MS=$((END_TIME - START_TIME))
|
|
78
|
+
|
|
79
|
+
# --- Configuration for response building ---
|
|
80
|
+
PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
|
|
81
|
+
|
|
82
|
+
# --- Post-processing: wrap in full schema using shared helpers ---
|
|
83
|
+
if [[ $exit_code -eq 0 && -f "$TEMP_OUTPUT" && -s "$TEMP_OUTPUT" ]]; then
|
|
84
|
+
RAW_RESPONSE=$(cat "$TEMP_OUTPUT")
|
|
85
|
+
rm -f "$TEMP_OUTPUT"
|
|
86
|
+
|
|
87
|
+
# Try to parse as structured JSON
|
|
88
|
+
if echo "$RAW_RESPONSE" | jq -e '.response.summary' > /dev/null 2>&1; then
|
|
89
|
+
build_structured_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" "$RAW_RESPONSE" "$LATENCY_MS" > "$OUTPUT_FILE"
|
|
90
|
+
else
|
|
91
|
+
build_fallback_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" "$RAW_RESPONSE" "$LATENCY_MS" > "$OUTPUT_FILE"
|
|
92
|
+
fi
|
|
93
|
+
else
|
|
94
|
+
rm -f "$TEMP_OUTPUT"
|
|
95
|
+
build_error_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" "Query failed with exit code $exit_code" "$LATENCY_MS" > "$OUTPUT_FILE"
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
cat "$OUTPUT_FILE"
|
|
99
|
+
exit $exit_code
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# query_codex.sh - Query OpenAI Codex CLI or API (v2.6 with API mode support)
|
|
3
|
+
#
|
|
4
|
+
# Usage: ./query_codex.sh "question" [context_file] [output_file]
|
|
5
|
+
#
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# CODEX_MODEL - Model to use (default: gpt-5.3-codex)
|
|
8
|
+
# CODEX_TIMEOUT - Timeout in seconds (default: 180)
|
|
9
|
+
# CODEX_USE_API - Use API mode instead of CLI (default: false)
|
|
10
|
+
# OPENAI_API_KEY - API key for API mode
|
|
11
|
+
# ENABLE_PERSONA - Enable "The Pragmatist" persona (default: true)
|
|
12
|
+
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
16
|
+
source "$SCRIPT_DIR/lib/common.sh"
|
|
17
|
+
source "$SCRIPT_DIR/lib/personas.sh"
|
|
18
|
+
|
|
19
|
+
# --- Parameters ---
|
|
20
|
+
QUERY="${1:-}"
|
|
21
|
+
CONTEXT_FILE="${2:-}"
|
|
22
|
+
OUTPUT_FILE="${3:-/tmp/codex_response.json}"
|
|
23
|
+
|
|
24
|
+
# --- Configuration ---
|
|
25
|
+
ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
|
|
26
|
+
CONSULTANT_NAME="Codex"
|
|
27
|
+
|
|
28
|
+
# --- Build query ---
|
|
29
|
+
FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
|
|
30
|
+
validate_query "$FULL_QUERY" "Codex" || exit 1
|
|
31
|
+
|
|
32
|
+
# --- Add persona if enabled ---
|
|
33
|
+
if [[ "$ENABLE_PERSONA" == "true" ]]; then
|
|
34
|
+
FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# --- Timestamp for metadata ---
|
|
38
|
+
START_TIME=$(get_timestamp_ms)
|
|
39
|
+
|
|
40
|
+
# --- Execution (CLI or API mode) ---
|
|
41
|
+
TEMP_OUTPUT=$(mktemp)
|
|
42
|
+
|
|
43
|
+
if is_api_mode "codex"; then
|
|
44
|
+
# --- API Mode ---
|
|
45
|
+
log_api_mode_status "codex"
|
|
46
|
+
validate_api_mode "codex" || exit 1
|
|
47
|
+
|
|
48
|
+
source "$SCRIPT_DIR/lib/api_query.sh"
|
|
49
|
+
|
|
50
|
+
run_api_mode_query \
|
|
51
|
+
"$CONSULTANT_NAME" \
|
|
52
|
+
"$CODEX_MODEL" \
|
|
53
|
+
"$FULL_QUERY" \
|
|
54
|
+
"$TEMP_OUTPUT" \
|
|
55
|
+
"$CODEX_TIMEOUT_SECONDS"
|
|
56
|
+
|
|
57
|
+
exit_code=$?
|
|
58
|
+
else
|
|
59
|
+
# --- CLI Mode ---
|
|
60
|
+
log_api_mode_status "codex"
|
|
61
|
+
check_command "$CODEX_CMD" "Codex CLI" "npm install -g @openai/codex" || exit 1
|
|
62
|
+
|
|
63
|
+
# Build command
|
|
64
|
+
CMD_ARGS=("$CODEX_CMD" "exec" "--skip-git-repo-check")
|
|
65
|
+
if [[ -n "$CODEX_MODEL" ]]; then
|
|
66
|
+
CMD_ARGS+=("-m" "$CODEX_MODEL")
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
# Codex uses query as the last argument, not from stdin
|
|
70
|
+
run_query \
|
|
71
|
+
"Codex" \
|
|
72
|
+
"$TEMP_OUTPUT" \
|
|
73
|
+
"$CODEX_TIMEOUT_SECONDS" \
|
|
74
|
+
"${CMD_ARGS[@]}" "$FULL_QUERY" < /dev/null
|
|
75
|
+
|
|
76
|
+
exit_code=$?
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# --- Calculate latency ---
|
|
80
|
+
END_TIME=$(get_timestamp_ms)
|
|
81
|
+
LATENCY_MS=$((END_TIME - START_TIME))
|
|
82
|
+
|
|
83
|
+
# --- Configuration for response building ---
|
|
84
|
+
MODEL_USED="${CODEX_MODEL:-gpt-5.3-codex}"
|
|
85
|
+
PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
|
|
86
|
+
|
|
87
|
+
# --- Post-processing: use shared helper ---
|
|
88
|
+
process_consultant_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
|
|
89
|
+
"$TEMP_OUTPUT" "$OUTPUT_FILE" "$exit_code" "$LATENCY_MS"
|
|
90
|
+
|
|
91
|
+
cat "$OUTPUT_FILE"
|
|
92
|
+
exit $exit_code
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# query_cursor.sh - Query Cursor CLI
|
|
3
|
+
#
|
|
4
|
+
# Usage: ./query_cursor.sh "question" [context_file] [output_file]
|
|
5
|
+
#
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# CURSOR_MODEL - Model to use (default: uses Cursor's default)
|
|
8
|
+
# CURSOR_TIMEOUT - Timeout in seconds (default: 180)
|
|
9
|
+
# ENABLE_PERSONA - Enable "The Integrator" persona (default: true)
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
source "$SCRIPT_DIR/lib/common.sh"
|
|
15
|
+
source "$SCRIPT_DIR/lib/personas.sh"
|
|
16
|
+
|
|
17
|
+
# --- Parameters ---
|
|
18
|
+
QUERY="${1:-}"
|
|
19
|
+
CONTEXT_FILE="${2:-}"
|
|
20
|
+
OUTPUT_FILE="${3:-/tmp/cursor_response.json}"
|
|
21
|
+
|
|
22
|
+
# --- Configuration ---
|
|
23
|
+
ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
|
|
24
|
+
CONSULTANT_NAME="Cursor"
|
|
25
|
+
MODEL_USED="${CURSOR_MODEL:-cursor}"
|
|
26
|
+
|
|
27
|
+
# --- Check prerequisites ---
|
|
28
|
+
check_command "$CURSOR_CMD" "Cursor CLI" "curl https://cursor.com/install -fsS | bash" || exit 1
|
|
29
|
+
|
|
30
|
+
# --- Build query ---
|
|
31
|
+
FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
|
|
32
|
+
validate_query "$FULL_QUERY" "Cursor" || exit 1
|
|
33
|
+
|
|
34
|
+
# --- Add persona if enabled ---
|
|
35
|
+
if [[ "$ENABLE_PERSONA" == "true" ]]; then
|
|
36
|
+
FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# --- Timestamp for metadata ---
|
|
40
|
+
START_TIME=$(get_timestamp_ms)
|
|
41
|
+
|
|
42
|
+
# --- Execution ---
|
|
43
|
+
TEMP_OUTPUT=$(mktemp)
|
|
44
|
+
trap 'rm -f "$TEMP_OUTPUT"' EXIT
|
|
45
|
+
|
|
46
|
+
# Build command args with optional model
|
|
47
|
+
# -p = print mode, -f = force-allow / trust workspace (prevents interactive prompt)
|
|
48
|
+
CMD_ARGS=("$CURSOR_CMD" "-p" "-f" "--output-format" "text")
|
|
49
|
+
if [[ -n "${CURSOR_MODEL:-}" ]]; then
|
|
50
|
+
CMD_ARGS+=("--model" "$CURSOR_MODEL")
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
run_query \
|
|
54
|
+
"Cursor" \
|
|
55
|
+
"$TEMP_OUTPUT" \
|
|
56
|
+
"$CURSOR_TIMEOUT_SECONDS" \
|
|
57
|
+
"${CMD_ARGS[@]}" "$FULL_QUERY" < /dev/null
|
|
58
|
+
|
|
59
|
+
exit_code=$?
|
|
60
|
+
|
|
61
|
+
# --- Calculate latency ---
|
|
62
|
+
END_TIME=$(get_timestamp_ms)
|
|
63
|
+
LATENCY_MS=$((END_TIME - START_TIME))
|
|
64
|
+
|
|
65
|
+
# --- Post-processing: use shared helper ---
|
|
66
|
+
PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
|
|
67
|
+
|
|
68
|
+
process_consultant_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
|
|
69
|
+
"$TEMP_OUTPUT" "$OUTPUT_FILE" "$exit_code" "$LATENCY_MS"
|
|
70
|
+
|
|
71
|
+
cat "$OUTPUT_FILE"
|
|
72
|
+
exit $exit_code
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# query_deepseek.sh - Query DeepSeek via HTTP API
|
|
3
|
+
#
|
|
4
|
+
# Usage: ./query_deepseek.sh "question" [context_file] [output_file]
|
|
5
|
+
#
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# DEEPSEEK_API_KEY - API key for DeepSeek (required)
|
|
8
|
+
# DEEPSEEK_MODEL - Model to use (default: deepseek-reasoner)
|
|
9
|
+
# DEEPSEEK_TIMEOUT - Timeout in seconds (default: 180)
|
|
10
|
+
# ENABLE_PERSONA - Enable "The Code Specialist" persona (default: true)
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
|
+
source "$SCRIPT_DIR/lib/api_query.sh"
|
|
16
|
+
|
|
17
|
+
run_api_consultant "DeepSeek" "$@"
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# query_gemini.sh - Query Google Gemini CLI or API (v2.6 with API mode support)
|
|
3
|
+
#
|
|
4
|
+
# Usage: ./query_gemini.sh "question" [context_file] [output_file]
|
|
5
|
+
#
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# GEMINI_MODEL - Model to use (default: gemini-3.1-pro-preview)
|
|
8
|
+
# GEMINI_TIMEOUT - Timeout in seconds (default: 180)
|
|
9
|
+
# GEMINI_USE_API - Use API mode instead of CLI (default: false)
|
|
10
|
+
# GEMINI_API_KEY - API key for API mode
|
|
11
|
+
# ENABLE_PERSONA - Enable "The Architect" persona (default: true)
|
|
12
|
+
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
16
|
+
source "$SCRIPT_DIR/lib/common.sh"
|
|
17
|
+
source "$SCRIPT_DIR/lib/personas.sh"
|
|
18
|
+
|
|
19
|
+
# --- Parameters ---
|
|
20
|
+
QUERY="${1:-}"
|
|
21
|
+
CONTEXT_FILE="${2:-}"
|
|
22
|
+
OUTPUT_FILE="${3:-/tmp/gemini_response.json}"
|
|
23
|
+
|
|
24
|
+
# --- Configuration ---
|
|
25
|
+
ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
|
|
26
|
+
CONSULTANT_NAME="Gemini"
|
|
27
|
+
|
|
28
|
+
# --- Build query ---
|
|
29
|
+
FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
|
|
30
|
+
validate_query "$FULL_QUERY" "Gemini" || exit 1
|
|
31
|
+
|
|
32
|
+
# --- Add persona if enabled ---
|
|
33
|
+
if [[ "$ENABLE_PERSONA" == "true" ]]; then
|
|
34
|
+
FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# --- Timestamp for metadata ---
|
|
38
|
+
START_TIME=$(get_timestamp_ms)
|
|
39
|
+
|
|
40
|
+
# --- Execution (CLI or API mode) ---
|
|
41
|
+
TEMP_OUTPUT=$(mktemp)
|
|
42
|
+
|
|
43
|
+
if is_api_mode "gemini"; then
|
|
44
|
+
# --- API Mode ---
|
|
45
|
+
log_api_mode_status "gemini"
|
|
46
|
+
validate_api_mode "gemini" || exit 1
|
|
47
|
+
|
|
48
|
+
source "$SCRIPT_DIR/lib/api_query.sh"
|
|
49
|
+
|
|
50
|
+
run_api_mode_query \
|
|
51
|
+
"$CONSULTANT_NAME" \
|
|
52
|
+
"$GEMINI_MODEL" \
|
|
53
|
+
"$FULL_QUERY" \
|
|
54
|
+
"$TEMP_OUTPUT" \
|
|
55
|
+
"$GEMINI_TIMEOUT_SECONDS"
|
|
56
|
+
|
|
57
|
+
exit_code=$?
|
|
58
|
+
else
|
|
59
|
+
# --- CLI Mode ---
|
|
60
|
+
log_api_mode_status "gemini"
|
|
61
|
+
check_command "$GEMINI_CMD" "Gemini CLI" "npm install -g @google/gemini-cli" || exit 1
|
|
62
|
+
|
|
63
|
+
echo "$FULL_QUERY" | run_query \
|
|
64
|
+
"Gemini" \
|
|
65
|
+
"$TEMP_OUTPUT" \
|
|
66
|
+
"$GEMINI_TIMEOUT_SECONDS" \
|
|
67
|
+
"$GEMINI_CMD" -p - -m "$GEMINI_MODEL" --output-format json
|
|
68
|
+
|
|
69
|
+
exit_code=$?
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
# --- Calculate latency ---
|
|
73
|
+
END_TIME=$(get_timestamp_ms)
|
|
74
|
+
LATENCY_MS=$((END_TIME - START_TIME))
|
|
75
|
+
|
|
76
|
+
# --- Configuration for response building ---
|
|
77
|
+
MODEL_USED="$GEMINI_MODEL"
|
|
78
|
+
PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
|
|
79
|
+
|
|
80
|
+
# --- Post-processing: use shared helper ---
|
|
81
|
+
process_consultant_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
|
|
82
|
+
"$TEMP_OUTPUT" "$OUTPUT_FILE" "$exit_code" "$LATENCY_MS" "response"
|
|
83
|
+
|
|
84
|
+
cat "$OUTPUT_FILE"
|
|
85
|
+
exit $exit_code
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# query_glm.sh - Query GLM (Zhipu AI) via HTTP API (v2.0 with Persona and Confidence)
|
|
3
|
+
#
|
|
4
|
+
# Usage: ./query_glm.sh "question" [context_file] [output_file]
|
|
5
|
+
#
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# GLM_API_KEY - API key for Zhipu AI (required)
|
|
8
|
+
# GLM_MODEL - Model to use (default: glm-4)
|
|
9
|
+
# GLM_TIMEOUT - Timeout in seconds (default: 180)
|
|
10
|
+
# ENABLE_PERSONA - Enable "The Methodologist" persona (default: true)
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
|
+
source "$SCRIPT_DIR/lib/api_query.sh"
|
|
16
|
+
|
|
17
|
+
run_api_consultant "GLM" "$@"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# query_grok.sh - Query Grok (xAI) via HTTP API (v2.0 with Persona and Confidence)
|
|
3
|
+
#
|
|
4
|
+
# Usage: ./query_grok.sh "question" [context_file] [output_file]
|
|
5
|
+
#
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# GROK_API_KEY - API key for xAI (required)
|
|
8
|
+
# GROK_MODEL - Model to use (default: grok-4-1-fast-reasoning)
|
|
9
|
+
# GROK_TIMEOUT - Timeout in seconds (default: 180)
|
|
10
|
+
# ENABLE_PERSONA - Enable "The Provocateur" persona (default: true)
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
|
+
source "$SCRIPT_DIR/lib/api_query.sh"
|
|
16
|
+
|
|
17
|
+
run_api_consultant "Grok" "$@"
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# query_kilo.sh - Query Kilo Code CLI
|
|
3
|
+
#
|
|
4
|
+
# Usage: ./query_kilo.sh "question" [context_file] [output_file]
|
|
5
|
+
#
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# KILO_MODEL - Model to use (default: uses Kilo's internal provider)
|
|
8
|
+
# KILO_TIMEOUT - Timeout in seconds (default: 180)
|
|
9
|
+
# ENABLE_PERSONA - Enable "The Innovator" persona (default: true)
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
source "$SCRIPT_DIR/lib/common.sh"
|
|
15
|
+
source "$SCRIPT_DIR/lib/personas.sh"
|
|
16
|
+
|
|
17
|
+
# --- Parameters ---
|
|
18
|
+
QUERY="${1:-}"
|
|
19
|
+
CONTEXT_FILE="${2:-}"
|
|
20
|
+
OUTPUT_FILE="${3:-/tmp/kilo_response.json}"
|
|
21
|
+
|
|
22
|
+
# --- Configuration ---
|
|
23
|
+
ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
|
|
24
|
+
CONSULTANT_NAME="Kilo"
|
|
25
|
+
MODEL_USED="${KILO_MODEL:-kilo}"
|
|
26
|
+
|
|
27
|
+
# --- Check prerequisites ---
|
|
28
|
+
check_command "$KILO_CMD" "Kilo Code CLI" "npm install -g @kilocode/cli" || exit 1
|
|
29
|
+
|
|
30
|
+
# --- Build query ---
|
|
31
|
+
FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
|
|
32
|
+
validate_query "$FULL_QUERY" "Kilo Code" || exit 1
|
|
33
|
+
|
|
34
|
+
# --- Add persona if enabled ---
|
|
35
|
+
if [[ "$ENABLE_PERSONA" == "true" ]]; then
|
|
36
|
+
FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# --- Timestamp for metadata ---
|
|
40
|
+
START_TIME=$(get_timestamp_ms)
|
|
41
|
+
|
|
42
|
+
# --- Execution ---
|
|
43
|
+
TEMP_OUTPUT=$(mktemp)
|
|
44
|
+
TEMP_RAW=$(mktemp)
|
|
45
|
+
trap 'rm -f "$TEMP_OUTPUT" "$TEMP_RAW"' EXIT
|
|
46
|
+
|
|
47
|
+
# Build command args: run subcommand + --auto + --dir /tmp (prevent SKILL.md loading)
|
|
48
|
+
KILO_ARGS=("$KILO_CMD" "run" "--auto" "--dir" "/tmp")
|
|
49
|
+
if [[ -n "${KILO_MODEL:-}" && "${KILO_MODEL}" != "auto" ]]; then
|
|
50
|
+
KILO_ARGS+=("--model" "$KILO_MODEL")
|
|
51
|
+
fi
|
|
52
|
+
KILO_ARGS+=("$FULL_QUERY")
|
|
53
|
+
|
|
54
|
+
# Use run_with_timeout for cross-platform support (Linux/macOS/POSIX)
|
|
55
|
+
log_info "Consulting Kilo Code (timeout: ${KILO_TIMEOUT_SECONDS}s)..."
|
|
56
|
+
|
|
57
|
+
if run_with_timeout "$KILO_TIMEOUT_SECONDS" "${KILO_ARGS[@]}" > "$TEMP_RAW" 2>&1; then
|
|
58
|
+
exit_code=0
|
|
59
|
+
else
|
|
60
|
+
exit_code=$?
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
# --- Strip ANSI escape codes from Kilo's text output ---
|
|
64
|
+
if [[ -f "$TEMP_RAW" && -s "$TEMP_RAW" ]]; then
|
|
65
|
+
# Kilo outputs plain text with ANSI codes; strip them for clean output
|
|
66
|
+
CONTENT=$(LC_ALL=C sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' "$TEMP_RAW" | sed '/^$/d') || true
|
|
67
|
+
|
|
68
|
+
if [[ -n "${CONTENT:-}" ]]; then
|
|
69
|
+
exit_code=0
|
|
70
|
+
log_success "[Kilo Code] Response received (${#CONTENT} chars)"
|
|
71
|
+
else
|
|
72
|
+
log_error "[Kilo Code] Could not extract response"
|
|
73
|
+
exit_code=1
|
|
74
|
+
fi
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
# --- Calculate latency ---
|
|
78
|
+
END_TIME=$(get_timestamp_ms)
|
|
79
|
+
LATENCY_MS=$((END_TIME - START_TIME))
|
|
80
|
+
|
|
81
|
+
# --- Post-processing: extract structure from markdown output ---
|
|
82
|
+
PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
|
|
83
|
+
|
|
84
|
+
if [[ $exit_code -eq 0 && -n "${CONTENT:-}" ]]; then
|
|
85
|
+
# Check if Kilo returned valid JSON (unlikely but handle it)
|
|
86
|
+
if echo "$CONTENT" | jq -e '.response.summary' > /dev/null 2>&1; then
|
|
87
|
+
echo "$CONTENT" > "$TEMP_OUTPUT"
|
|
88
|
+
process_consultant_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
|
|
89
|
+
"$TEMP_OUTPUT" "$OUTPUT_FILE" "$exit_code" "$LATENCY_MS"
|
|
90
|
+
else
|
|
91
|
+
# Extract structured fields from markdown/text output
|
|
92
|
+
# Summary: first meaningful line(s), up to 200 chars
|
|
93
|
+
local_summary=$(echo "$CONTENT" | head -5 | tr '\n' ' ' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | head -c 200)
|
|
94
|
+
|
|
95
|
+
# Approach: look for headings or key phrases
|
|
96
|
+
local_approach=$(echo "$CONTENT" | grep -iE '^#+\s|^approach:|^recommendation:|^solution:' | head -1 | \
|
|
97
|
+
sed 's/^[#[:space:]]*//;s/^[Aa]pproach:[[:space:]]*//' | head -c 100)
|
|
98
|
+
[[ -z "$local_approach" ]] && local_approach=$(echo "$local_summary" | head -c 60)
|
|
99
|
+
|
|
100
|
+
# Confidence: estimate from language strength
|
|
101
|
+
local_confidence=6
|
|
102
|
+
if echo "$CONTENT" | grep -qiE 'highly recommend|strongly suggest|definitely|clearly the best'; then
|
|
103
|
+
local_confidence=8
|
|
104
|
+
elif echo "$CONTENT" | grep -qiE 'recommend|suggest|good approach|effective|solid'; then
|
|
105
|
+
local_confidence=7
|
|
106
|
+
elif echo "$CONTENT" | grep -qiE 'might|could|possibly|one option|uncertain|depends'; then
|
|
107
|
+
local_confidence=5
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
jq -n \
|
|
111
|
+
--arg consultant "$CONSULTANT_NAME" \
|
|
112
|
+
--arg model "$MODEL_USED" \
|
|
113
|
+
--arg persona "$PERSONA_NAME" \
|
|
114
|
+
--arg summary "$local_summary" \
|
|
115
|
+
--arg detailed "$CONTENT" \
|
|
116
|
+
--arg approach "$local_approach" \
|
|
117
|
+
--argjson confidence "$local_confidence" \
|
|
118
|
+
--argjson metadata "$(build_response_metadata "$LATENCY_MS" "$MODEL_USED")" \
|
|
119
|
+
'{
|
|
120
|
+
consultant: $consultant, model: $model, persona: $persona,
|
|
121
|
+
response: {
|
|
122
|
+
summary: $summary, detailed: $detailed, approach: $approach,
|
|
123
|
+
pros: [], cons: [],
|
|
124
|
+
caveats: ["Structured fields extracted from unformatted CLI output"]
|
|
125
|
+
},
|
|
126
|
+
confidence: {
|
|
127
|
+
score: $confidence,
|
|
128
|
+
reasoning: "Confidence estimated from response language patterns",
|
|
129
|
+
uncertainty_factors: ["Non-JSON response format"]
|
|
130
|
+
},
|
|
131
|
+
metadata: $metadata
|
|
132
|
+
}' > "$OUTPUT_FILE"
|
|
133
|
+
fi
|
|
134
|
+
else
|
|
135
|
+
build_error_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
|
|
136
|
+
"Query failed with exit code $exit_code" "$LATENCY_MS" > "$OUTPUT_FILE"
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
cat "$OUTPUT_FILE"
|
|
140
|
+
exit $exit_code
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# query_kimi.sh - Query Kimi CLI (v2.9)
|
|
3
|
+
#
|
|
4
|
+
# Usage: ./query_kimi.sh "question" [context_file] [output_file]
|
|
5
|
+
#
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# KIMI_MODEL - Model identifier (default: kimi-code/kimi-for-coding)
|
|
8
|
+
# KIMI_TIMEOUT - Timeout in seconds (default: 180)
|
|
9
|
+
# ENABLE_PERSONA - Enable "The Eastern Sage" persona (default: true)
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
source "$SCRIPT_DIR/lib/common.sh"
|
|
15
|
+
source "$SCRIPT_DIR/lib/personas.sh"
|
|
16
|
+
|
|
17
|
+
# --- Parameters ---
|
|
18
|
+
QUERY="${1:-}"
|
|
19
|
+
CONTEXT_FILE="${2:-}"
|
|
20
|
+
OUTPUT_FILE="${3:-/tmp/kimi_response.json}"
|
|
21
|
+
|
|
22
|
+
# --- Configuration ---
|
|
23
|
+
ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
|
|
24
|
+
CONSULTANT_NAME="Kimi"
|
|
25
|
+
|
|
26
|
+
# --- Build query ---
|
|
27
|
+
FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
|
|
28
|
+
validate_query "$FULL_QUERY" "Kimi" || exit 1
|
|
29
|
+
|
|
30
|
+
# --- Add persona if enabled ---
|
|
31
|
+
if [[ "$ENABLE_PERSONA" == "true" ]]; then
|
|
32
|
+
FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# --- Timestamp for metadata ---
|
|
36
|
+
START_TIME=$(get_timestamp_ms)
|
|
37
|
+
|
|
38
|
+
# --- Execution ---
|
|
39
|
+
TEMP_OUTPUT=$(mktemp)
|
|
40
|
+
|
|
41
|
+
# Check CLI prerequisite
|
|
42
|
+
check_command "$KIMI_CMD" "Kimi CLI" "curl -L code.kimi.com/install.sh | bash" || exit 1
|
|
43
|
+
|
|
44
|
+
# Kimi CLI uses --quiet (equivalent to --print --output-format text --final-message-only)
|
|
45
|
+
# and --input-format text for piped stdin
|
|
46
|
+
echo "$FULL_QUERY" | run_query \
|
|
47
|
+
"Kimi" \
|
|
48
|
+
"$TEMP_OUTPUT" \
|
|
49
|
+
"$KIMI_TIMEOUT_SECONDS" \
|
|
50
|
+
"$KIMI_CMD" --quiet --input-format text
|
|
51
|
+
|
|
52
|
+
exit_code=$?
|
|
53
|
+
|
|
54
|
+
# --- Calculate latency ---
|
|
55
|
+
END_TIME=$(get_timestamp_ms)
|
|
56
|
+
LATENCY_MS=$((END_TIME - START_TIME))
|
|
57
|
+
|
|
58
|
+
# --- Configuration for response building ---
|
|
59
|
+
MODEL_USED="$KIMI_MODEL"
|
|
60
|
+
PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
|
|
61
|
+
|
|
62
|
+
# --- Post-processing: use shared helper ---
|
|
63
|
+
process_consultant_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
|
|
64
|
+
"$TEMP_OUTPUT" "$OUTPUT_FILE" "$exit_code" "$LATENCY_MS"
|
|
65
|
+
|
|
66
|
+
cat "$OUTPUT_FILE"
|
|
67
|
+
exit $exit_code
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# query_minimax.sh - Query MiniMax via HTTP API
|
|
3
|
+
#
|
|
4
|
+
# Usage: ./query_minimax.sh "question" [context_file] [output_file]
|
|
5
|
+
#
|
|
6
|
+
# Environment variables:
|
|
7
|
+
# MINIMAX_API_KEY - API key for MiniMax (required)
|
|
8
|
+
# MINIMAX_MODEL - Model to use (default: MiniMax-M2.5)
|
|
9
|
+
# MINIMAX_TIMEOUT - Timeout in seconds (default: 180)
|
|
10
|
+
# ENABLE_PERSONA - Enable "The Pragmatic Optimizer" persona (default: true)
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
|
+
source "$SCRIPT_DIR/lib/api_query.sh"
|
|
16
|
+
|
|
17
|
+
run_api_consultant "MiniMax" "$@"
|