cycls 0.0.2.87__py3-none-any.whl → 0.0.2.89__py3-none-any.whl

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.
@@ -0,0 +1 @@
1
+ :root{--bg-primary: #ffffff;--bg-secondary: #f9fafb;--bg-tertiary: #f3f4f6;--bg-sidebar: rgba(255, 255, 255, .8);--bg-hover: rgba(0, 0, 0, .05);--bg-active: rgba(0, 0, 0, .07);--bg-overlay: rgba(0, 0, 0, .25);--text-primary: #0d0d0d;--text-secondary: #374151;--text-tertiary: #6b6b6b;--text-muted: #9ca3af;--border-primary: rgba(0, 0, 0, .1);--border-secondary: rgba(0, 0, 0, .06);--accent-primary: #10a37f;--accent-hover: #0d8a6c;--scrollbar-thumb: #d1d1d1;--scrollbar-thumb-hover: #b1b1b1;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -2px rgba(0, 0, 0, .05);--code-bg: #f3f4f6;--code-text: #1f2937;--msg-user-bg: #f3f4f6;--msg-assistant-bg: transparent;--input-bg: #ffffff;--input-border: #e5e7eb;--input-focus-border: #10a37f;--btn-primary-bg: #0d0d0d;--btn-primary-text: #ffffff;--btn-secondary-bg: transparent;--btn-secondary-text: #0d0d0d}.dark,[data-theme=dark]{--bg-primary: #212121;--bg-secondary: #171717;--bg-tertiary: #2f2f2f;--bg-sidebar: rgba(23, 23, 23, .95);--bg-hover: rgba(255, 255, 255, .08);--bg-active: rgba(255, 255, 255, .12);--bg-overlay: rgba(0, 0, 0, .5);--text-primary: #ececec;--text-secondary: #c5c5c5;--text-tertiary: #8e8e8e;--text-muted: #6b6b6b;--border-primary: rgba(255, 255, 255, .1);--border-secondary: rgba(255, 255, 255, .06);--accent-primary: #10a37f;--accent-hover: #1abc94;--scrollbar-thumb: #4a4a4a;--scrollbar-thumb-hover: #5a5a5a;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .3);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .4), 0 2px 4px -1px rgba(0, 0, 0, .3);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .4), 0 4px 6px -2px rgba(0, 0, 0, .3);--code-bg: #2f2f2f;--code-text: #e5e7eb;--msg-user-bg: #2f2f2f;--msg-assistant-bg: transparent;--input-bg: #2f2f2f;--input-border: #424242;--input-focus-border: #10a37f;--btn-primary-bg: #ececec;--btn-primary-text: #0d0d0d;--btn-secondary-bg: transparent;--btn-secondary-text: #ececec}@media (prefers-color-scheme: dark){:root:not(.light):not([data-theme=light]){--bg-primary: #212121;--bg-secondary: #171717;--bg-tertiary: #2f2f2f;--bg-sidebar: rgba(23, 23, 23, .95);--bg-hover: rgba(255, 255, 255, .08);--bg-active: rgba(255, 255, 255, .12);--bg-overlay: rgba(0, 0, 0, .5);--text-primary: #ececec;--text-secondary: #c5c5c5;--text-tertiary: #8e8e8e;--text-muted: #6b6b6b;--border-primary: rgba(255, 255, 255, .1);--border-secondary: rgba(255, 255, 255, .06);--accent-primary: #10a37f;--accent-hover: #1abc94;--scrollbar-thumb: #4a4a4a;--scrollbar-thumb-hover: #5a5a5a;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .3);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .4), 0 2px 4px -1px rgba(0, 0, 0, .3);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .4), 0 4px 6px -2px rgba(0, 0, 0, .3);--code-bg: #2f2f2f;--code-text: #e5e7eb;--msg-user-bg: #2f2f2f;--msg-assistant-bg: transparent;--input-bg: #2f2f2f;--input-border: #424242;--input-focus-border: #10a37f;--btn-primary-bg: #ececec;--btn-primary-text: #0d0d0d;--btn-secondary-bg: transparent;--btn-secondary-text: #ececec}}body{background-color:var(--bg-primary);color:var(--text-primary);transition:background-color .2s ease,color .2s ease}.cl-internal-p8bmz4{box-shadow:none!important;border:1px solid var(--border-primary);box-shadow:var(--shadow-sm)}.cl-drawerRoot{z-index:99!important}.cl-pricingTableCardFooterButton{padding:10px}.cl-pricingTableCardFee{font-size:2rem}.cl-pricingTableCardTitleContainer{margin-bottom:10px}.scrollbar-thin{scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) transparent}.scrollbar-thin::-webkit-scrollbar{width:6px}.scrollbar-thin::-webkit-scrollbar-track{background:transparent}.scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:3px}.scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb-hover)}.scrollbar-thin::-webkit-scrollbar-thumb{background-color:transparent}.scrollbar-thin:hover::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb)}.sidebar-transition{transition:transform .3s ease-in-out,width .3s ease-in-out}.sidebar-overlay{z-index:40}.sidebar-panel{z-index:50}@keyframes slideDown{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.dropdown-menu{animation:slideDown .15s ease-out}.sidebar-item:focus-visible{outline:2px solid var(--text-primary);outline-offset:-2px;border-radius:8px}.user-profile-item:hover .user-avatar{transform:scale(1.02)}.chat-title-fade{mask-image:linear-gradient(to right,black 85%,transparent 100%);-webkit-mask-image:linear-gradient(to right,black 85%,transparent 100%)}.theme-toggle-icon{transition:transform .3s ease,opacity .2s ease}.theme-toggle:hover .theme-toggle-icon{transform:rotate(15deg)}.theme-transition{transition:background-color .2s ease,color .2s ease,border-color .2s ease,box-shadow .2s ease}.dark .prose,[data-theme=dark] .prose{--tw-prose-body: var(--text-primary);--tw-prose-headings: var(--text-primary);--tw-prose-lead: var(--text-secondary);--tw-prose-links: var(--accent-primary);--tw-prose-bold: var(--text-primary);--tw-prose-counters: var(--text-tertiary);--tw-prose-bullets: var(--text-tertiary);--tw-prose-hr: var(--border-primary);--tw-prose-quotes: var(--text-secondary);--tw-prose-quote-borders: var(--border-primary);--tw-prose-captions: var(--text-tertiary);--tw-prose-code: var(--text-primary);--tw-prose-pre-code: var(--code-text);--tw-prose-pre-bg: var(--code-bg);--tw-prose-th-borders: var(--border-primary);--tw-prose-td-borders: var(--border-secondary)}@media (prefers-color-scheme: dark){:root:not(.light):not([data-theme=light]) .prose{--tw-prose-body: var(--text-primary);--tw-prose-headings: var(--text-primary);--tw-prose-lead: var(--text-secondary);--tw-prose-links: var(--accent-primary);--tw-prose-bold: var(--text-primary);--tw-prose-counters: var(--text-tertiary);--tw-prose-bullets: var(--text-tertiary);--tw-prose-hr: var(--border-primary);--tw-prose-quotes: var(--text-secondary);--tw-prose-quote-borders: var(--border-primary);--tw-prose-captions: var(--text-tertiary);--tw-prose-code: var(--text-primary);--tw-prose-pre-code: var(--code-text);--tw-prose-pre-bg: var(--code-bg);--tw-prose-th-borders: var(--border-primary);--tw-prose-td-borders: var(--border-secondary)}}.dark pre code.hljs,[data-theme=dark] pre code.hljs{background:var(--code-bg)!important}@media (prefers-color-scheme: dark){:root:not(.light):not([data-theme=light]) pre code.hljs{background:var(--code-bg)!important}}
@@ -4,10 +4,6 @@
4
4
  <meta charset="UTF-8" />
5
5
  <title>AI Agent</title>
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1" />
7
- <!-- Default SEO tags - dynamically updated by SEOHead component -->
8
- <meta name="robots" content="noindex, nofollow" />
9
- <meta name="googlebot" content="noindex, nofollow" />
10
- <meta name="description" content="AI-powered chat interface" />
11
7
  <script src="https://cdn.tailwindcss.com?plugins=forms,typography"></script>
12
8
  <link
13
9
  rel="stylesheet"
@@ -17,8 +13,8 @@
17
13
  rel="stylesheet"
18
14
  href="https://esm.sh/katex@0.16.8/dist/katex.min.css"
19
15
  />
20
- <script type="module" crossorigin src="/assets/index-DOmNqb-2.js"></script>
21
- <link rel="stylesheet" crossorigin href="/assets/index-oGkkm3Z8.css">
16
+ <script type="module" crossorigin src="/assets/index-C2r4Daz3.js"></script>
17
+ <link rel="stylesheet" crossorigin href="/assets/index-DWGS8zpa.css">
22
18
  </head>
23
19
  <body style="overflow-x: hidden">
24
20
  <div id="root"></div>
@@ -0,0 +1,32 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <title>AI Agent</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <!-- Default SEO tags - dynamically updated by SEOHead component -->
8
+ <meta name="robots" content="noindex, nofollow" />
9
+ <meta name="googlebot" content="noindex, nofollow" />
10
+ <meta name="description" content="AI-powered chat interface" />
11
+ <script src="https://cdn.tailwindcss.com?plugins=forms,typography"></script>
12
+ <link
13
+ rel="stylesheet"
14
+ href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/github-dark.min.css"
15
+ />
16
+ <link
17
+ rel="stylesheet"
18
+ href="https://esm.sh/katex@0.16.8/dist/katex.min.css"
19
+ />
20
+ <script type="module" crossorigin src="/assets/index-DOmNqb-2.js"></script>
21
+ <link rel="stylesheet" crossorigin href="/assets/index-oGkkm3Z8.css">
22
+ </head>
23
+ <body style="overflow-x: hidden">
24
+ <div id="root"></div>
25
+
26
+ <script>
27
+ tailwind.config = {
28
+ darkMode: "class",
29
+ };
30
+ </script>
31
+ </body>
32
+ </html>
cycls/web.py CHANGED
@@ -16,6 +16,7 @@ class Config(BaseModel):
16
16
  org: Optional[str] = None
17
17
  pk: Optional[str] = None
18
18
  jwks: Optional[str] = None
19
+ debug: bool = False
19
20
 
20
21
  def set_prod(self, prod: bool):
21
22
  self.prod = prod
@@ -36,13 +37,18 @@ def sse(item):
36
37
  if not isinstance(item, dict): item = {"type": "text", "text": item}
37
38
  return f"data: {json.dumps(item)}\n\n"
38
39
 
39
- async def encoder(stream):
40
- if inspect.isasyncgen(stream):
41
- async for item in stream:
42
- if msg := sse(item): yield msg
43
- else:
44
- for item in stream:
45
- if msg := sse(item): yield msg
40
+ async def encoder(stream, debug=False):
41
+ import traceback
42
+ try:
43
+ if inspect.isasyncgen(stream):
44
+ async for item in stream:
45
+ if msg := sse(item): yield msg
46
+ else:
47
+ for item in stream:
48
+ if msg := sse(item): yield msg
49
+ except Exception as e:
50
+ error_msg = traceback.format_exc() if debug else str(e)
51
+ yield sse({"type": "thinking", "thinking": f"⚠️ Error\n```\n{error_msg}```"})
46
52
  yield "data: [DONE]\n\n"
47
53
 
48
54
  class Messages(list):
@@ -117,15 +123,23 @@ def web(func, config):
117
123
  @app.post("/chat/cycls")
118
124
  @app.post("/chat/completions")
119
125
  async def back(request: Request, jwt: Optional[dict] = Depends(validate) if config.auth else None):
126
+ import traceback
120
127
  data = await request.json()
121
128
  messages = data.get("messages")
122
129
  user_data = jwt.get("user") if jwt else None
123
130
  context = Context(messages = Messages(messages), user = User(**user_data) if user_data else None)
124
- stream = await func(context) if inspect.iscoroutinefunction(func) else func(context)
131
+ try:
132
+ stream = await func(context) if inspect.iscoroutinefunction(func) else func(context)
133
+ except Exception as e:
134
+ error_msg = traceback.format_exc() if config.debug else str(e)
135
+ async def error_stream():
136
+ yield sse({"type": "thinking", "thinking": f"⚠️ Error\n```\n{error_msg}```"})
137
+ yield "data: [DONE]\n\n"
138
+ return StreamingResponse(error_stream(), media_type="text/event-stream")
125
139
  if request.url.path == "/chat/completions":
126
140
  stream = openai_encoder(stream)
127
141
  elif request.url.path == "/chat/cycls":
128
- stream = encoder(stream)
142
+ stream = encoder(stream, debug=config.debug)
129
143
  return StreamingResponse(stream, media_type="text/event-stream")
130
144
 
131
145
  @app.get("/config")
@@ -1,22 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cycls
3
- Version: 0.0.2.87
3
+ Version: 0.0.2.89
4
4
  Summary: Distribute Intelligence
5
- Author: Mohammed J. AlRujayi
6
- Author-email: mj@cycls.com
7
- Requires-Python: >=3.9,<4.0
8
- Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.9
10
- Classifier: Programming Language :: Python :: 3.10
11
- Classifier: Programming Language :: Python :: 3.11
12
- Classifier: Programming Language :: Python :: 3.12
13
- Classifier: Programming Language :: Python :: 3.13
14
- Classifier: Programming Language :: Python :: 3.14
15
- Requires-Dist: cloudpickle (>=3.1.1,<4.0.0)
16
- Requires-Dist: docker (>=7.1.0,<8.0.0)
17
- Requires-Dist: fastapi (>=0.111.0,<0.112.0)
18
- Requires-Dist: httpx (>=0.27.0,<0.28.0)
19
- Requires-Dist: pyjwt (>=2.8.0,<3.0.0)
5
+ Author-email: "Mohammed J. AlRujayi" <mj@cycls.com>
6
+ Requires-Python: >=3.9
7
+ Requires-Dist: cloudpickle>=3.1.1
8
+ Requires-Dist: docker>=7.1.0
9
+ Requires-Dist: email-validator>=2.0.0
10
+ Requires-Dist: fastapi>=0.111.0
11
+ Requires-Dist: httpx>=0.27.0
12
+ Requires-Dist: pyjwt>=2.8.0
13
+ Requires-Dist: uvicorn>=0.30.0
20
14
  Description-Content-Type: text/markdown
21
15
 
22
16
  <h3 align="center">
@@ -273,4 +267,3 @@ No YAML. No Dockerfiles. No infrastructure repo. The code is the deployment.
273
267
  ## License
274
268
 
275
269
  MIT
276
-
@@ -0,0 +1,17 @@
1
+ cycls/__init__.py,sha256=efbq0vRijGOByKtz9bRF8WQFYmnPSgZV1DH-54s6iwQ,493
2
+ cycls/app.py,sha256=5Uns6lwZCU5qwFD80vOJ_omDlhlEOGP65woK7rg2tn8,3222
3
+ cycls/auth.py,sha256=xkndHZyCfnlertMMEKerCJjf23N3fVcTRVTTSXTTuzg,247
4
+ cycls/cli.py,sha256=cVbIkTDnVofohvByyYUrXF_RYDQZVQECJqo7cPBPJfs,4781
5
+ cycls/function.py,sha256=FP94mCd5hfCASFwsTSYny7KOEsJOh3LME9oZgiVfgzo,14795
6
+ cycls/web.py,sha256=XbSgra1G_L61tr1TshVeqjNERoFtFH_4VIwnQFxH00g,6242
7
+ cycls/themes/default/index.html,sha256=WPUqVzJyh-aO2ulWTbXwOVAfWHaj0yWTGd9e8HOEro4,828
8
+ cycls/themes/default/assets/index-C2r4Daz3.js,sha256=OGzjspxo0uUTdtQIzWZNgFMhGUtW4wSVuW33iA7oLFM,1351283
9
+ cycls/themes/default/assets/index-DWGS8zpa.css,sha256=SxylXQV1qgQ0sw9QlMxcu9jwWTu8XPOnWZju8upUpCM,6504
10
+ cycls/themes/defaultN/index.html,sha256=X7RbyJUic2iO1pJO0dX1iJBgUxMgqMZ-xKLTKwAE_Uk,1082
11
+ cycls/themes/defaultN/assets/index-DOmNqb-2.js,sha256=QTP1orFISS03SmgaBF2t7D1BlHmt8hXKvhlFZcic16I,1351775
12
+ cycls/themes/defaultN/assets/index-oGkkm3Z8.css,sha256=xHhbrJvvz8mIN_Otrl6nawKJcA41L3tCFhVEOstGhVU,6498
13
+ cycls/themes/dev/index.html,sha256=QJBHkdNuMMiwQU7o8dN8__8YQeQB45D37D-NCXIWB2Q,11585
14
+ cycls-0.0.2.89.dist-info/METADATA,sha256=kYyn7U6MLUxC2rKuUDGfpNco1t6cHDTZbr55fJbRdtU,8106
15
+ cycls-0.0.2.89.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
16
+ cycls-0.0.2.89.dist-info/entry_points.txt,sha256=CktT5eNvW_Qxomf7L_Ez_GdUbL6qAfx_Utm6_HtUJwE,41
17
+ cycls-0.0.2.89.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.2.1
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ cycls = cycls.cli:main
@@ -1,14 +0,0 @@
1
- cycls/__init__.py,sha256=efbq0vRijGOByKtz9bRF8WQFYmnPSgZV1DH-54s6iwQ,493
2
- cycls/app.py,sha256=cYzHJboFRAKXhImJOkTLdMxpFZFlkVt_oulJrhF14KU,3124
3
- cycls/auth.py,sha256=xkndHZyCfnlertMMEKerCJjf23N3fVcTRVTTSXTTuzg,247
4
- cycls/cli.py,sha256=cVbIkTDnVofohvByyYUrXF_RYDQZVQECJqo7cPBPJfs,4781
5
- cycls/function.py,sha256=dJ7N4kqI5dB1te-LDHrYC7l8S0tanYai1S344T2NqzU,14730
6
- cycls/themes/default/assets/index-DOmNqb-2.js,sha256=QTP1orFISS03SmgaBF2t7D1BlHmt8hXKvhlFZcic16I,1351775
7
- cycls/themes/default/assets/index-oGkkm3Z8.css,sha256=xHhbrJvvz8mIN_Otrl6nawKJcA41L3tCFhVEOstGhVU,6498
8
- cycls/themes/default/index.html,sha256=X7RbyJUic2iO1pJO0dX1iJBgUxMgqMZ-xKLTKwAE_Uk,1082
9
- cycls/themes/dev/index.html,sha256=QJBHkdNuMMiwQU7o8dN8__8YQeQB45D37D-NCXIWB2Q,11585
10
- cycls/web.py,sha256=svDytrmrUoeZQtl9lBb9pGLb1JRKtcB8nZmHnErrweA,5540
11
- cycls-0.0.2.87.dist-info/METADATA,sha256=8nuqUcGOSNfFJblLc75wfloiC8Ix6UzEmunTJlFrkgg,8453
12
- cycls-0.0.2.87.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
13
- cycls-0.0.2.87.dist-info/entry_points.txt,sha256=vEhqUxFhhuzCKWtq02LbMnT3wpUqdfgcM3Yh-jjXom8,40
14
- cycls-0.0.2.87.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- [console_scripts]
2
- cycls=cycls.cli:main
3
-