Skip to content

Commit f06a009

Browse files
authored
Merge pull request #25 from harmony-one/grok-resource
Grok resource
2 parents f5ff2a3 + bba7da4 commit f06a009

File tree

6 files changed

+129
-21
lines changed

6 files changed

+129
-21
lines changed

.env.example

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,18 @@ OPENAI_API_KEY="XXXXX"
22
AI21_API_KEY="XXXXX"
33
DEBUG=True
44
TESTING=False
5+
ENV="development"
56
CHROMA_SERVER_HOST="XXXXXX"
67
CHROMA_SERVER_HTTP_PORT="8000"
78
WEB_CRAWLER_HTTP="XXXXX"
8-
CHROMA_SERVER_PATH="./chroma"
9+
CHROMA_SERVER_PATH="./chroma"
10+
XAI_API_KEY=xai-XXXXXX
11+
LUMAAI_API_KEY=luma-XXXXXXX
12+
SQLITE_PATH="./chroma"
13+
OPENAI_MODEL="gpt-3.5-turbo"
14+
OPENAI_MAX_TOKENS=600
15+
CHROMADB_SERVER_URL="https://XXXXXXXX.fly.dev"
16+
GEMINI_KEY=AIzXXXXXXXXXXXX
17+
ANTHROPIC_API_KEY="sk-XXXXXXXXX"
18+
API_KEYS="sk-tel-XXXXXXX,sk-ios-XXXXXXX,sk-oth-XXXXX"
19+
TELEGRAM_API_KEY=XXXXX:XXXXXXXXXXXX

apis/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from flask_restx import Api
22
from .vertex_resource import api as vertex_namespace, VertexGeminiCompletionRes
33
from .llms_resource import api as llms_namespace
4+
from .xai_resource import api as xai_namespace
45
from .collections import api as collections_namespace
56
from .openai_resource import api as openai_namespace
67
from .anthropic import api as anthropic_namespace, AnthropicCompletionRes
@@ -18,4 +19,5 @@
1819
api.add_namespace(collections_namespace)
1920
api.add_namespace(openai_namespace)
2021
api.add_namespace(anthropic_namespace)
21-
api.add_namespace(lumaai_namespace)
22+
api.add_namespace(lumaai_namespace)
23+
api.add_namespace(xai_namespace)

apis/anthropic/anthropic_resource.py

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,17 @@ def post(self):
117117
# response = client.messages.create(**data)
118118
responseJson = extract_response_data(response)
119119

120+
121+
except anthropic.APIError as e:
122+
error_code = getattr(e, 'status_code', 500)
123+
error_message = str(e)
124+
app.logger.error(f"API Error: ({error_code}) {error_message}")
125+
telegram_report_error("xai", "NO_CHAT_ID", error_code, error_message)
126+
raise CustomError(error_code, error_message)
120127
except anthropic.AnthropicError as e:
121-
error_code = e.status_code
122-
error_json = json.loads(e.response.text)
123-
error_message = error_json["error"]["message"]
124-
app.logger.error(f"Unexpected Error: ({error_code}) {error_message}")
128+
error_code = getattr(e, 'status_code', 500)
129+
error_message = str(e)
130+
app.logger.error(f"API Error: ({error_code}) {error_message}")
125131
telegram_report_error("anthropic", "NO_CHAT_ID", error_code, error_message)
126132
raise CustomError(error_code, error_message)
127133
except Exception as e:
@@ -154,12 +160,18 @@ def post(self):
154160
thread.start()
155161
return make_response(jsonify({"id": f"{tool_execution_id}"}), 200)
156162

163+
164+
except anthropic.APIError as e:
165+
error_code = getattr(e, 'status_code', 500)
166+
error_message = str(e)
167+
app.logger.error(f"API Error: ({error_code}) {error_message}")
168+
telegram_report_error("xai", "NO_CHAT_ID", error_code, error_message)
169+
raise CustomError(error_code, error_message)
157170
except anthropic.AnthropicError as e:
158-
error_code = e.status_code
159-
error_json = json.loads(e.response.text)
160-
error_message = error_json["error"]["message"]
161-
app.logger.error(f"Unexpected Error: ({error_code}) {error_message}")
162-
telegram_report_error("anthropic", "NO_CHAT_ID", error_code, error_message)
171+
error_code = getattr(e, 'status_code', 500)
172+
error_message = str(e)
173+
app.logger.error(f"API Error: ({error_code}) {error_message}")
174+
telegram_report_error("anthropic", "NO_CHAT_ID", error_code, error_message)
163175
raise CustomError(error_code, error_message)
164176
except Exception as e:
165177
app.logger.error(f"Ucnexpected Error: {str(e)}")
@@ -341,12 +353,17 @@ def post(self):
341353
else:
342354
raise CustomError(400, "Bad request")
343355

