coco-framework 0.1.0__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.
Files changed (400) hide show
  1. coco/__init__.py +3 -0
  2. coco/agents/__init__.py +9 -0
  3. coco/agents/_subagent_transformer.py +307 -0
  4. coco/agents/factory.py +2164 -0
  5. coco/agents/middleware/__init__.py +100 -0
  6. coco/agents/middleware/_execution.py +385 -0
  7. coco/agents/middleware/_redaction.py +454 -0
  8. coco/agents/middleware/_retry.py +134 -0
  9. coco/agents/middleware/_trace_policy.py +61 -0
  10. coco/agents/middleware/context_editing.py +306 -0
  11. coco/agents/middleware/file_search.py +433 -0
  12. coco/agents/middleware/human_in_the_loop.py +680 -0
  13. coco/agents/middleware/internal_call_transformer.py +108 -0
  14. coco/agents/middleware/model_call_limit.py +267 -0
  15. coco/agents/middleware/model_fallback.py +417 -0
  16. coco/agents/middleware/model_retry.py +327 -0
  17. coco/agents/middleware/pii.py +878 -0
  18. coco/agents/middleware/provider_tool_search.py +307 -0
  19. coco/agents/middleware/shell_tool.py +949 -0
  20. coco/agents/middleware/summarization.py +910 -0
  21. coco/agents/middleware/todo.py +357 -0
  22. coco/agents/middleware/tool_call_limit.py +495 -0
  23. coco/agents/middleware/tool_emulator.py +251 -0
  24. coco/agents/middleware/tool_error.py +209 -0
  25. coco/agents/middleware/tool_retry.py +421 -0
  26. coco/agents/middleware/tool_selection.py +515 -0
  27. coco/agents/middleware/types.py +2201 -0
  28. coco/agents/structured_output.py +472 -0
  29. coco/chat_models/__init__.py +7 -0
  30. coco/chat_models/base.py +1082 -0
  31. coco/embeddings/__init__.py +18 -0
  32. coco/embeddings/base.py +279 -0
  33. coco/mcp/__init__.py +36 -0
  34. coco/mcp/adapter.py +245 -0
  35. coco/mcp/elicitation.py +394 -0
  36. coco/mcp/tools.py +307 -0
  37. coco/messages/__init__.py +73 -0
  38. coco/py.typed +0 -0
  39. coco/rate_limiters/__init__.py +13 -0
  40. coco/tools/__init__.py +22 -0
  41. coco/tools/tool_node.py +20 -0
  42. coco_anthropic/__init__.py +15 -0
  43. coco_anthropic/_client_utils.py +81 -0
  44. coco_anthropic/_compat.py +228 -0
  45. coco_anthropic/_sdk_compat.py +124 -0
  46. coco_anthropic/_version.py +3 -0
  47. coco_anthropic/chat_models.py +3349 -0
  48. coco_anthropic/data/__init__.py +1 -0
  49. coco_anthropic/data/_profiles.py +491 -0
  50. coco_anthropic/data/profile_augmentations.toml +69 -0
  51. coco_anthropic/experimental.py +140 -0
  52. coco_anthropic/llms.py +428 -0
  53. coco_anthropic/middleware/__init__.py +25 -0
  54. coco_anthropic/middleware/anthropic_tools.py +1197 -0
  55. coco_anthropic/middleware/bash.py +84 -0
  56. coco_anthropic/middleware/file_search.py +360 -0
  57. coco_anthropic/middleware/prompt_caching.py +276 -0
  58. coco_anthropic/output_parsers.py +93 -0
  59. coco_anthropic/py.typed +0 -0
  60. coco_core/__init__.py +20 -0
  61. coco_core/_api/__init__.py +87 -0
  62. coco_core/_api/beta_decorator.py +266 -0
  63. coco_core/_api/deprecation.py +637 -0
  64. coco_core/_api/internal.py +23 -0
  65. coco_core/_api/path.py +50 -0
  66. coco_core/_import_utils.py +41 -0
  67. coco_core/_protocol.py +625 -0
  68. coco_core/_security/__init__.py +36 -0
  69. coco_core/_security/_exceptions.py +9 -0
  70. coco_core/_security/_policy.py +313 -0
  71. coco_core/_security/_ssrf_protection.py +155 -0
  72. coco_core/_security/_transport.py +254 -0
  73. coco_core/agents.py +258 -0
  74. coco_core/caches.py +272 -0
  75. coco_core/callbacks/__init__.py +132 -0
  76. coco_core/callbacks/base.py +1229 -0
  77. coco_core/callbacks/file.py +266 -0
  78. coco_core/callbacks/manager.py +2826 -0
  79. coco_core/callbacks/stdout.py +123 -0
  80. coco_core/callbacks/streaming_stdout.py +154 -0
  81. coco_core/callbacks/usage.py +124 -0
  82. coco_core/chat_history.py +267 -0
  83. coco_core/chat_loaders.py +26 -0
  84. coco_core/chat_sessions.py +19 -0
  85. coco_core/cross_encoders.py +18 -0
  86. coco_core/document_loaders/__init__.py +36 -0
  87. coco_core/document_loaders/base.py +155 -0
  88. coco_core/document_loaders/blob_loaders.py +38 -0
  89. coco_core/documents/__init__.py +55 -0
  90. coco_core/documents/base.py +347 -0
  91. coco_core/documents/compressor.py +74 -0
  92. coco_core/documents/transformers.py +79 -0
  93. coco_core/embeddings/__init__.py +31 -0
  94. coco_core/embeddings/embeddings.py +78 -0
  95. coco_core/embeddings/fake.py +129 -0
  96. coco_core/env.py +22 -0
  97. coco_core/example_selectors/__init__.py +47 -0
  98. coco_core/example_selectors/base.py +60 -0
  99. coco_core/example_selectors/length_based.py +131 -0
  100. coco_core/example_selectors/semantic_similarity.py +366 -0
  101. coco_core/exceptions.py +166 -0
  102. coco_core/globals.py +72 -0
  103. coco_core/indexing/__init__.py +53 -0
  104. coco_core/indexing/api.py +954 -0
  105. coco_core/indexing/base.py +661 -0
  106. coco_core/indexing/in_memory.py +104 -0
  107. coco_core/language_models/__init__.py +116 -0
  108. coco_core/language_models/_compat_bridge.py +844 -0
  109. coco_core/language_models/_utils.py +343 -0
  110. coco_core/language_models/base.py +500 -0
  111. coco_core/language_models/chat_model_stream.py +1525 -0
  112. coco_core/language_models/chat_models.py +2748 -0
  113. coco_core/language_models/fake.py +137 -0
  114. coco_core/language_models/fake_chat_models.py +396 -0
  115. coco_core/language_models/llms.py +1569 -0
  116. coco_core/language_models/model_profile.py +183 -0
  117. coco_core/load/__init__.py +44 -0
  118. coco_core/load/_validation.py +191 -0
  119. coco_core/load/dump.py +120 -0
  120. coco_core/load/load.py +828 -0
  121. coco_core/load/mapping.py +1097 -0
  122. coco_core/load/serializable.py +406 -0
  123. coco_core/messages/__init__.py +198 -0
  124. coco_core/messages/ai.py +854 -0
  125. coco_core/messages/base.py +518 -0
  126. coco_core/messages/block_translators/__init__.py +112 -0
  127. coco_core/messages/block_translators/anthropic.py +534 -0
  128. coco_core/messages/block_translators/bedrock.py +108 -0
  129. coco_core/messages/block_translators/bedrock_converse.py +329 -0
  130. coco_core/messages/block_translators/coco_v0.py +303 -0
  131. coco_core/messages/block_translators/google_genai.py +610 -0
  132. coco_core/messages/block_translators/google_vertexai.py +21 -0
  133. coco_core/messages/block_translators/groq.py +157 -0
  134. coco_core/messages/block_translators/openai.py +1089 -0
  135. coco_core/messages/chat.py +64 -0
  136. coco_core/messages/content.py +1488 -0
  137. coco_core/messages/function.py +62 -0
  138. coco_core/messages/human.py +70 -0
  139. coco_core/messages/modifier.py +33 -0
  140. coco_core/messages/system.py +70 -0
  141. coco_core/messages/tool.py +418 -0
  142. coco_core/messages/utils.py +2442 -0
  143. coco_core/output_parsers/__init__.py +101 -0
  144. coco_core/output_parsers/base.py +361 -0
  145. coco_core/output_parsers/format_instructions.py +16 -0
  146. coco_core/output_parsers/json.py +139 -0
  147. coco_core/output_parsers/list.py +249 -0
  148. coco_core/output_parsers/openai_functions.py +324 -0
  149. coco_core/output_parsers/openai_tools.py +383 -0
  150. coco_core/output_parsers/pydantic.py +141 -0
  151. coco_core/output_parsers/string.py +63 -0
  152. coco_core/output_parsers/transform.py +175 -0
  153. coco_core/output_parsers/xml.py +301 -0
  154. coco_core/outputs/__init__.py +66 -0
  155. coco_core/outputs/chat_generation.py +147 -0
  156. coco_core/outputs/chat_result.py +39 -0
  157. coco_core/outputs/generation.py +80 -0
  158. coco_core/outputs/llm_result.py +112 -0
  159. coco_core/outputs/run_info.py +22 -0
  160. coco_core/prompt_values.py +161 -0
  161. coco_core/prompts/__init__.py +101 -0
  162. coco_core/prompts/base.py +508 -0
  163. coco_core/prompts/chat.py +1495 -0
  164. coco_core/prompts/dict.py +177 -0
  165. coco_core/prompts/few_shot.py +483 -0
  166. coco_core/prompts/few_shot_with_templates.py +239 -0
  167. coco_core/prompts/image.py +177 -0
  168. coco_core/prompts/loading.py +296 -0
  169. coco_core/prompts/message.py +97 -0
  170. coco_core/prompts/prompt.py +312 -0
  171. coco_core/prompts/string.py +399 -0
  172. coco_core/prompts/structured.py +214 -0
  173. coco_core/py.typed +0 -0
  174. coco_core/rate_limiters.py +254 -0
  175. coco_core/retrievers.py +328 -0
  176. coco_core/runnables/__init__.py +136 -0
  177. coco_core/runnables/base.py +6725 -0
  178. coco_core/runnables/branch.py +457 -0
  179. coco_core/runnables/config.py +712 -0
  180. coco_core/runnables/configurable.py +710 -0
  181. coco_core/runnables/fallbacks.py +663 -0
  182. coco_core/runnables/graph.py +741 -0
  183. coco_core/runnables/graph_ascii.py +366 -0
  184. coco_core/runnables/graph_mermaid.py +503 -0
  185. coco_core/runnables/graph_png.py +215 -0
  186. coco_core/runnables/history.py +631 -0
  187. coco_core/runnables/passthrough.py +849 -0
  188. coco_core/runnables/retry.py +379 -0
  189. coco_core/runnables/router.py +239 -0
  190. coco_core/runnables/schema.py +188 -0
  191. coco_core/runnables/utils.py +798 -0
  192. coco_core/stores.py +291 -0
  193. coco_core/structured_query.py +203 -0
  194. coco_core/sys_info.py +154 -0
  195. coco_core/tools/__init__.py +95 -0
  196. coco_core/tools/base.py +1948 -0
  197. coco_core/tools/convert.py +497 -0
  198. coco_core/tools/render.py +67 -0
  199. coco_core/tools/retriever.py +94 -0
  200. coco_core/tools/simple.py +208 -0
  201. coco_core/tools/structured.py +322 -0
  202. coco_core/tracers/__init__.py +47 -0
  203. coco_core/tracers/_compat.py +95 -0
  204. coco_core/tracers/_context.py +337 -0
  205. coco_core/tracers/_streaming.py +53 -0
  206. coco_core/tracers/base.py +955 -0
  207. coco_core/tracers/coco.py +279 -0
  208. coco_core/tracers/context.py +205 -0
  209. coco_core/tracers/core.py +766 -0
  210. coco_core/tracers/event_stream.py +1101 -0
  211. coco_core/tracers/log_stream.py +765 -0
  212. coco_core/tracers/memory_stream.py +200 -0
  213. coco_core/tracers/root_listeners.py +130 -0
  214. coco_core/tracers/run_collector.py +40 -0
  215. coco_core/tracers/schemas.py +14 -0
  216. coco_core/tracers/stdout.py +205 -0
  217. coco_core/utils/__init__.py +111 -0
  218. coco_core/utils/_gateway.py +274 -0
  219. coco_core/utils/_merge.py +218 -0
  220. coco_core/utils/aiter.py +357 -0
  221. coco_core/utils/env.py +86 -0
  222. coco_core/utils/formatting.py +80 -0
  223. coco_core/utils/function_calling.py +869 -0
  224. coco_core/utils/html.py +132 -0
  225. coco_core/utils/image.py +15 -0
  226. coco_core/utils/input.py +82 -0
  227. coco_core/utils/interactive_env.py +12 -0
  228. coco_core/utils/iter.py +229 -0
  229. coco_core/utils/json.py +230 -0
  230. coco_core/utils/json_schema.py +273 -0
  231. coco_core/utils/mustache.py +706 -0
  232. coco_core/utils/pydantic.py +631 -0
  233. coco_core/utils/strings.py +69 -0
  234. coco_core/utils/usage.py +61 -0
  235. coco_core/utils/utils.py +528 -0
  236. coco_core/utils/uuid.py +57 -0
  237. coco_core/vectorstores/__init__.py +53 -0
  238. coco_core/vectorstores/base.py +1111 -0
  239. coco_core/vectorstores/in_memory.py +546 -0
  240. coco_core/vectorstores/utils.py +163 -0
  241. coco_core/version.py +3 -0
  242. coco_framework-0.1.0.dist-info/METADATA +184 -0
  243. coco_framework-0.1.0.dist-info/RECORD +400 -0
  244. coco_framework-0.1.0.dist-info/WHEEL +4 -0
  245. coco_framework-0.1.0.dist-info/licenses/LICENSE +24 -0
  246. coco_framework-0.1.0.dist-info/licenses/NOTICE +15 -0
  247. coco_graph/_internal/__init__.py +4 -0
  248. coco_graph/_internal/_cache.py +31 -0
  249. coco_graph/_internal/_config.py +474 -0
  250. coco_graph/_internal/_constants.py +140 -0
  251. coco_graph/_internal/_fields.py +213 -0
  252. coco_graph/_internal/_future.py +220 -0
  253. coco_graph/_internal/_pydantic.py +275 -0
  254. coco_graph/_internal/_queue.py +124 -0
  255. coco_graph/_internal/_replay.py +90 -0
  256. coco_graph/_internal/_retry.py +29 -0
  257. coco_graph/_internal/_runnable.py +969 -0
  258. coco_graph/_internal/_scratchpad.py +19 -0
  259. coco_graph/_internal/_serde.py +253 -0
  260. coco_graph/_internal/_timeout.py +25 -0
  261. coco_graph/_internal/_typing.py +54 -0
  262. coco_graph/cache/base/__init__.py +48 -0
  263. coco_graph/cache/base/py.typed +0 -0
  264. coco_graph/cache/memory/__init__.py +73 -0
  265. coco_graph/cache/redis/__init__.py +144 -0
  266. coco_graph/cache/sqlite/__init__.py +120 -0
  267. coco_graph/callbacks.py +394 -0
  268. coco_graph/channels/__init__.py +29 -0
  269. coco_graph/channels/any_value.py +72 -0
  270. coco_graph/channels/base.py +121 -0
  271. coco_graph/channels/binop.py +155 -0
  272. coco_graph/channels/delta.py +202 -0
  273. coco_graph/channels/ephemeral_value.py +79 -0
  274. coco_graph/channels/last_value.py +151 -0
  275. coco_graph/channels/named_barrier_value.py +167 -0
  276. coco_graph/channels/topic.py +94 -0
  277. coco_graph/channels/untracked_value.py +73 -0
  278. coco_graph/checkpoint/base/__init__.py +861 -0
  279. coco_graph/checkpoint/base/id.py +109 -0
  280. coco_graph/checkpoint/base/py.typed +0 -0
  281. coco_graph/checkpoint/memory/__init__.py +698 -0
  282. coco_graph/checkpoint/memory/py.typed +0 -0
  283. coco_graph/checkpoint/postgres/__init__.py +602 -0
  284. coco_graph/checkpoint/postgres/_ainternal.py +23 -0
  285. coco_graph/checkpoint/postgres/_internal.py +21 -0
  286. coco_graph/checkpoint/postgres/aio.py +691 -0
  287. coco_graph/checkpoint/postgres/base.py +666 -0
  288. coco_graph/checkpoint/postgres/py.typed +0 -0
  289. coco_graph/checkpoint/postgres/shallow.py +967 -0
  290. coco_graph/checkpoint/serde/__init__.py +0 -0
  291. coco_graph/checkpoint/serde/_msgpack.py +97 -0
  292. coco_graph/checkpoint/serde/base.py +64 -0
  293. coco_graph/checkpoint/serde/encrypted.py +80 -0
  294. coco_graph/checkpoint/serde/event_hooks.py +52 -0
  295. coco_graph/checkpoint/serde/jsonplus.py +883 -0
  296. coco_graph/checkpoint/serde/py.typed +0 -0
  297. coco_graph/checkpoint/serde/types.py +68 -0
  298. coco_graph/checkpoint/sqlite/__init__.py +645 -0
  299. coco_graph/checkpoint/sqlite/_delta.py +172 -0
  300. coco_graph/checkpoint/sqlite/aio.py +738 -0
  301. coco_graph/checkpoint/sqlite/py.typed +0 -0
  302. coco_graph/checkpoint/sqlite/utils.py +116 -0
  303. coco_graph/config.py +196 -0
  304. coco_graph/constants.py +64 -0
  305. coco_graph/errors.py +241 -0
  306. coco_graph/func/__init__.py +620 -0
  307. coco_graph/graph/__init__.py +12 -0
  308. coco_graph/graph/_branch.py +225 -0
  309. coco_graph/graph/_node.py +103 -0
  310. coco_graph/graph/message.py +437 -0
  311. coco_graph/graph/state.py +1978 -0
  312. coco_graph/graph/ui.py +227 -0
  313. coco_graph/managed/__init__.py +3 -0
  314. coco_graph/managed/base.py +31 -0
  315. coco_graph/managed/is_last_step.py +24 -0
  316. coco_graph/prebuilt/__init__.py +23 -0
  317. coco_graph/prebuilt/_tool_call_stream.py +117 -0
  318. coco_graph/prebuilt/_tool_call_transformer.py +165 -0
  319. coco_graph/prebuilt/chat_agent_executor.py +1015 -0
  320. coco_graph/prebuilt/interrupt.py +105 -0
  321. coco_graph/prebuilt/py.typed +0 -0
  322. coco_graph/prebuilt/tool_node.py +2030 -0
  323. coco_graph/prebuilt/tool_validator.py +221 -0
  324. coco_graph/pregel/__init__.py +3 -0
  325. coco_graph/pregel/_algo.py +1460 -0
  326. coco_graph/pregel/_call.py +298 -0
  327. coco_graph/pregel/_checkpoint.py +331 -0
  328. coco_graph/pregel/_config.py +0 -0
  329. coco_graph/pregel/_draw.py +294 -0
  330. coco_graph/pregel/_executor.py +223 -0
  331. coco_graph/pregel/_io.py +174 -0
  332. coco_graph/pregel/_log.py +3 -0
  333. coco_graph/pregel/_loop.py +1988 -0
  334. coco_graph/pregel/_messages.py +461 -0
  335. coco_graph/pregel/_read.py +312 -0
  336. coco_graph/pregel/_retry.py +854 -0
  337. coco_graph/pregel/_runner.py +941 -0
  338. coco_graph/pregel/_tools.py +268 -0
  339. coco_graph/pregel/_utils.py +221 -0
  340. coco_graph/pregel/_validate.py +120 -0
  341. coco_graph/pregel/_write.py +192 -0
  342. coco_graph/pregel/debug.py +302 -0
  343. coco_graph/pregel/main.py +4364 -0
  344. coco_graph/pregel/protocol.py +288 -0
  345. coco_graph/pregel/types.py +38 -0
  346. coco_graph/py.typed +0 -0
  347. coco_graph/runtime.py +350 -0
  348. coco_graph/store/base/__init__.py +1322 -0
  349. coco_graph/store/base/batch.py +371 -0
  350. coco_graph/store/base/embed.py +436 -0
  351. coco_graph/store/base/py.typed +0 -0
  352. coco_graph/store/memory/__init__.py +592 -0
  353. coco_graph/store/memory/py.typed +0 -0
  354. coco_graph/store/postgres/__init__.py +4 -0
  355. coco_graph/store/postgres/aio.py +592 -0
  356. coco_graph/store/postgres/base.py +1480 -0
  357. coco_graph/store/postgres/py.typed +0 -0
  358. coco_graph/store/sqlite/__init__.py +4 -0
  359. coco_graph/store/sqlite/aio.py +632 -0
  360. coco_graph/store/sqlite/base.py +1514 -0
  361. coco_graph/stream/__init__.py +45 -0
  362. coco_graph/stream/_convert.py +32 -0
  363. coco_graph/stream/_mux.py +523 -0
  364. coco_graph/stream/_types.py +330 -0
  365. coco_graph/stream/run_stream.py +735 -0
  366. coco_graph/stream/stream_channel.py +341 -0
  367. coco_graph/stream/transformers.py +1039 -0
  368. coco_graph/types.py +1079 -0
  369. coco_graph/typing.py +48 -0
  370. coco_graph/utils/__init__.py +1 -0
  371. coco_graph/utils/config.py +4 -0
  372. coco_graph/utils/runnable.py +3 -0
  373. coco_graph/version.py +13 -0
  374. coco_graph/warnings.py +69 -0
  375. coco_openai/__init__.py +20 -0
  376. coco_openai/_compat.py +45 -0
  377. coco_openai/_version.py +3 -0
  378. coco_openai/chat_models/__init__.py +6 -0
  379. coco_openai/chat_models/_client_utils.py +684 -0
  380. coco_openai/chat_models/_compat.py +525 -0
  381. coco_openai/chat_models/azure.py +1227 -0
  382. coco_openai/chat_models/base.py +5654 -0
  383. coco_openai/chat_models/codex.py +557 -0
  384. coco_openai/chatgpt_oauth.py +1063 -0
  385. coco_openai/data/__init__.py +1 -0
  386. coco_openai/data/_profiles.py +1655 -0
  387. coco_openai/data/profile_augmentations.toml +127 -0
  388. coco_openai/embeddings/__init__.py +6 -0
  389. coco_openai/embeddings/azure.py +240 -0
  390. coco_openai/embeddings/base.py +820 -0
  391. coco_openai/llms/__init__.py +6 -0
  392. coco_openai/llms/azure.py +249 -0
  393. coco_openai/llms/base.py +919 -0
  394. coco_openai/middleware/__init__.py +11 -0
  395. coco_openai/middleware/openai_moderation.py +484 -0
  396. coco_openai/output_parsers/__init__.py +9 -0
  397. coco_openai/output_parsers/tools.py +9 -0
  398. coco_openai/py.typed +0 -0
  399. coco_openai/tools/__init__.py +5 -0
  400. coco_openai/tools/custom_tool.py +111 -0
