octostar-python-client 0.1.759__tar.gz

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.
Files changed (270) hide show
  1. octostar_python_client-0.1.759/CLAUDE.md +170 -0
  2. octostar_python_client-0.1.759/LICENSE +21 -0
  3. octostar_python_client-0.1.759/PKG-INFO +159 -0
  4. octostar_python_client-0.1.759/README.md +122 -0
  5. octostar_python_client-0.1.759/__init__.py +0 -0
  6. octostar_python_client-0.1.759/examples/README.md +54 -0
  7. octostar_python_client-0.1.759/examples/create_linkchart_demo.py +404 -0
  8. octostar_python_client-0.1.759/octostar/__init__.py +9 -0
  9. octostar_python_client-0.1.759/octostar/api/__init__.py +1 -0
  10. octostar_python_client-0.1.759/octostar/api/apps/__init__.py +0 -0
  11. octostar_python_client-0.1.759/octostar/api/apps/deploy_app.py +210 -0
  12. octostar_python_client-0.1.759/octostar/api/apps/execute_app_job.py +188 -0
  13. octostar_python_client-0.1.759/octostar/api/apps/get_app_logs.py +210 -0
  14. octostar_python_client-0.1.759/octostar/api/apps/get_apps_url.py +188 -0
  15. octostar_python_client-0.1.759/octostar/api/apps/get_job_logs.py +210 -0
  16. octostar_python_client-0.1.759/octostar/api/apps/get_job_progress.py +162 -0
  17. octostar_python_client-0.1.759/octostar/api/apps/kill_job.py +160 -0
  18. octostar_python_client-0.1.759/octostar/api/apps/list_app_jobs.py +276 -0
  19. octostar_python_client-0.1.759/octostar/api/apps/list_apps.py +251 -0
  20. octostar_python_client-0.1.759/octostar/api/apps/set_job_progress.py +216 -0
  21. octostar_python_client-0.1.759/octostar/api/apps/undeploy_app.py +160 -0
  22. octostar_python_client-0.1.759/octostar/api/metadata/__init__.py +0 -0
  23. octostar_python_client-0.1.759/octostar/api/metadata/get_version.py +232 -0
  24. octostar_python_client-0.1.759/octostar/api/metadata/get_whoami.py +232 -0
  25. octostar_python_client-0.1.759/octostar/api/notifications/__init__.py +0 -0
  26. octostar_python_client-0.1.759/octostar/api/notifications/delete_stream.py +222 -0
  27. octostar_python_client-0.1.759/octostar/api/notifications/get_subscriptions.py +240 -0
  28. octostar_python_client-0.1.759/octostar/api/notifications/publish_notification.py +275 -0
  29. octostar_python_client-0.1.759/octostar/api/notifications/pull_events_from_stream.py +282 -0
  30. octostar_python_client-0.1.759/octostar/api/notifications/push_event_to_stream.py +265 -0
  31. octostar_python_client-0.1.759/octostar/api/notifications/toast.py +264 -0
  32. octostar_python_client-0.1.759/octostar/api/ontology/__init__.py +0 -0
  33. octostar_python_client-0.1.759/octostar/api/ontology/fetch_ontology_data.py +275 -0
  34. octostar_python_client-0.1.759/octostar/api/ontology/get_ontologies.py +237 -0
  35. octostar_python_client-0.1.759/octostar/api/ontology/multi_query.py +297 -0
  36. octostar_python_client-0.1.759/octostar/api/ontology/query.py +276 -0
  37. octostar_python_client-0.1.759/octostar/api/pipeline/__init__.py +1 -0
  38. octostar_python_client-0.1.759/octostar/api/pipeline/get_processing_status.py +185 -0
  39. octostar_python_client-0.1.759/octostar/api/pipeline/update_processing_status.py +164 -0
  40. octostar_python_client-0.1.759/octostar/api/search/__init__.py +0 -0
  41. octostar_python_client-0.1.759/octostar/api/search/get_annotations.py +153 -0
  42. octostar_python_client-0.1.759/octostar/api/workspace_data/__init__.py +0 -0
  43. octostar_python_client-0.1.759/octostar/api/workspace_data/delete_blob.py +212 -0
  44. octostar_python_client-0.1.759/octostar/api/workspace_data/delete_entities.py +326 -0
  45. octostar_python_client-0.1.759/octostar/api/workspace_data/download_blob.py +235 -0
  46. octostar_python_client-0.1.759/octostar/api/workspace_data/get_attachment.py +336 -0
  47. octostar_python_client-0.1.759/octostar/api/workspace_data/get_files_tree.py +397 -0
  48. octostar_python_client-0.1.759/octostar/api/workspace_data/upload_blob.py +235 -0
  49. octostar_python_client-0.1.759/octostar/api/workspace_data/upsert_entities.py +284 -0
  50. octostar_python_client-0.1.759/octostar/api/workspace_permissions/__init__.py +0 -0
  51. octostar_python_client-0.1.759/octostar/api/workspace_permissions/get_permissions.py +325 -0
  52. octostar_python_client-0.1.759/octostar/api/workspace_tags/__init__.py +0 -0
  53. octostar_python_client-0.1.759/octostar/api/workspace_tags/delete_tag_from_entities.py +141 -0
  54. octostar_python_client-0.1.759/octostar/api/workspace_tags/tag_entities.py +180 -0
  55. octostar_python_client-0.1.759/octostar/client.py +492 -0
  56. octostar_python_client-0.1.759/octostar/errors.py +50 -0
  57. octostar_python_client-0.1.759/octostar/models/__init__.py +249 -0
  58. octostar_python_client-0.1.759/octostar/models/acknowledgement.py +74 -0
  59. octostar_python_client-0.1.759/octostar/models/acknowledgement_with_data.py +82 -0
  60. octostar_python_client-0.1.759/octostar/models/app_status.py +239 -0
  61. octostar_python_client-0.1.759/octostar/models/app_status_annotations.py +66 -0
  62. octostar_python_client-0.1.759/octostar/models/app_status_labels.py +69 -0
  63. octostar_python_client-0.1.759/octostar/models/app_with_url.py +82 -0
  64. octostar_python_client-0.1.759/octostar/models/child_processing_status.py +118 -0
  65. octostar_python_client-0.1.759/octostar/models/delete_entities_response_401.py +74 -0
  66. octostar_python_client-0.1.759/octostar/models/delete_entities_response_409.py +82 -0
  67. octostar_python_client-0.1.759/octostar/models/delete_entities_response_500.py +82 -0
  68. octostar_python_client-0.1.759/octostar/models/delete_stream_response_401.py +74 -0
  69. octostar_python_client-0.1.759/octostar/models/delete_tag_from_entities_response_401.py +74 -0
  70. octostar_python_client-0.1.759/octostar/models/deploy_app_json_body.py +90 -0
  71. octostar_python_client-0.1.759/octostar/models/deploy_app_json_body_secrets.py +65 -0
  72. octostar_python_client-0.1.759/octostar/models/deploy_app_response_200.py +98 -0
  73. octostar_python_client-0.1.759/octostar/models/deploy_app_response_200_data.py +60 -0
  74. octostar_python_client-0.1.759/octostar/models/deploy_app_response_400.py +82 -0
  75. octostar_python_client-0.1.759/octostar/models/deploy_app_response_403.py +82 -0
  76. octostar_python_client-0.1.759/octostar/models/deploy_app_response_404.py +82 -0
  77. octostar_python_client-0.1.759/octostar/models/deploy_app_response_409.py +82 -0
  78. octostar_python_client-0.1.759/octostar/models/deploy_app_response_500.py +82 -0
  79. octostar_python_client-0.1.759/octostar/models/entity.py +80 -0
  80. octostar_python_client-0.1.759/octostar/models/entity_response.py +99 -0
  81. octostar_python_client-0.1.759/octostar/models/entity_response_s3_urls.py +93 -0
  82. octostar_python_client-0.1.759/octostar/models/entity_response_s3_urls_additional_property.py +105 -0
  83. octostar_python_client-0.1.759/octostar/models/entity_response_s3_urls_additional_property_fields.py +114 -0
  84. octostar_python_client-0.1.759/octostar/models/execute_app_job_json_body.py +151 -0
  85. octostar_python_client-0.1.759/octostar/models/execute_app_job_json_body_annotation.py +65 -0
  86. octostar_python_client-0.1.759/octostar/models/execute_app_job_response_401.py +74 -0
  87. octostar_python_client-0.1.759/octostar/models/fetch_ontology_data_response_200.py +60 -0
  88. octostar_python_client-0.1.759/octostar/models/fetch_ontology_data_response_401.py +74 -0
  89. octostar_python_client-0.1.759/octostar/models/fetch_ontology_data_response_500.py +82 -0
  90. octostar_python_client-0.1.759/octostar/models/get_app_logs_response_401.py +74 -0
  91. octostar_python_client-0.1.759/octostar/models/get_app_logs_response_404.py +74 -0
  92. octostar_python_client-0.1.759/octostar/models/get_app_logs_response_500.py +82 -0
  93. octostar_python_client-0.1.759/octostar/models/get_apps_url_json_body.py +76 -0
  94. octostar_python_client-0.1.759/octostar/models/get_apps_url_response_401.py +74 -0
  95. octostar_python_client-0.1.759/octostar/models/get_apps_url_response_500.py +82 -0
  96. octostar_python_client-0.1.759/octostar/models/get_attachment_response_200.py +74 -0
  97. octostar_python_client-0.1.759/octostar/models/get_attachment_response_401.py +74 -0
  98. octostar_python_client-0.1.759/octostar/models/get_files_tree_response_200.py +106 -0
  99. octostar_python_client-0.1.759/octostar/models/get_files_tree_response_200_status.py +8 -0
  100. octostar_python_client-0.1.759/octostar/models/get_files_tree_response_400.py +111 -0
  101. octostar_python_client-0.1.759/octostar/models/get_files_tree_response_400_data.py +60 -0
  102. octostar_python_client-0.1.759/octostar/models/get_files_tree_response_400_status.py +8 -0
  103. octostar_python_client-0.1.759/octostar/models/get_files_tree_response_401.py +74 -0
  104. octostar_python_client-0.1.759/octostar/models/get_files_tree_response_500.py +111 -0
  105. octostar_python_client-0.1.759/octostar/models/get_files_tree_response_500_data.py +60 -0
  106. octostar_python_client-0.1.759/octostar/models/get_files_tree_response_500_status.py +8 -0
  107. octostar_python_client-0.1.759/octostar/models/get_job_logs_response_401.py +74 -0
  108. octostar_python_client-0.1.759/octostar/models/get_job_logs_response_404.py +74 -0
  109. octostar_python_client-0.1.759/octostar/models/get_job_logs_response_500.py +82 -0
  110. octostar_python_client-0.1.759/octostar/models/get_job_progress_response_401.py +74 -0
  111. octostar_python_client-0.1.759/octostar/models/get_object_response_401.py +74 -0
  112. octostar_python_client-0.1.759/octostar/models/get_ontologies_response_401.py +74 -0
  113. octostar_python_client-0.1.759/octostar/models/get_ontologies_response_500.py +81 -0
  114. octostar_python_client-0.1.759/octostar/models/get_permissions_response_200.py +98 -0
  115. octostar_python_client-0.1.759/octostar/models/get_permissions_response_400.py +82 -0
  116. octostar_python_client-0.1.759/octostar/models/get_permissions_response_401.py +74 -0
  117. octostar_python_client-0.1.759/octostar/models/get_permissions_response_500.py +82 -0
  118. octostar_python_client-0.1.759/octostar/models/get_processing_status_response_200.py +104 -0
  119. octostar_python_client-0.1.759/octostar/models/get_processing_status_response_200_data.py +87 -0
  120. octostar_python_client-0.1.759/octostar/models/get_processing_status_response_400.py +82 -0
  121. octostar_python_client-0.1.759/octostar/models/get_processing_status_response_500.py +82 -0
  122. octostar_python_client-0.1.759/octostar/models/get_subscriptions_response_200_item.py +74 -0
  123. octostar_python_client-0.1.759/octostar/models/get_version_response_200.py +74 -0
  124. octostar_python_client-0.1.759/octostar/models/get_version_response_404.py +74 -0
  125. octostar_python_client-0.1.759/octostar/models/get_whoami_response_200.py +129 -0
  126. octostar_python_client-0.1.759/octostar/models/get_whoami_response_401.py +74 -0
  127. octostar_python_client-0.1.759/octostar/models/insert_entity.py +114 -0
  128. octostar_python_client-0.1.759/octostar/models/insert_entity_base.py +266 -0
  129. octostar_python_client-0.1.759/octostar/models/insert_entity_relationships_item.py +107 -0
  130. octostar_python_client-0.1.759/octostar/models/insert_entity_request.py +94 -0
  131. octostar_python_client-0.1.759/octostar/models/internal_server_error.py +82 -0
  132. octostar_python_client-0.1.759/octostar/models/job_execution_result.py +146 -0
  133. octostar_python_client-0.1.759/octostar/models/job_status.py +196 -0
  134. octostar_python_client-0.1.759/octostar/models/job_status_labels.py +60 -0
  135. octostar_python_client-0.1.759/octostar/models/job_with_url.py +82 -0
  136. octostar_python_client-0.1.759/octostar/models/kill_job_response_401.py +74 -0
  137. octostar_python_client-0.1.759/octostar/models/list_app_jobs_response_401.py +74 -0
  138. octostar_python_client-0.1.759/octostar/models/list_app_jobs_response_500.py +82 -0
  139. octostar_python_client-0.1.759/octostar/models/list_apps_response_401.py +74 -0
  140. octostar_python_client-0.1.759/octostar/models/list_apps_response_500.py +82 -0
  141. octostar_python_client-0.1.759/octostar/models/multi_query_json_body.py +100 -0
  142. octostar_python_client-0.1.759/octostar/models/multi_query_json_body_queries_item.py +80 -0
  143. octostar_python_client-0.1.759/octostar/models/multi_query_response_400.py +82 -0
  144. octostar_python_client-0.1.759/octostar/models/multi_query_response_401.py +74 -0
  145. octostar_python_client-0.1.759/octostar/models/not_found_error.py +74 -0
  146. octostar_python_client-0.1.759/octostar/models/octostar_event.py +96 -0
  147. octostar_python_client-0.1.759/octostar/models/octostar_event_octostar_payload.py +100 -0
  148. octostar_python_client-0.1.759/octostar/models/octostar_event_octostar_payload_level.py +11 -0
  149. octostar_python_client-0.1.759/octostar/models/os_notification.py +122 -0
  150. octostar_python_client-0.1.759/octostar/models/processing_status.py +262 -0
  151. octostar_python_client-0.1.759/octostar/models/processing_status_code.py +14 -0
  152. octostar_python_client-0.1.759/octostar/models/progress_request.py +73 -0
  153. octostar_python_client-0.1.759/octostar/models/publish_notification_response_401.py +74 -0
  154. octostar_python_client-0.1.759/octostar/models/pull_events_from_stream_response_401.py +74 -0
  155. octostar_python_client-0.1.759/octostar/models/push_event_to_stream_response_401.py +74 -0
  156. octostar_python_client-0.1.759/octostar/models/query_json_body.py +101 -0
  157. octostar_python_client-0.1.759/octostar/models/query_json_body_params.py +60 -0
  158. octostar_python_client-0.1.759/octostar/models/query_response_400.py +82 -0
  159. octostar_python_client-0.1.759/octostar/models/query_response_401.py +74 -0
  160. octostar_python_client-0.1.759/octostar/models/set_job_progress_response_401.py +74 -0
  161. octostar_python_client-0.1.759/octostar/models/string_to_value_label_map.py +99 -0
  162. octostar_python_client-0.1.759/octostar/models/string_to_value_label_map_data.py +89 -0
  163. octostar_python_client-0.1.759/octostar/models/string_to_value_label_map_data_additional_property.py +80 -0
  164. octostar_python_client-0.1.759/octostar/models/successful_get_tags.py +103 -0
  165. octostar_python_client-0.1.759/octostar/models/successful_insertion.py +98 -0
  166. octostar_python_client-0.1.759/octostar/models/tag_entities_response_401.py +74 -0
  167. octostar_python_client-0.1.759/octostar/models/toast_level.py +11 -0
  168. octostar_python_client-0.1.759/octostar/models/toast_response_401.py +74 -0
  169. octostar_python_client-0.1.759/octostar/models/undeploy_app_response_401.py +74 -0
  170. octostar_python_client-0.1.759/octostar/models/update_processing_status_response_200.py +82 -0
  171. octostar_python_client-0.1.759/octostar/models/update_processing_status_response_400.py +82 -0
  172. octostar_python_client-0.1.759/octostar/models/update_processing_status_response_500.py +82 -0
  173. octostar_python_client-0.1.759/octostar/models/upsert_entities_response_401.py +74 -0
  174. octostar_python_client-0.1.759/octostar/models/upsert_entity.py +114 -0
  175. octostar_python_client-0.1.759/octostar/models/upsert_entity_base.py +266 -0
  176. octostar_python_client-0.1.759/octostar/models/upsert_entity_relationships_item.py +107 -0
  177. octostar_python_client-0.1.759/octostar/py.typed +1 -0
  178. octostar_python_client-0.1.759/octostar/types.py +54 -0
  179. octostar_python_client-0.1.759/octostar/utils/__init__.py +15 -0
  180. octostar_python_client-0.1.759/octostar/utils/chat/__init__.py +0 -0
  181. octostar_python_client-0.1.759/octostar/utils/chat/chat.py +513 -0
  182. octostar_python_client-0.1.759/octostar/utils/chat/detokenize.py +105 -0
  183. octostar_python_client-0.1.759/octostar/utils/chat/get_default_model.py +50 -0
  184. octostar_python_client-0.1.759/octostar/utils/chat/list_models.py +91 -0
  185. octostar_python_client-0.1.759/octostar/utils/chat/tokenize.py +105 -0
  186. octostar_python_client-0.1.759/octostar/utils/commons.py +226 -0
  187. octostar_python_client-0.1.759/octostar/utils/exceptions.py +134 -0
  188. octostar_python_client-0.1.759/octostar/utils/jobs/__init__.py +0 -0
  189. octostar_python_client-0.1.759/octostar/utils/jobs/apps/__init__.py +0 -0
  190. octostar_python_client-0.1.759/octostar/utils/jobs/apps/deploy_app.py +81 -0
  191. octostar_python_client-0.1.759/octostar/utils/jobs/apps/execute_app_job.py +114 -0
  192. octostar_python_client-0.1.759/octostar/utils/jobs/apps/get_app_logs.py +113 -0
  193. octostar_python_client-0.1.759/octostar/utils/jobs/apps/get_app_secret.py +102 -0
  194. octostar_python_client-0.1.759/octostar/utils/jobs/apps/get_apps_url.py +73 -0
  195. octostar_python_client-0.1.759/octostar/utils/jobs/apps/list_app_jobs.py +62 -0
  196. octostar_python_client-0.1.759/octostar/utils/jobs/apps/list_apps.py +126 -0
  197. octostar_python_client-0.1.759/octostar/utils/jobs/apps/undeploy_app.py +48 -0
  198. octostar_python_client-0.1.759/octostar/utils/jobs/get_job_logs.py +113 -0
  199. octostar_python_client-0.1.759/octostar/utils/jobs/get_job_progress.py +76 -0
  200. octostar_python_client-0.1.759/octostar/utils/jobs/kill_job.py +47 -0
  201. octostar_python_client-0.1.759/octostar/utils/jobs/set_job_progress.py +67 -0
  202. octostar_python_client-0.1.759/octostar/utils/meta/__init__.py +0 -0
  203. octostar_python_client-0.1.759/octostar/utils/meta/get_version.py +30 -0
  204. octostar_python_client-0.1.759/octostar/utils/meta/get_whoami.py +30 -0
  205. octostar_python_client-0.1.759/octostar/utils/notifications/__init__.py +0 -0
  206. octostar_python_client-0.1.759/octostar/utils/notifications/delete_stream.py +58 -0
  207. octostar_python_client-0.1.759/octostar/utils/notifications/get_my_subscriptions.py +49 -0
  208. octostar_python_client-0.1.759/octostar/utils/notifications/publish_notification.py +73 -0
  209. octostar_python_client-0.1.759/octostar/utils/notifications/pull_event_from_stream.py +63 -0
  210. octostar_python_client-0.1.759/octostar/utils/notifications/pull_events_from_stream.py +64 -0
  211. octostar_python_client-0.1.759/octostar/utils/notifications/push_event_to_stream.py +109 -0
  212. octostar_python_client-0.1.759/octostar/utils/notifications/push_events_to_stream.py +137 -0
  213. octostar_python_client-0.1.759/octostar/utils/notifications/toast.py +92 -0
  214. octostar_python_client-0.1.759/octostar/utils/ontology/__init__.py +10 -0
  215. octostar_python_client-0.1.759/octostar/utils/ontology/fetch_ontology_data.py +141 -0
  216. octostar_python_client-0.1.759/octostar/utils/ontology/get_ontologies.py +55 -0
  217. octostar_python_client-0.1.759/octostar/utils/ontology/multiquery_ontology.py +287 -0
  218. octostar_python_client-0.1.759/octostar/utils/ontology/query_ontology.py +186 -0
  219. octostar_python_client-0.1.759/octostar/utils/pipeline/__init__.py +1 -0
  220. octostar_python_client-0.1.759/octostar/utils/pipeline/get_processing_status.py +230 -0
  221. octostar_python_client-0.1.759/octostar/utils/pipeline/update_processing_status.py +286 -0
  222. octostar_python_client-0.1.759/octostar/utils/search/__init__.py +11 -0
  223. octostar_python_client-0.1.759/octostar/utils/search/bulk_update.py +138 -0
  224. octostar_python_client-0.1.759/octostar/utils/search/count.py +117 -0
  225. octostar_python_client-0.1.759/octostar/utils/search/get_entity_annotations.py +304 -0
  226. octostar_python_client-0.1.759/octostar/utils/search/get_index_definition.py +111 -0
  227. octostar_python_client-0.1.759/octostar/utils/search/multi_search.py +129 -0
  228. octostar_python_client-0.1.759/octostar/utils/workspace/__init__.py +0 -0
  229. octostar_python_client-0.1.759/octostar/utils/workspace/delete_entities.py +247 -0
  230. octostar_python_client-0.1.759/octostar/utils/workspace/delete_entity.py +81 -0
  231. octostar_python_client-0.1.759/octostar/utils/workspace/delete_relationship.py +78 -0
  232. octostar_python_client-0.1.759/octostar/utils/workspace/delete_relationships.py +85 -0
  233. octostar_python_client-0.1.759/octostar/utils/workspace/delete_temporary_blob.py +85 -0
  234. octostar_python_client-0.1.759/octostar/utils/workspace/extract_entities.py +140 -0
  235. octostar_python_client-0.1.759/octostar/utils/workspace/get_filepath_from_item.py +85 -0
  236. octostar_python_client-0.1.759/octostar/utils/workspace/get_filepaths_from_items.py +100 -0
  237. octostar_python_client-0.1.759/octostar/utils/workspace/get_files_tree.py +102 -0
  238. octostar_python_client-0.1.759/octostar/utils/workspace/get_item_from_filepath.py +102 -0
  239. octostar_python_client-0.1.759/octostar/utils/workspace/get_items_from_filepaths.py +108 -0
  240. octostar_python_client-0.1.759/octostar/utils/workspace/linkcharts/__init__.py +0 -0
  241. octostar_python_client-0.1.759/octostar/utils/workspace/linkcharts/create_linkchart.py +241 -0
  242. octostar_python_client-0.1.759/octostar/utils/workspace/permissions/PermissionLevel.py +8 -0
  243. octostar_python_client-0.1.759/octostar/utils/workspace/permissions/__init__.py +1 -0
  244. octostar_python_client-0.1.759/octostar/utils/workspace/permissions/get_permissions.py +81 -0
  245. octostar_python_client-0.1.759/octostar/utils/workspace/read_attachment.py +284 -0
  246. octostar_python_client-0.1.759/octostar/utils/workspace/read_file.py +113 -0
  247. octostar_python_client-0.1.759/octostar/utils/workspace/read_temporary_blob.py +428 -0
  248. octostar_python_client-0.1.759/octostar/utils/workspace/saved_searches/__init__.py +0 -0
  249. octostar_python_client-0.1.759/octostar/utils/workspace/saved_searches/create_saved_search.py +183 -0
  250. octostar_python_client-0.1.759/octostar/utils/workspace/tags/__init__.py +0 -0
  251. octostar_python_client-0.1.759/octostar/utils/workspace/tags/delete_tag_from_entities.py +96 -0
  252. octostar_python_client-0.1.759/octostar/utils/workspace/tags/tag_entities.py +175 -0
  253. octostar_python_client-0.1.759/octostar/utils/workspace/upsert_entities.py +268 -0
  254. octostar_python_client-0.1.759/octostar/utils/workspace/upsert_entity.py +110 -0
  255. octostar_python_client-0.1.759/octostar/utils/workspace/upsert_relationship.py +128 -0
  256. octostar_python_client-0.1.759/octostar/utils/workspace/upsert_relationships.py +194 -0
  257. octostar_python_client-0.1.759/octostar/utils/workspace/write_attachment.py +263 -0
  258. octostar_python_client-0.1.759/octostar/utils/workspace/write_file.py +335 -0
  259. octostar_python_client-0.1.759/octostar/utils/workspace/write_temporary_blob.py +218 -0
  260. octostar_python_client-0.1.759/octostar_python_client.egg-info/PKG-INFO +159 -0
  261. octostar_python_client-0.1.759/octostar_python_client.egg-info/SOURCES.txt +268 -0
  262. octostar_python_client-0.1.759/octostar_python_client.egg-info/dependency_links.txt +1 -0
  263. octostar_python_client-0.1.759/octostar_python_client.egg-info/requires.txt +15 -0
  264. octostar_python_client-0.1.759/octostar_python_client.egg-info/top_level.txt +1 -0
  265. octostar_python_client-0.1.759/pyproject.toml +60 -0
  266. octostar_python_client-0.1.759/setup.cfg +4 -0
  267. octostar_python_client-0.1.759/tests/conftest.py +464 -0
  268. octostar_python_client-0.1.759/tests/test_contracts.py +1317 -0
  269. octostar_python_client-0.1.759/tests/test_upsert_validation_errors.py +288 -0
  270. octostar_python_client-0.1.759/uv.lock +523 -0
