| | |
| | """MCP Tools - Grok AI 对话工具""" |
| |
|
| | import json |
| | from typing import Optional |
| | from app.services.grok.client import GrokClient |
| | from app.core.logger import logger |
| | from app.core.exception import GrokApiException |
| |
|
| |
|
| | async def ask_grok_impl( |
| | query: str, |
| | model: str = "grok-3-fast", |
| | system_prompt: Optional[str] = None |
| | ) -> str: |
| | """ |
| | 内部实现: 调用Grok API并收集完整响应 |
| | |
| | Args: |
| | query: 用户问题 |
| | model: 模型名称 |
| | system_prompt: 系统提示词 |
| | |
| | Returns: |
| | str: 完整的Grok响应内容 |
| | """ |
| | try: |
| | |
| | messages = [] |
| | if system_prompt: |
| | messages.append({"role": "system", "content": system_prompt}) |
| | messages.append({"role": "user", "content": query}) |
| |
|
| | |
| | request_data = { |
| | "model": model, |
| | "messages": messages, |
| | "stream": True |
| | } |
| |
|
| | logger.info(f"[MCP] ask_grok 调用, 模型: {model}") |
| |
|
| | |
| | response_iterator = await GrokClient.openai_to_grok(request_data) |
| |
|
| | |
| | content_parts = [] |
| | async for chunk in response_iterator: |
| | if isinstance(chunk, bytes): |
| | chunk = chunk.decode('utf-8') |
| |
|
| | |
| | if chunk.startswith("data: "): |
| | data_str = chunk[6:].strip() |
| | if data_str == "[DONE]": |
| | break |
| |
|
| | try: |
| | data = json.loads(data_str) |
| | choices = data.get("choices", []) |
| | if choices: |
| | delta = choices[0].get("delta", {}) |
| | if content := delta.get("content"): |
| | content_parts.append(content) |
| | except json.JSONDecodeError: |
| | continue |
| |
|
| | result = "".join(content_parts) |
| | logger.info(f"[MCP] ask_grok 完成, 响应长度: {len(result)}") |
| | return result |
| |
|
| | except GrokApiException as e: |
| | logger.error(f"[MCP] Grok API错误: {str(e)}") |
| | raise Exception(f"Grok API调用失败: {str(e)}") |
| | except Exception as e: |
| | logger.error(f"[MCP] ask_grok异常: {str(e)}", exc_info=True) |
| | raise Exception(f"处理请求时出错: {str(e)}") |
| |
|