|
8 | 8 | from .api import CircleMsClient |
9 | 9 | from .image import fetch_image_as_braille |
10 | 10 |
|
| 11 | +# Callback for direct output (set by main.py) |
| 12 | +_direct_output_callback = None |
| 13 | + |
| 14 | + |
| 15 | +def set_direct_output_callback(callback): |
| 16 | + """Set callback for direct CLI output (bypassing LLM).""" |
| 17 | + global _direct_output_callback |
| 18 | + _direct_output_callback = callback |
| 19 | + |
11 | 20 | SYSTEM_PROMPT = """あなたはコミケWebカタログの検索アシスタントです。 |
12 | 21 | ユーザーの自然言語での質問に対して、適切なAPI呼び出しを行い、結果をわかりやすく説明します。 |
13 | 22 |
|
14 | 23 | 利用可能な機能: |
15 | 24 | - サークル検索(名前、ジャンル、館で検索) |
16 | 25 | - 頒布物検索(作品名で検索) |
17 | 26 | - サークル詳細情報の取得 |
| 27 | +- サークルカット画像の表示 |
18 | 28 | - お気に入りサークルの一覧・追加・削除 |
19 | 29 | - イベント一覧の取得 |
20 | 30 | - ユーザー情報の取得 |
21 | 31 |
|
22 | 32 | 回答は日本語で、簡潔にお願いします。 |
| 33 | +
|
| 34 | +重要: show_circle_cutの結果が{"status": "displayed"}の場合、画像は既にCLIに直接表示されています。 |
| 35 | +画像を再度テキストで表現したり、Braille文字で描画しようとしないでください。 |
| 36 | +「画像を表示しました」と簡潔に伝えるだけで十分です。 |
23 | 37 | """ |
24 | 38 |
|
25 | 39 | TOOLS = [ |
26 | 40 | { |
27 | 41 | "type": "function", |
28 | 42 | "function": { |
29 | 43 | "name": "search_circles", |
30 | | - "description": "サークルを検索します(配置情報付き)。ローカルデータベースを使用します。", |
| 44 | + "description": "サークルを検索します(配置情報付き)", |
31 | 45 | "parameters": { |
32 | 46 | "type": "object", |
33 | 47 | "properties": { |
|
37 | 51 | }, |
38 | 52 | "block": { |
39 | 53 | "type": "string", |
40 | | - "description": "ブロック名(あ/ア/A等)。ひらがな・カタカナは区別、英語は大文字小文字・全角半角を区別しない", |
| 54 | + "description": "ブロック名(あ/ア/A等)", |
41 | 55 | }, |
42 | 56 | "day": { |
43 | 57 | "type": "integer", |
@@ -305,14 +319,36 @@ def _execute_function(self, name: str, args: dict) -> Any: |
305 | 319 | elif name == "get_user_info": |
306 | 320 | return self.api.get_user_info() |
307 | 321 | elif name == "show_circle_cut": |
| 322 | + wcid = args.get("wcid") |
| 323 | + if not wcid: |
| 324 | + return {"error": "wcidが指定されていません"} |
308 | 325 | # Get circle info to find image URL |
309 | | - circle_info = self.api.get_circle(args["wcid"]) |
| 326 | + circle_info = self.api.get_circle(wcid) |
| 327 | + if circle_info.get("status") != "success": |
| 328 | + return {"error": f"APIエラー: {circle_info.get('status')}", "detail": circle_info} |
310 | 329 | circle = circle_info.get("response", {}).get("circle", {}) |
311 | | - cut_url = circle.get("cut_url") or circle.get("cut_web_url") or circle.get("cut_base_url") |
| 330 | + if not circle: |
| 331 | + return {"error": "サークル情報が見つかりません", "wcid": wcid} |
| 332 | + # Try all possible image URLs |
| 333 | + cut_url = ( |
| 334 | + circle.get("cut_url") |
| 335 | + or circle.get("cut_web_url") |
| 336 | + or circle.get("cut_base_url") |
| 337 | + ) |
312 | 338 | if not cut_url: |
313 | | - return {"error": "サークルカット画像が見つかりません"} |
314 | | - braille_art = fetch_image_as_braille(cut_url) |
315 | | - return {"braille_art": braille_art, "circle_name": circle.get("name", "")} |
| 339 | + return { |
| 340 | + "error": "サークルカット画像URLが見つかりません", |
| 341 | + "circle_name": circle.get("name", ""), |
| 342 | + } |
| 343 | + try: |
| 344 | + braille_art = fetch_image_as_braille(cut_url) |
| 345 | + circle_name = circle.get("name", "") |
| 346 | + # Direct output to CLI, bypassing LLM |
| 347 | + if _direct_output_callback: |
| 348 | + _direct_output_callback(f"\n【{circle_name}】\n{braille_art}\n") |
| 349 | + return {"status": "displayed", "circle_name": circle_name} |
| 350 | + except Exception as e: |
| 351 | + return {"error": f"画像取得エラー: {str(e)}", "url": cut_url} |
316 | 352 | else: |
317 | 353 | raise ValueError(f"Unknown function: {name}") |
318 | 354 |
|
|
0 commit comments