@@ -0,0 +1,39 @@
1
+ """Chat result schema."""
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from coco_core.outputs.chat_generation import ChatGeneration
8
+
9
+
10
+ class ChatResult(BaseModel):
11
+ """Use to represent the result of a chat model call with a single prompt.
12
+
13
+ This container is used internally by some implementations of chat model, it will
14
+ eventually be mapped to a more general `LLMResult` object, and then projected into
15
+ an `AIMessage` object.
16
+
17
+ Coco users working with chat models will usually access information via
18
+ `AIMessage` (returned from runnable interfaces) or `LLMResult` (available via
19
+ callbacks). Please refer the `AIMessage` and `LLMResult` schema documentation for
20
+ more information.
21
+ """
22
+
23
+ generations: list[ChatGeneration]
24
+ """List of the chat generations.
25
+
26
+ Generations is a list to allow for multiple candidate generations for a single
27
+ input prompt.
28
+ """
29
+
30
+ llm_output: dict[str, Any] | None = None
31
+ """For arbitrary model provider-specific output.
32
+
33
+ This dictionary is a free-form dictionary that can contain any information that the
34
+ provider wants to return. It is not standardized and keys may vary by provider and
35
+ over time.
36
+
37
+ Users should generally avoid relying on this field and instead rely on accessing
38
+ relevant information from standardized fields present in `AIMessage`.
39
+ """
@@ -0,0 +1,80 @@
1
+ """Generation output schema."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Literal
6
+
7
+ from coco_core.load import Serializable
8
+ from coco_core.utils._merge import merge_dicts
9
+
10
+
11
+ class Generation(Serializable):
12
+ """A single text generation output.
13
+
14
+ Generation represents the response from an "old-fashioned" LLM (string-in,
15
+ string-out) that generates regular text (not chat messages).
16
+
17
+ This model is used internally by chat model and will eventually be mapped to a more
18
+ general `LLMResult` object, and then projected into an `AIMessage` object.
19
+
20
+ Coco users working with chat models will usually access information via
21
+ `AIMessage` (returned from runnable interfaces) or `LLMResult` (available via
22
+ callbacks). Please refer to `AIMessage` and `LLMResult` for more information.
23
+ """
24
+
25
+ text: str
26
+ """Generated text output."""
27
+
28
+ generation_info: dict[str, Any] | None = None
29
+ """Raw response from the provider.
30
+
31
+ May include things like the reason for finishing or token log probabilities.
32
+ """
33
+
34
+ type: Literal["Generation"] = "Generation"
35
+ """Type is used exclusively for serialization purposes.
36
+
37
+ Set to `'Generation'` for this class.
38
+ """
39
+
40
+ @classmethod
41
+ def is_lc_serializable(cls) -> bool:
42
+ """Return `True` as this class is serializable."""
43
+ return True
44
+
45
+ @classmethod
46
+ def get_lc_namespace(cls) -> list[str]:
47
+ """Get the namespace of the Coco object.
48
+
49
+ Returns:
50
+ `["coco", "schema", "output"]`
51
+ """
52
+ return ["coco", "schema", "output"]
53
+
54
+
55
+ class GenerationChunk(Generation):
56
+ """`GenerationChunk`, which can be concatenated with other `Generation` chunks."""
57
+
58
+ def __add__(self, other: GenerationChunk) -> GenerationChunk:
59
+ """Concatenate two `GenerationChunk` objects.
60
+
61
+ Args:
62
+ other: Another `GenerationChunk` to concatenate with.
63
+
64
+ Raises:
65
+ TypeError: If other is not a `GenerationChunk`.
66
+
67
+ Returns:
68
+ A new `GenerationChunk` concatenated from self and other.
69
+ """
70
+ if isinstance(other, GenerationChunk):
71
+ generation_info = merge_dicts(
72
+ self.generation_info or {},
73
+ other.generation_info or {},
74
+ )
75
+ return GenerationChunk(
76
+ text=self.text + other.text,
77
+ generation_info=generation_info or None,
78
+ )
79
+ msg = f"unsupported operand type(s) for +: '{type(self)}' and '{type(other)}'" # type: ignore[unreachable]
80
+ raise TypeError(msg)
@@ -0,0 +1,112 @@
1
+ """`LLMResult` class."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from copy import deepcopy
6
+ from typing import Any, Literal
7
+
8
+ from pydantic import BaseModel
9
+
10
+ from coco_core.outputs.chat_generation import ChatGeneration, ChatGenerationChunk
11
+ from coco_core.outputs.generation import Generation, GenerationChunk
12
+ from coco_core.outputs.run_info import RunInfo
13
+
14
+
15
+ class LLMResult(BaseModel):
16
+ """A container for results of an LLM call.
17
+
18
+ Both chat models and LLMs generate an `LLMResult` object. This object contains the
19
+ generated outputs and any additional information that the model provider wants to
20
+ return.
21
+ """
22
+
23
+ generations: list[
24
+ list[Generation | ChatGeneration | GenerationChunk | ChatGenerationChunk]
25
+ ]
26
+ """Generated outputs.
27
+
28
+ The first dimension of the list represents completions for different input prompts.
29
+
30
+ The second dimension of the list represents different candidate generations for a
31
+ given prompt.
32
+
33
+ - When returned from **an LLM**, the type is `list[list[Generation]]`.
34
+ - When returned from a **chat model**, the type is `list[list[ChatGeneration]]`.
35
+
36
+ `ChatGeneration` is a subclass of `Generation` that has a field for a structured
37
+ chat message.
38
+ """
39
+
40
+ llm_output: dict[str, Any] | None = None
41
+ """For arbitrary model provider-specific output.
42
+
43
+ This dictionary is a free-form dictionary that can contain any information that the
44
+ provider wants to return. It is not standardized and keys may vary by provider and
45
+ over time.
46
+
47
+ Users should generally avoid relying on this field and instead rely on accessing
48
+ relevant information from standardized fields present in AIMessage.
49
+ """
50
+
51
+ run: list[RunInfo] | None = None
52
+ """List of metadata info for model call for each input.
53
+
54
+ See `coco_core.outputs.run_info.RunInfo` for details.
55
+ """
56
+
57
+ type: Literal["LLMResult"] = "LLMResult"
58
+ """Type is used exclusively for serialization purposes."""
59
+
60
+ def flatten(self) -> list[LLMResult]:
61
+ """Flatten generations into a single list.
62
+
63
+ Unpack `list[list[Generation]] -> list[LLMResult]` where each returned
64
+ `LLMResult` contains only a single `Generation`. If token usage information is
65
+ available, it is kept only for the `LLMResult` corresponding to the top-choice
66
+ `Generation`, to avoid over-counting of token usage downstream.
67
+
68
+ Returns:
69
+ List of `LLMResult` objects where each returned `LLMResult` contains a
70
+ single `Generation`.
71
+ """
72
+ llm_results = []
73
+ for i, gen_list in enumerate(self.generations):
74
+ # Avoid double counting tokens in OpenAICallback
75
+ if i == 0:
76
+ llm_results.append(
77
+ LLMResult(
78
+ generations=[gen_list],
79
+ llm_output=self.llm_output,
80
+ )
81
+ )
82
+ else:
83
+ if self.llm_output is not None:
84
+ llm_output = deepcopy(self.llm_output)
85
+ llm_output["token_usage"] = {}
86
+ else:
87
+ llm_output = None
88
+ llm_results.append(
89
+ LLMResult(
90
+ generations=[gen_list],
91
+ llm_output=llm_output,
92
+ )
93
+ )
94
+ return llm_results
95
+
96
+ def __eq__(self, other: object) -> bool:
97
+ """Check for `LLMResult` equality by ignoring any metadata related to runs.
98
+
99
+ Args:
100
+ other: Another `LLMResult` object to compare against.
101
+
102
+ Returns:
103
+ `True` if the generations and `llm_output` are equal, `False` otherwise.
104
+ """
105
+ if not isinstance(other, LLMResult):
106
+ return NotImplemented
107
+ return (
108
+ self.generations == other.generations
109
+ and self.llm_output == other.llm_output
110
+ )
111
+
112
+ __hash__ = None # type: ignore[assignment]
@@ -0,0 +1,22 @@
1
+ """`RunInfo` class."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from uuid import UUID
6
+
7
+ from pydantic import BaseModel
8
+
9
+
10
+ class RunInfo(BaseModel):
11
+ """Class that contains metadata for a single execution of a chain or model.
12
+
13
+ Defined for backwards compatibility with older versions of `coco_core`.
14
+
15
+ !!! warning "This model will likely be deprecated in the future."
16
+
17
+ Users can acquire the `run_id` information from callbacks or via `run_id`
18
+ information present in the `astream_event` API (depending on the use case).
19
+ """
20
+
21
+ run_id: UUID
22
+ """A unique identifier for the model or chain run."""
@@ -0,0 +1,161 @@
1
+ """**Prompt values** for language model prompts.
2
+
3
+ Prompt values are used to represent different pieces of prompts. They can be used to
4
+ represent text, images, or chat message pieces.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from abc import ABC, abstractmethod
10
+ from collections.abc import Sequence
11
+ from typing import Any, Literal, cast
12
+
13
+ from typing_extensions import TypedDict
14
+
15
+ from coco_core.load.serializable import Serializable
16
+ from coco_core.messages import (
17
+ AnyMessage,
18
+ BaseMessage,
19
+ HumanMessage,
20
+ get_buffer_string,
21
+ )
22
+
23
+
24
+ class PromptValue(Serializable, ABC):
25
+ """Base abstract class for inputs to any language model.
26
+
27
+ `PromptValues` can be converted to both LLM (pure text-generation) inputs and
28
+ chat model inputs.
29
+ """
30
+
31
+ @classmethod
32
+ def is_lc_serializable(cls) -> bool:
33
+ """Return `True` as this class is serializable."""
34
+ return True
35
+
36
+ @classmethod
37
+ def get_lc_namespace(cls) -> list[str]:
38
+ """Get the namespace of the Coco object.
39
+
40
+ Returns:
41
+ `["coco", "schema", "prompt"]`
42
+ """
43
+ return ["coco", "schema", "prompt"]
44
+
45
+ @abstractmethod
46
+ def to_string(self) -> str:
47
+ """Return prompt value as string."""
48
+
49
+ @abstractmethod
50
+ def to_messages(self) -> list[BaseMessage]:
51
+ """Return prompt as a list of messages."""
52
+
53
+
54
+ class StringPromptValue(PromptValue):
55
+ """String prompt value."""
56
+
57
+ text: str
58
+ """Prompt text."""
59
+
60
+ type: Literal["StringPromptValue"] = "StringPromptValue"
61
+
62
+ @classmethod
63
+ def get_lc_namespace(cls) -> list[str]:
64
+ """Get the namespace of the Coco object.
65
+
66
+ Returns:
67
+ `["coco", "prompts", "base"]`
68
+ """
69
+ return ["coco", "prompts", "base"]
70
+
71
+ def to_string(self) -> str:
72
+ """Return prompt as string."""
73
+ return self.text
74
+
75
+ def to_messages(self) -> list[BaseMessage]:
76
+ """Return prompt as messages."""
77
+ return [HumanMessage(content=self.text)]
78
+
79
+
80
+ class ChatPromptValue(PromptValue):
81
+ """Chat prompt value.
82
+
83
+ A type of a prompt value that is built from messages.
84
+ """
85
+
86
+ messages: Sequence[BaseMessage]
87
+ """List of messages."""
88
+
89
+ def to_string(self) -> str:
90
+ """Return prompt as string."""
91
+ return get_buffer_string(self.messages)
92
+
93
+ def to_messages(self) -> list[BaseMessage]:
94
+ """Return prompt as a list of messages."""
95
+ return list(self.messages)
96
+
97
+ @classmethod
98
+ def get_lc_namespace(cls) -> list[str]:
99
+ """Get the namespace of the Coco object.
100
+
101
+ Returns:
102
+ `["coco", "prompts", "chat"]`
103
+ """
104
+ return ["coco", "prompts", "chat"]
105
+
106
+
107
+ class ImageURL(TypedDict, total=False):
108
+ """Image URL for multimodal model inputs (OpenAI format).
109
+
110
+ Represents the inner `image_url` object in OpenAI's Chat Completion API format. This
111
+ is used by `ImagePromptTemplate` and `ChatPromptTemplate`.
112
+
113
+ See Also:
114
+ `ImageContentBlock`: Coco's provider-agnostic image format used in message
115
+ content blocks. Use `ImageContentBlock` when working with the standardized
116
+ message format across different providers.
117
+
118
+ Note:
119
+ The `detail` field values are not validated locally. Invalid values
120
+ will be rejected by the downstream API, allowing new valid values to
121
+ be used without requiring a Coco update.
122
+ """
123
+
124
+ detail: Literal["auto", "low", "high"]
125
+ """Specifies the detail level of the image.
126
+
127
+ Defaults to ``'auto'`` if not specified. Higher detail levels consume
128
+ more tokens but provide better image understanding.
129
+ """
130
+
131
+ url: str
132
+ """URL of the image or base64-encoded image data."""
133
+
134
+
135
+ class ImagePromptValue(PromptValue):
136
+ """Image prompt value."""
137
+
138
+ image_url: ImageURL
139
+ """Image URL."""
140
+
141
+ type: Literal["ImagePromptValue"] = "ImagePromptValue"
142
+
143
+ def to_string(self) -> str:
144
+ """Return prompt (image URL) as string."""
145
+ return self.image_url.get("url", "")
146
+
147
+ def to_messages(self) -> list[BaseMessage]:
148
+ """Return prompt (image URL) as messages."""
149
+ return [HumanMessage(content=[cast("dict[str, Any]", self.image_url)])]
150
+
151
+
152
+ class ChatPromptValueConcrete(ChatPromptValue):
153
+ """Chat prompt value which explicitly lists out the message types it accepts.
154
+
155
+ For use in external schemas.
156
+ """
157
+
158
+ messages: Sequence[AnyMessage]
159
+ """Sequence of messages."""
160
+
161
+ type: Literal["ChatPromptValueConcrete"] = "ChatPromptValueConcrete"
@@ -0,0 +1,101 @@
1
+ """A prompt is the input to the model.
2
+
3
+ Prompt is often constructed from multiple components and prompt values. Prompt classes
4
+ and functions make constructing and working with prompts easy.
5
+ """
6
+
7
+ from typing import TYPE_CHECKING
8
+
9
+ from coco_core._import_utils import import_attr
10
+
11
+ if TYPE_CHECKING:
12
+ from coco_core.prompts.base import (
13
+ BasePromptTemplate,
14
+ aformat_document,
15
+ format_document,
16
+ )
17
+ from coco_core.prompts.chat import (
18
+ AIMessagePromptTemplate,
19
+ BaseChatPromptTemplate,
20
+ ChatMessagePromptTemplate,
21
+ ChatPromptTemplate,
22
+ HumanMessagePromptTemplate,
23
+ MessagesPlaceholder,
24
+ SystemMessagePromptTemplate,
25
+ )
26
+ from coco_core.prompts.dict import DictPromptTemplate
27
+ from coco_core.prompts.few_shot import (
28
+ FewShotChatMessagePromptTemplate,
29
+ FewShotPromptTemplate,
30
+ )
31
+ from coco_core.prompts.few_shot_with_templates import (
32
+ FewShotPromptWithTemplates,
33
+ )
34
+ from coco_core.prompts.loading import load_prompt
35
+ from coco_core.prompts.prompt import PromptTemplate
36
+ from coco_core.prompts.string import (
37
+ StringPromptTemplate,
38
+ check_valid_template,
39
+ get_template_variables,
40
+ jinja2_formatter,
41
+ validate_jinja2,
42
+ )
43
+
44
+ __all__ = (
45
+ "AIMessagePromptTemplate",
46
+ "BaseChatPromptTemplate",
47
+ "BasePromptTemplate",
48
+ "ChatMessagePromptTemplate",
49
+ "ChatPromptTemplate",
50
+ "DictPromptTemplate",
51
+ "FewShotChatMessagePromptTemplate",
52
+ "FewShotPromptTemplate",
53
+ "FewShotPromptWithTemplates",
54
+ "HumanMessagePromptTemplate",
55
+ "MessagesPlaceholder",
56
+ "PromptTemplate",
57
+ "StringPromptTemplate",
58
+ "SystemMessagePromptTemplate",
59
+ "aformat_document",
60
+ "check_valid_template",
61
+ "format_document",
62
+ "get_template_variables",
63
+ "jinja2_formatter",
64
+ "load_prompt",
65
+ "validate_jinja2",
66
+ )
67
+
68
+ _dynamic_imports = {
69
+ "BasePromptTemplate": "base",
70
+ "format_document": "base",
71
+ "aformat_document": "base",
72
+ "AIMessagePromptTemplate": "chat",
73
+ "BaseChatPromptTemplate": "chat",
74
+ "ChatMessagePromptTemplate": "chat",
75
+ "ChatPromptTemplate": "chat",
76
+ "DictPromptTemplate": "dict",
77
+ "HumanMessagePromptTemplate": "chat",
78
+ "MessagesPlaceholder": "chat",
79
+ "SystemMessagePromptTemplate": "chat",
80
+ "FewShotChatMessagePromptTemplate": "few_shot",
81
+ "FewShotPromptTemplate": "few_shot",
82
+ "FewShotPromptWithTemplates": "few_shot_with_templates",
83
+ "load_prompt": "loading",
84
+ "PromptTemplate": "prompt",
85
+ "StringPromptTemplate": "string",
86
+ "check_valid_template": "string",
87
+ "get_template_variables": "string",
88
+ "jinja2_formatter": "string",
89
+ "validate_jinja2": "string",
90
+ }
91
+
92
+
93
+ def __getattr__(attr_name: str) -> object:
94
+ module_name = _dynamic_imports.get(attr_name)
95
+ result = import_attr(attr_name, module_name, __spec__.parent)
96
+ globals()[attr_name] = result
97
+ return result
98
+
99
+
100
+ def __dir__() -> list[str]:
101
+ return list(__all__)