356+
except anthropic.APIError as e:
357+
error_code = getattr(e, 'status_code', 500)
358+
error_message = str(e)
359+
app.logger.error(f"API Error: ({error_code}) {error_message}")
360+
telegram_report_error("xai", "NO_CHAT_ID", error_code, error_message)
361+
raise CustomError(error_code, error_message)
344362
except anthropic.AnthropicError as e:
345-
error_code = e.status_code
346-
error_json = json.loads(e.response.text)
347-
error_message = error_json["error"]["message"]
348-
app.logger.error(f"Unexpected Error: ({error_code}) {error_message}")
349-
telegram_report_error("anthropic", "NO_CHAT_ID", error_code, error_message)
363+
error_code = getattr(e, 'status_code', 500)
364+
error_message = str(e)
365+
app.logger.error(f"API Error: ({error_code}) {error_message}")
366+
telegram_report_error("anthropic", "NO_CHAT_ID", error_code, error_message)
350367
raise CustomError(error_code, error_message)
351368
except Exception as e:
352369
app.logger.error(f"Unexpected Error: {str(e)}")
@@ -438,12 +455,17 @@ def post(self):
438455
return output.strip()
439456
else:
440457
raise CustomError(400, "Bad request")
458+
except anthropic.APIError as e:
459+
error_code = getattr(e, 'status_code', 500)
460+
error_message = str(e)
461+
app.logger.error(f"API Error: ({error_code}) {error_message}")
462+
telegram_report_error("xai", "NO_CHAT_ID", error_code, error_message)
463+
raise CustomError(error_code, error_message)
441464
except anthropic.AnthropicError as e:
442-
error_code = e.status_code
443-
error_json = json.loads(e.response.text)
444-
error_message = error_json["error"]["message"]
445-
app.logger.error(f"Unexpected Error: ({error_code}) {error_message}")
446-
telegram_report_error("anthropic", "NO_CHAT_ID", error_code, error_message)
465+
error_code = getattr(e, 'status_code', 500)
466+
error_message = str(e)
467+
app.logger.error(f"API Error: ({error_code}) {error_message}")
468+
telegram_report_error("anthropic", "NO_CHAT_ID", error_code, error_message)
447469
raise CustomError(error_code, error_message)
448470
except Exception as e:
449471
app.logger.error(f"Unexpected Error: {str(e)}")

apis/xai_resource.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import anthropic.types
2+
from flask import request, Response, current_app as app
3+
from flask_restx import Namespace, Resource
4+
import anthropic
5+
import json
6+
from res import EngMsg as msg, CustomError
7+
from config import config
8+
from services.telegram import telegram_report_error
9+
10+
api = Namespace('xai', description=msg.API_NAMESPACE_XAI_DESCRIPTION)
11+
12+
client = anthropic.Anthropic(
13+
base_url="https://api.x.ai",
14+
api_key=config.XAI_API_KEY,
15+
)
16+
17+
def data_generator(response):
18+
# input_token = 0
19+
# output_token = 0
20+
for event in response:
21+
if event.type == 'message_start':
22+
input_token = event.message.usage.input_tokens
23+
elif event.type == 'content_block_delta':
24+
text = event.delta.text
25+
yield f"{text}"
26+
elif event.type == 'message_delta':
27+
output_tokens = event.usage.output_tokens
28+
yield f"Input Token: {input_token}"
29+
yield f"Output Tokens: {output_tokens}"
30+
31+
32+
def extract_response_data(response):
33+
return response.model_dump_json()
34+
35+
36+
@api.route('/completions')
37+
class XaiCompletionRes(Resource):
38+
39+
def post(self):
40+
"""
41+
Endpoint to handle xAI request.
42+
Receives a message from the user, processes it, and returns a response from the model.
43+
"""
44+
app.logger.info('handling xAI request')
45+
data = request.json
46+
try:
47+
if data.get('stream') == "True":
48+
data['stream'] = True # Convert stream to boolean
49+
messages = [{"content": m["content"], "role": m["role"]} for m in data.get('messages')]
50+
data['messages'] = messages
51+
response = client.messages.create(**data)
52+
if data.get('stream'):
53+
return Response(data_generator(response), mimetype='text/event-stream')
54+
55+
# response = client.messages.create(**data)
56+
responseJson = extract_response_data(response)
57+
58+
59+
except anthropic.APIError as e:
60+
# This will catch BadRequestError, RateLimitError, AuthenticationError, etc.
61+
error_code = getattr(e, 'status_code', 500)
62+
error_message = str(e)
63+
app.logger.error(f"API Error: ({error_code}) {error_message}")
64+
telegram_report_error("xai", "NO_CHAT_ID", error_code, error_message)
65+
raise CustomError(error_code, error_message)
66+
67+
except Exception as e:
68+
app.logger.error(f"Unexpected Error: {str(e)}")
69+
raise CustomError(500, "An unexpected error occurred.")
70+
71+
return responseJson, 200

config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,6 @@ class Config(object):
2121
API_KEYS = os.environ.get("API_KEYS").split(',') if os.environ.get("API_KEYS") else []
2222
LUMAAI_API_KEY = os.environ.get("LUMAAI_API_KEY")
2323
TELEGRAM_API_KEY = os.environ.get('TELEGRAM_API_KEY')
24+
XAI_API_KEY = os.getenv("XAI_API_KEY")
2425
TELEGRAM_REPORT_ID = os.environ.get('TELEGRAM_REPORT_ID') # telegram user id
2526
config = Config()

res/text_messages.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class EngMsg():
1010
API_NAMESPACE_LLMS_DESCRIPTION = 'LLMs APIs'
1111
API_NAMESPACE_OPENAI_DESCRIPTION = 'OpenAI APIs'
1212
API_NAMESPACE_ANTHROPIC_DESCRIPTION = 'Claude APIs'
13+
API_NAMESPACE_XAI_DESCRIPTION = 'xAI Apis'
1314

1415
API_DOC_PARAMS_COLLECTION_NAME = 'Collection Name'
1516
API_DOC_PARAMS_DATA = 'Audio file'

0 commit comments

Comments
 (0)