@@ -0,0 +1,170 @@
1
+ # CLAUDE.md — octostar_python_client SDK
2
+
3
+ ## Critical Rule: Do Not Break the Public API
4
+
5
+ This SDK is consumed by **production legacy applications** (Streamlit apps, backend services, scheduled jobs) that import and call its functions directly. The public API surface is a hard contract.
6
+
7
+ ### What you MUST NOT change
8
+
9
+ - **Function signatures**: Every endpoint module exposes `sync()`, `sync_detailed()`, `asyncio()`, `asyncio_detailed()` with their current parameter names, types, and return types. Do not rename, reorder, add required params, or change return types.
10
+ - **Module paths**: Code like `from octostar.api.notifications import delete_stream` must continue to resolve. Do not move, rename, or delete modules.
11
+ - **Model classes**: The `octostar/models/` classes use `@attr.s` with `to_dict()` / `from_dict()`. Their field names map to API JSON keys. Do not rename fields or change serialization.
12
+ - **Client classes**: `Client`, `AuthenticatedClient`, `make_client()`, `as_launching_user()`, `as_running_user()` are the primary entry points. Their interfaces are frozen.
13
+ - **Error classes**: `UnexpectedStatus`, `DeprecatedEndpointError`, `V1MigrationPendingError` are caught by consumer code.
14
+
15
+ ### What you CAN change
16
+
17
+ - **Internal implementation** of `_get_kwargs()`, `_parse_response()`, `_build_response()` — these are private. You can change URLs, add new status code handlers, adjust request construction.
18
+ - **Response body handling** inside `_parse_response()` — as long as the parsed type stays compatible.
19
+ - **Default values** for optional parameters (e.g. timeouts), within reason.
20
+ - **Adding new status code branches** to `_parse_response()` when the FastAPI backend changes behavior.
21
+
22
+ ### When the backend API changes
23
+
24
+ If a FastAPI endpoint changes its URL, request format, or response shape, adapt the SDK's **internal implementation** to keep the external function signatures working. The SDK acts as a compatibility shim between the new backend and old consumer code.
25
+
26
+ Example: if the backend moves from `/api/octostar/streams/{id}` to `/api/v1/streams/{id}`, update `_get_kwargs()` to use `client.get_base_url_v1()` instead of `client.get_base_url_v1()`. The consumer code calling `delete_stream.sync(stream_id="x", client=c)` should not notice.
27
+
28
+ ### When an endpoint is permanently removed
29
+
30
+ Use `DeprecatedEndpointError` — preserve the function signatures but raise on call:
31
+
32
+ ```python
33
+ def sync(stream_id: str, *, client: Any = None, ...) -> Optional[Any]:
34
+ raise DeprecatedEndpointError("delete_stream", "Removed in v2. Use X instead.")
35
+ ```
36
+
37
+ ### When an endpoint is not yet migrated
38
+
39
+ Use `V1MigrationPendingError` to signal the endpoint will exist in the new backend but isn't ready yet.
40
+
41
+ ---
42
+
43
+ ## SDK Architecture
44
+
45
+ ### Origin
46
+
47
+ Originally **generated from OpenAPI spec** (`openapi.json`) targeting the old Superset-based backend. Now manually maintained as the backend migrates to FastAPI. The generation patterns are preserved for consistency.
48
+
49
+ ### Two-Layer Design
50
+
51
+ ```
52
+ octostar/
53
+ ├── api/ # Low-level HTTP layer (generated pattern)
54
+ │ └── <tag>/ # One module per endpoint
55
+ │ └── <op>.py # _get_kwargs → _parse_response → sync/asyncio
56
+ ├── utils/ # High-level helper layer (hand-written)
57
+ │ └── <domain>/ # User-friendly wrappers around api/ modules
58
+ ├── models/ # Data models (@attr.s with to_dict/from_dict)
59
+ ├── client.py # Client, AuthenticatedClient, make_client()
60
+ ├── types.py # Response[T], File, UNSET sentinel
61
+ └── errors.py # UnexpectedStatus, DeprecatedEndpointError, V1MigrationPendingError
62
+ ```
63
+
64
+ **api/ layer**: Raw HTTP — builds request kwargs, parses responses by status code, returns typed `Response[T]`. Each module has exactly 4 public functions + 3 private helpers.
65
+
66
+ **utils/ layer**: Wraps api/ calls with business logic, retries, convenience methods. This is what most consumer code actually uses.
67
+
68
+ ### Endpoint Module Pattern
69
+
70
+ Every module in `api/` follows this exact structure:
71
+
72
+ ```python
73
+ client_missing_msg = '...' # Deprecation warning for default client
74
+
75
+ def _get_kwargs(...) -> Dict: # Build httpx request dict
76
+ def _parse_response(...) -> Optional: # Map status codes to typed models
77
+ def _build_response(...) -> Response: # Wrap in Response[T]
78
+
79
+ def sync_detailed(...) -> Response[T]: # Sync, full response
80
+ def sync(...) -> Optional[T]: # Sync, parsed only
81
+ async def asyncio_detailed(...) -> Response[T]: # Async, full response
82
+ async def asyncio(...) -> Optional[T]: # Async, parsed only
83
+ ```
84
+
85
+ ### Client URL Routing
86
+
87
+ The SDK handles two backend URL schemes:
88
+
89
+ - `client.get_base_url_v1()` — old Superset routes (`/api/octostar/...`)
90
+ - `client.get_base_url_v1()` — new FastAPI routes (`/api/v1/...`), rewrites `home.*` → `api.*` for K8s ingress
91
+
92
+ **Note:** The shared K8s ingress routes `/api/v1/*` to `api.*` regardless of base URL, so either method works for v1 paths.
93
+
94
+ When migrating an endpoint, switch the `_get_kwargs` from `get_base_url_v1()` to `get_base_url_v1()` and update the URL path.
95
+
96
+ ### Authentication
97
+
98
+ Token resolution order (in `AuthenticatedClient`):
99
+ 1. `fixed_token` parameter (explicit)
100
+ 2. File at `/etc/secrets/OS_JWT` (K8s secret mount)
101
+ 3. Environment variable `OS_JWT`
102
+
103
+ The `make_client()` factory reads `OS_API_ENDPOINT`, `OS_ONTOLOGY`, and optional `OS_ANCESTOR`, `OS_APP_NAME` from env vars.
104
+
105
+ ### Models
106
+
107
+ All models use `@attr.s(auto_attribs=True)` with:
108
+ - `to_dict()` / `from_dict()` for JSON serialization
109
+ - `additional_properties: Dict[str, Any]` for extensibility (unknown API fields)
110
+ - Dict-like access (`__getitem__`, `__setitem__`) for additional properties
111
+
112
+ Response models are status-code-specific: `GetWhoamiResponse200`, `QueryResponse401`, etc.
113
+
114
+ ---
115
+
116
+ ## Testing
117
+
118
+ ### Contract Tests (`tests/test_contracts.py`)
119
+
120
+ Validate SDK request construction against `openapi.json` **without network calls**:
121
+ - Every endpoint module has standard functions
122
+ - Request URLs match OpenAPI paths
123
+ - Request bodies match schemas
124
+
125
+ Run: `pytest octostar_python_client/tests/`
126
+
127
+ Note: These tests require the `octostar` package to be importable. If they fail with `ModuleNotFoundError: No module named 'octostar'`, the package needs to be installed in editable mode or the path needs to be on `PYTHONPATH`.
128
+
129
+ ### Backend Integration Tests
130
+
131
+ The FastAPI backend has its own tests in `tests/api/v1/` that test the actual endpoints. SDK contract tests complement these by verifying the SDK constructs valid requests.
132
+
133
+ ---
134
+
135
+ ## Common Tasks
136
+
137
+ ### Migrating an endpoint from Superset to FastAPI
138
+
139
+ 1. In `_get_kwargs()`: change `get_base_url_v1()` → `get_base_url_v1()` and update the URL path
140
+ 2. In `_parse_response()`: update status code handling if response shapes changed
141
+ 3. Keep function signatures identical
142
+ 4. Update `openapi.json` if maintaining spec accuracy
143
+
144
+ ### Adding a new status code handler
145
+
146
+ Add a new `if response.status_code == HTTPStatus.XXX:` branch in `_parse_response()`. No signature changes needed.
147
+
148
+ ### Deprecating an endpoint
149
+
150
+ Replace function bodies with `raise DeprecatedEndpointError(...)`. Keep signatures intact for import compatibility.
151
+
152
+ ---
153
+
154
+ ## Releasing & testing PR builds
155
+
156
+ Publishing is automated (no manual publish):
157
+
158
+ - **On merge to `main`**, the octostar-api release pipeline publishes the SDK to
159
+ PyPI via OIDC trusted publishing, versioned to the octostar-api GitVersion tag.
160
+ - **On every PR** touching the SDK, `sdk_build.yml` publishes a pre-release to
161
+ TestPyPI versioned `0.0.<pr>.dev<run_number>` so a PR's changes can be
162
+ installed and tested before merge.
163
+
164
+ To install a PR build, point at TestPyPI for the package and PyPI for the deps
165
+ (TestPyPI does not host `httpx`, `tenacity`, …). Full pip/uv commands are in
166
+ `README.md` → "Testing a PR build (TestPyPI)".
167
+
168
+ The version is injected at build time via the `SDK_VERSION` env var, applied by
169
+ `scripts/sdk/set_version.py`. Keep the `version` in `pyproject.toml` as a
170
+ local-dev fallback only.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Octostar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,159 @@
1
+ Metadata-Version: 2.4
2
+ Name: octostar-python-client
3
+ Version: 0.1.759
4
+ Summary: A client library for accessing Octostar API
5
+ Author-email: Octostar <systems@octostar.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://octostar.com
8
+ Project-URL: Repository, https://github.com/Octostarco/octostar-api
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Natural Language :: English
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Software Development :: Libraries
20
+ Requires-Python: >=3.9
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: httpx<0.28.0,>=0.20.0
24
+ Requires-Dist: attrs>=21.3.0
25
+ Requires-Dist: python-dateutil<3,>=2.8.0
26
+ Requires-Dist: PyJWT<3,>=2.0.0
27
+ Requires-Dist: python-dotenv<2,>=1.0.0
28
+ Requires-Dist: tenacity<9,>=8.3.0
29
+ Requires-Dist: aiofiles>=22.0.0
30
+ Requires-Dist: pytimeparse<2,>=1.1.0
31
+ Provides-Extra: streamlit
32
+ Requires-Dist: octostar-streamlit<1,>=0.1.26; extra == "streamlit"
33
+ Provides-Extra: test
34
+ Requires-Dist: pytest>=7.0; extra == "test"
35
+ Requires-Dist: pytest-asyncio>=0.21; extra == "test"
36
+ Dynamic: license-file
37
+
38
+ # octostar-python-client
39
+ A client library for accessing Octostar API
40
+
41
+ ## Usage
42
+ First, create a client:
43
+
44
+ ```python
45
+ from octostar import Client
46
+
47
+ client = Client(base_url="https://api.example.com")
48
+ ```
49
+
50
+ If the endpoints you're going to hit require authentication, use `AuthenticatedClient` instead:
51
+
52
+ ```python
53
+ from octostar import AuthenticatedClient
54
+
55
+ client = AuthenticatedClient(base_url="https://api.example.com", token="SuperSecretToken")
56
+ ```
57
+
58
+ Now call your endpoint and use your models:
59
+
60
+ ```python
61
+ from octostar.models import MyDataModel
62
+ from octostar.api.my_tag import get_my_data_model
63
+ from octostar.types import Response
64
+
65
+ my_data: MyDataModel = get_my_data_model.sync(client=client)
66
+ # or if you need more info (e.g. status_code)
67
+ response: Response[MyDataModel] = get_my_data_model.sync_detailed(client=client)
68
+ ```
69
+
70
+ Or do the same thing with an async version:
71
+
72
+ ```python
73
+ from octostar.models import MyDataModel
74
+ from octostar.api.my_tag import get_my_data_model
75
+ from octostar.types import Response
76
+
77
+ my_data: MyDataModel = await get_my_data_model.asyncio(client=client)
78
+ response: Response[MyDataModel] = await get_my_data_model.asyncio_detailed(client=client)
79
+ ```
80
+
81
+ By default, when you're calling an HTTPS API it will attempt to verify that SSL is working correctly. Using certificate verification is highly recommended most of the time, but sometimes you may need to authenticate to a server (especially an internal server) using a custom certificate bundle.
82
+
83
+ ```python
84
+ client = AuthenticatedClient(
85
+ base_url="https://internal_api.example.com",
86
+ token="SuperSecretToken",
87
+ verify_ssl="/path/to/certificate_bundle.pem",
88
+ )
89
+ ```
90
+
91
+ You can also disable certificate validation altogether, but beware that **this is a security risk**.
92
+
93
+ ```python
94
+ client = AuthenticatedClient(
95
+ base_url="https://internal_api.example.com",
96
+ token="SuperSecretToken",
97
+ verify_ssl=False
98
+ )
99
+ ```
100
+
101
+ There are more settings on the generated `Client` class which let you control more runtime behavior, check out the docstring on that class for more info.
102
+
103
+ Things to know:
104
+ 1. Every path/method combo becomes a Python module with four functions:
105
+ 1. `sync`: Blocking request that returns parsed data (if successful) or `None`
106
+ 1. `sync_detailed`: Blocking request that always returns a `Request`, optionally with `parsed` set if the request was successful.
107
+ 1. `asyncio`: Like `sync` but async instead of blocking
108
+ 1. `asyncio_detailed`: Like `sync_detailed` but async instead of blocking
109
+
110
+ 1. All path/query params, and bodies become method arguments.
111
+ 1. If your endpoint had any tags on it, the first tag will be used as a module name for the function (my_tag above)
112
+ 1. Any endpoint which did not have a tag will be in `octostar.api.default`
113
+
114
+ ## Installing
115
+
116
+ ```bash
117
+ pip install octostar-python-client
118
+ ```
119
+
120
+ ### Testing a PR build (TestPyPI)
121
+
122
+ Every pull request that touches the SDK publishes a pre-release to
123
+ [TestPyPI](https://test.pypi.org/project/octostar-python-client/) versioned
124
+ `0.0.<pr>.dev<run_number>` (e.g. `0.0.898.dev1319`) — the `<pr>` segment is the
125
+ PR number, so you can find the build for your PR. Use it to test SDK changes
126
+ before they merge.
127
+
128
+ TestPyPI does not host third-party dependencies (`httpx`, `tenacity`, …), so
129
+ point the resolver at PyPI as an extra index for them:
130
+
131
+ ```bash
132
+ # pip
133
+ pip install \
134
+ --index-url https://test.pypi.org/simple/ \
135
+ --extra-index-url https://pypi.org/simple/ \
136
+ octostar-python-client==0.0.<pr>.dev<N>
137
+ ```
138
+
139
+ ```bash
140
+ # uv (--index-strategy so uv considers both indexes per-package)
141
+ uv pip install \
142
+ --index-url https://test.pypi.org/simple/ \
143
+ --extra-index-url https://pypi.org/simple/ \
144
+ --index-strategy unsafe-best-match \
145
+ octostar-python-client==0.0.<pr>.dev<N>
146
+ ```
147
+
148
+ ## Releasing
149
+
150
+ Releases are automated. On every merge to `main`, the octostar-api release
151
+ pipeline builds this package and publishes it to PyPI, stamped with the
152
+ octostar-api version. There is no manual publish step.
153
+
154
+ To build the package locally for development:
155
+
156
+ ```bash
157
+ ./scripts/sdk/build.sh # writes octostar_python_client/dist/*.whl and *.tar.gz
158
+ pip install octostar_python_client/dist/*.whl
159
+ ```
@@ -0,0 +1,122 @@
1
+ # octostar-python-client
2
+ A client library for accessing Octostar API
3
+
4
+ ## Usage
5
+ First, create a client:
6
+
7
+ ```python
8
+ from octostar import Client
9
+
10
+ client = Client(base_url="https://api.example.com")
11
+ ```
12
+
13
+ If the endpoints you're going to hit require authentication, use `AuthenticatedClient` instead:
14
+
15
+ ```python
16
+ from octostar import AuthenticatedClient
17
+
18
+ client = AuthenticatedClient(base_url="https://api.example.com", token="SuperSecretToken")
19
+ ```
20
+
21
+ Now call your endpoint and use your models:
22
+
23
+ ```python
24
+ from octostar.models import MyDataModel
25
+ from octostar.api.my_tag import get_my_data_model
26
+ from octostar.types import Response
27
+
28
+ my_data: MyDataModel = get_my_data_model.sync(client=client)
29
+ # or if you need more info (e.g. status_code)
30
+ response: Response[MyDataModel] = get_my_data_model.sync_detailed(client=client)
31
+ ```
32
+
33
+ Or do the same thing with an async version:
34
+
35
+ ```python
36
+ from octostar.models import MyDataModel
37
+ from octostar.api.my_tag import get_my_data_model
38
+ from octostar.types import Response
39
+
40
+ my_data: MyDataModel = await get_my_data_model.asyncio(client=client)
41
+ response: Response[MyDataModel] = await get_my_data_model.asyncio_detailed(client=client)
42
+ ```
43
+
44
+ By default, when you're calling an HTTPS API it will attempt to verify that SSL is working correctly. Using certificate verification is highly recommended most of the time, but sometimes you may need to authenticate to a server (especially an internal server) using a custom certificate bundle.
45
+
46
+ ```python
47
+ client = AuthenticatedClient(
48
+ base_url="https://internal_api.example.com",
49
+ token="SuperSecretToken",
50
+ verify_ssl="/path/to/certificate_bundle.pem",
51
+ )
52
+ ```
53
+
54
+ You can also disable certificate validation altogether, but beware that **this is a security risk**.
55
+
56
+ ```python
57
+ client = AuthenticatedClient(
58
+ base_url="https://internal_api.example.com",
59
+ token="SuperSecretToken",
60
+ verify_ssl=False
61
+ )
62
+ ```
63
+
64
+ There are more settings on the generated `Client` class which let you control more runtime behavior, check out the docstring on that class for more info.
65
+
66
+ Things to know:
67
+ 1. Every path/method combo becomes a Python module with four functions:
68
+ 1. `sync`: Blocking request that returns parsed data (if successful) or `None`
69
+ 1. `sync_detailed`: Blocking request that always returns a `Request`, optionally with `parsed` set if the request was successful.
70
+ 1. `asyncio`: Like `sync` but async instead of blocking
71
+ 1. `asyncio_detailed`: Like `sync_detailed` but async instead of blocking
72
+
73
+ 1. All path/query params, and bodies become method arguments.
74
+ 1. If your endpoint had any tags on it, the first tag will be used as a module name for the function (my_tag above)
75
+ 1. Any endpoint which did not have a tag will be in `octostar.api.default`
76
+
77
+ ## Installing
78
+
79
+ ```bash
80
+ pip install octostar-python-client
81
+ ```
82
+
83
+ ### Testing a PR build (TestPyPI)
84
+
85
+ Every pull request that touches the SDK publishes a pre-release to
86
+ [TestPyPI](https://test.pypi.org/project/octostar-python-client/) versioned
87
+ `0.0.<pr>.dev<run_number>` (e.g. `0.0.898.dev1319`) — the `<pr>` segment is the
88
+ PR number, so you can find the build for your PR. Use it to test SDK changes
89
+ before they merge.
90
+
91
+ TestPyPI does not host third-party dependencies (`httpx`, `tenacity`, …), so
92
+ point the resolver at PyPI as an extra index for them:
93
+
94
+ ```bash
95
+ # pip
96
+ pip install \
97
+ --index-url https://test.pypi.org/simple/ \
98
+ --extra-index-url https://pypi.org/simple/ \
99
+ octostar-python-client==0.0.<pr>.dev<N>
100
+ ```
101
+
102
+ ```bash
103
+ # uv (--index-strategy so uv considers both indexes per-package)
104
+ uv pip install \
105
+ --index-url https://test.pypi.org/simple/ \
106
+ --extra-index-url https://pypi.org/simple/ \
107
+ --index-strategy unsafe-best-match \
108
+ octostar-python-client==0.0.<pr>.dev<N>
109
+ ```
110
+
111
+ ## Releasing
112
+
113
+ Releases are automated. On every merge to `main`, the octostar-api release
114
+ pipeline builds this package and publishes it to PyPI, stamped with the
115
+ octostar-api version. There is no manual publish step.
116
+
117
+ To build the package locally for development:
118
+
119
+ ```bash
120
+ ./scripts/sdk/build.sh # writes octostar_python_client/dist/*.whl and *.tar.gz
121
+ pip install octostar_python_client/dist/*.whl
122
+ ```
File without changes
@@ -0,0 +1,54 @@
1
+ # SDK examples
2
+
3
+ Runnable scripts that exercise the `octostar` SDK against a live Octostar
4
+ backend. They're meant for manual testing and as copy-paste starting points,
5
+ not as automated tests.
6
+
7
+ ## `create_linkchart_demo.py`
8
+
9
+ Interactive end-to-end demo for `create_linkchart`. It:
10
+
11
+ 1. Connects using your JWT and API endpoint.
12
+ 2. Searches workspaces by name and lets you pick one.
13
+ 3. Searches people by name (one or more) and lets you pick them.
14
+ 4. Discovers each person's relationships from the ontology and pulls in the
15
+ related entities (their phones, cars, and anything else the ontology links
16
+ to a person).
17
+ 5. Saves the result as a linkchart in the chosen workspace.
18
+
19
+ This verifies the linkchart is written in the current format — an `os_file`
20
+ entity whose attachment body holds the
21
+ `application/octostar-linkchart-settings+json` graph — rather than the legacy
22
+ `os_linkchart` shape.
23
+
24
+ ### Run it
25
+
26
+ ```bash
27
+ export OS_JWT='your.jwt.token'
28
+ export OS_API_ENDPOINT='https://home.main.octostar.com/'
29
+ export OS_ONTOLOGY='os_ontology_v1'
30
+
31
+ uv run python octostar_python_client/examples/create_linkchart_demo.py
32
+ ```
33
+
34
+ When it finishes it prints the new chart's id and a link to open the
35
+ workspace. Open the chart in the linkchart UI to confirm the nodes and edges
36
+ render.
37
+
38
+ ### Useful flags
39
+
40
+ | Flag | Purpose |
41
+ | --- | --- |
42
+ | `--ontology` | Ontology name (defaults to `$OS_ONTOLOGY`, else prompted). |
43
+ | `--person-concept` | Concept to search people in (default `os_person`). |
44
+ | `--concepts` | Comma-separated substrings to keep only some neighbour types, e.g. `phone,car`. Empty = include every related entity. |
45
+ | `--search-limit` | Max people returned per name search (default 15). |
46
+ | `--chart-name` | Name for the linkchart (default: prompted). |
47
+
48
+ ### Notes
49
+
50
+ - Many-to-many relationships are not traversed by the simple join path and are
51
+ skipped with an `INFO` log; the people you pick plus their one-to-many
52
+ neighbours still make it onto the chart.
53
+ - The script prints each relationship it follows, so a first run is also a
54
+ quick way to learn what your ontology actually calls "phone", "car", etc.